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



我知道如何选择哪个tf。我创建的变量需要经过训练:我用 var_list=[] 调用优化器。 当我实际上没有自己创建变量时,我的问题就出现了,因此无法将它们显式传递给优化器。 正在为我创建要优化的变量,其中包含卷积的便利函数:它将创建权重和偏差变量,然后将其添加到 trainable_variables(( 列表中。

 x = tf.layers.conv2d(X, filters=64, kernel_size=4, strides=2, padding='same', activation=activation)

但是我正在编写一个 GAN,所以我需要在训练两组变量之间交替,一组用于生成器,另一组用于鉴别器。 因此,我不想只在 tf.trainable_variables(( 中训练整组变量。

我想使用便利函数来设置模型,然后获取模型中变量的句柄,以便我可以选择传递给优化器的变量。

下面是生成器代码的示例。 鉴别器是Analgous。

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)
我想

我刚刚找到了答案。 显然,这里的诀窍是使用调用 Conv2D 的"名称"和"重用"属性。如果你这样做,那么变量的名称只是/kernel 和/bias。

后续问题是 tf 会给这些变量编号,所以如果你重新运行 algortithm(例如在 ipython 或 jupyter notebooks 中(,你将有多个同名变量。 所以你必须调用'reuse=True',这样他们才能得到默认名称: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() 

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

这篇文章的提示:如何在tf.layers.conv2d中访问内核变量?

最新更新