Python 如何获得tensorflow中卷积层的值?

Python 如何获得tensorflow中卷积层的值?,python,tensorflow,python-3.6,Python,Tensorflow,Python 3.6,下面是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, unit

下面是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

无论您的层是卷积层还是密集层,也不管您是否完成了培训,您都可以通过
会话
接口访问变量的值(初始化后)

考虑以下示例:

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.]
将tensorflow导入为tf
def两层感知器(x):
使用x.graph.as_default():
使用tf.name_范围('fc'):
fc=tf.layers.density(
输入=x,单位=2,
kernel_initializer=tf.initializers.truncated_normal)
使用tf.name\u范围('logits'):
logits=tf.layers.densed(
输入=fc,单位=2,
kernel_initializer=tf.initializers.truncated_normal)
返回登录
x=tf.placeholder(tf.float32,shape=(无,2))
logits=两层感知机(x)
#定义损失、列车运行和开始培训
使用tf.Session()作为sess:
sess.run(tf.global\u variables\u initializer())
#在这里训练
# ...
#sess.run(列车运行,进站指令=…)
# ...
#培训结束后,请执行以下操作:
可训练变量=tf.可训练变量()
变量=sess.run(可培训变量)
vars_和_name=[(val,var.name)表示val,zip中的var(vars_vals,trainable_vars)]
对于val,vars_和_名称中的名称:
打印(名称、类型(val)、'\n',val)
#密集/内核:0
# [[ 0.23275916  0.7079906 ]
# [-1.0366516   1.9141678 ]]
#密度/偏差:0
# [0. 0.]
#密集_1/内核:0
# [[-0.55649596 -1.4910121 ]
# [ 0.54917735  0.39449152]]
#密集_1/偏差:0
# [0. 0.]

如果您希望访问网络中的特定变量,您可以通过
tf将它们添加到集合中。将\u添加到\u集合()
,然后通过
tf.get\u集合()
访问它们,或者您可以从所有变量列表中按变量名筛选(例如
[v如果v.name中的“conv”表示tf中的v.可训练的\u变量()])

我应该在培训完成后,还是在培训循环中培训时,应用以下代码: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”存储对变量的引用,当您将新变量分配给该引用时,您将失去对以前变量的访问权限。如果不存储引用,只有当你把它们添加到集合中时,才可以访问它们,或者根据我在回答中提到的所有可训练变量指定名称和“过滤”变量。谢谢你的时间和解释。如果回答了你的问题,请考虑按下接受这个答案按钮。