【问题标题】:How to get the values of convolutional layes in tensorflow?如何获取张量流中卷积层的值?
【发布时间】:2019-03-09 04:42:27
【问题描述】:

我有下面来自 Github 教程的代码,我想在训练完成后访问每个“x 层”的值并将其保存到 numpy 数组中。

def decoder(sampled_z, keep_prob):
    with tf.variable_scope("decoder", reuse=None):
        x = tf.layers.dense(sampled_z, units=inputs_decoder, activation=lrelu)
        x = tf.layers.dense(x, units=inputs_decoder * 2 + 1, activation=lrelu)
        x = tf.reshape(x, reshaped_dim)
        x = tf.layers.conv2d_transpose(x, filters=64, kernel_size=4, strides=2, 
                                       padding='same', activation=tf.nn.relu)
        x = tf.nn.dropout(x, keep_prob)
        x = tf.layers.conv2d_transpose(x, filters=64, kernel_size=4, strides=1, 
                                       padding='same', activation=tf.nn.relu)
        x = tf.nn.dropout(x, keep_prob)
        x = tf.layers.conv2d_transpose(x, filters=64, kernel_size=4, strides=1, 
                                       padding='same', activation=tf.nn.relu)
        x = tf.contrib.layers.flatten(x)
        x = tf.layers.dense(x, units=28*28, activation=tf.nn.sigmoid)
        img = tf.reshape(x, shape=[-1, 28, 28])
    return img

【问题讨论】:

    标签: python tensorflow python-3.6


    【解决方案1】:

    无论你有卷积层还是密集层,也不管你是否完成了训练,你都可以通过session 接口访问你的变量值(一旦你初始化了它们)。

    考虑以下示例:

    import tensorflow as tf
    
    def two_layer_perceptron(x):
        with x.graph.as_default():
            with tf.name_scope('fc'):
                fc = tf.layers.dense(
                         inputs=x, units=2,
                         kernel_initializer=tf.initializers.truncated_normal)
            with tf.name_scope('logits'):
                logits = tf.layers.dense(
                             inputs=fc, units=2,
                             kernel_initializer=tf.initializers.truncated_normal)
        return logits
    
    x = tf.placeholder(tf.float32, shape=(None, 2))
    logits = two_layer_perceptron(x)
    
    # define loss, train operation and start training
    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        # train here
        # ...
        # sess.run(train_op, feed_dict=...)
        # ...
        # when training is finished, do:
        trainable_vars = tf.trainable_variables()
        vars_vals = sess.run(trainable_vars)
        vars_and_names = [(val, var.name) for val, var in zip(vars_vals, trainable_vars)]
    
    
    for val, name in vars_and_names:
        print(name, type(val), '\n', val)
    
    # dense/kernel:0 <class 'numpy.ndarray'> 
    # [[ 0.23275916  0.7079906 ]
    # [-1.0366516   1.9141678 ]]
    # dense/bias:0 <class 'numpy.ndarray'> 
    # [0. 0.]
    # dense_1/kernel:0 <class 'numpy.ndarray'> 
    # [[-0.55649596 -1.4910121 ]
    # [ 0.54917735  0.39449152]]
    # dense_1/bias:0 <class 'numpy.ndarray'> 
    # [0. 0.]
    

    如果您想访问网络中的特定变量,您可以通过tf.add_to_collection() 将它们添加到集合中,然后通过tf.get_collection() 访问它们,或者您可以只从所有变量列表中按变量名称过滤(例如[v if 'conv' in v.name for v in tf.trainable_variables()] )

    【讨论】:

    • 我应该应用这个代码: trainable_vars = tf.trainable_variables() vars_vals = sess.run(trainable_vars) vars_and_names = [(val, var.name) for val, var in zip(vars_vals, trainable_vars) ] 训练完成后,或者当我在训练循环中训练时。此外,我的示例中的所有层都具有相同的名称“x”,如何单独访问每一层。
    • 1.您可以在想要查看值时应用此代码 - 在训练期间或训练完成后。 2. 每个“x”存储一个对变量的引用,当您为该引用分配一个新变量时,您将失去对先前变量的访问权限。在不存储引用的情况下,只有将它们添加到集合中或通过分配名称并从所有可训练变量中“过滤”您需要的变量时,您才能访问它们,正如我在回答中提到的那样。
    • 感谢您的时间和解释
    • 如果回答了您的问题,请考虑按下接受此答案按钮。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2018-05-14
    • 2017-09-12
    相关资源
    最近更新 更多