我知道如何选择我创建的哪个tf.Variables受到训练:我用var_list = []调用优化器。 当我自己不实际创建变量时,我的问题就出现了,因此无法将它们明确地传递给优化器。 正在为我创建要优化的变量,具有卷积的便利功能:它将创建权重和偏差变量,然后将这些变量添加到trainable_variables()列表中。
x = tf.layers.conv2d(X, filters=64, kernel_size=4, strides=2, padding='same', activation=activation)
然而,我正在编程GAN,所以我需要在训练两组变量之间交替,一组用于生成器,一组用于鉴别器。因此,我不想仅仅训练tf.trainable_variables()中的整个变量集。
我想使用便捷函数来设置模型,然后获取模型中变量的句柄,这样我就可以选择将哪些传递给优化器。
以下是生成器代码的示例。鉴别者是分析性的。
with tf.variable_scope("encoder", reuse=None):
X = tf.reshape(X_in, shape=[-1, 28, 28, 1])
x = tf.layers.conv2d(X, filters=64, kernel_size=4, strides=2, padding='same', activation=activation)
x = tf.nn.dropout(x, keep_prob)
x = tf.layers.conv2d(x, filters=64, kernel_size=4, strides=2, padding='same', activation=activation)
x = tf.nn.dropout(x, keep_prob)
x = tf.layers.conv2d(x, filters=64, kernel_size=4, strides=1, padding='same', activation=activation)
x = tf.nn.dropout(x, keep_prob)
x = tf.contrib.layers.flatten(x)
答案 0 :(得分:1)
我想我刚刚找到了答案。显然这里的诀窍是使用" name"和"重用"对conv2d的调用的属性。如果你这样做,那么变量的名称只是/ kernel和/ bias。
后续问题是tf会对这些进行编号,所以如果你重新运行algortithm(例如在ipython或jupyter笔记本中),你将拥有多个同名的变量。因此,您必须调用“重复使用=真正的'所以他们得到默认名称:0
conv_layer = tf.layers.conv2d(..., name='YOUR_NAME', reuse=True...)
然后按以下方式访问命名变量:
gr = tf.get_default_graph()
conv1_kernel_val = gr.get_tensor_by_name('YOUR_NAME/kernel:0').eval()
conv1_bias_val = gr.get_tensor_by_name('YOUR_NAME/bias:0').eval()
这不是一个漂亮的解决方案。坏张力流,坏狗!您不应该猜测或控制名称。应该有一种方法可以明确地访问调用提供的变量。