在张量流中获取卷积训练变量的句柄

时间:2018-01-29 00:39:52

标签: tensorflow convolution

我知道如何选择我创建的哪个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)

1 个答案:

答案 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() 

这不是一个漂亮的解决方案。坏张力流,坏狗!您不应该猜测或控制名称。应该有一种方法可以明确地访问调用提供的变量。

给这篇文章提示:How to access kernel variables in tf.layers.conv2d?