无法访问TensorFlow Adam优化器命名空间

时间:2017-06-08 16:19:05

标签: machine-learning tensorflow convolution

我正在尝试了解GAN,我正在研究the example here

使用Adam优化器的下面代码给出了错误

  

“ValueError:变量d_w1 / Adam /不存在,或者不是用tf.get_variable()创建的。你是不是想在VarScope中设置reuse = None?”

我正在使用TF 1.1.0

d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Dx, labels=tf.fill([batch_size, 1], 0.9)))
d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Dg, labels=tf.zeros_like(Dg)))
d_loss = d_loss_real + d_loss_fake

tvars = tf.trainable_variables()

d_vars = [var for var in tvars if 'd_' in var.name]
g_vars = [var for var in tvars if 'g_' in var.name]



# Train the discriminator
# Increasing from 0.001 in GitHub version
with tf.variable_scope(tf.get_variable_scope(), reuse=False) as scope:

    # Next, we specify our two optimizers. In today’s era of deep learning, Adam seems to be the
    # best SGD optimizer as it utilizes adaptive learning rates and momentum. 
    # We call Adam's minimize function and also specify the variables that we want it to update.
    d_trainer_real = tf.train.AdamOptimizer(0.0001).minimize(d_loss_real, var_list=d_vars)
    d_trainer_fake = tf.train.AdamOptimizer(0.0001).minimize(d_loss_fake, var_list=d_vars)

我认为Adam优化器将变量放入其自己的命名空间中,但由于某种原因它们未被初始化。我稍后会在代码中调用global_variables_initializer,这可以在github页面上看到。我正在查看文档,我认为这可能与我必须在那里进行某种reuse_variables()电话有关,但我不确定。

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:1)

您的ValueError是由variable_scope.reuse == True中的新变量引起的。

当您调用Adam的最小化函数时,Adam会创建变量,以便在图表中保存每个可训练变量的动量。

实际上,代码" reuse = False"不按预期工作。一旦将重置状态设置为True,重用状态就不会永远变回False,并且重用状态将由其所有子范围继承。

with tf.variable_scope(tf.get_variable_scope(), reuse=False) as scope:
    assert tf.get_variable_scope().reuse == True

我猜你在邮政编码之前已经将重用设置为True,因此默认的variable_scope.reuse == True。然后为Adam创建一个新的variable_scope,但是,新范围将继承默认范围的重用状态。然后,Adam在状态重用== True下创建变量,这会引发错误。

解决方案是在设置variable_scope.reuse = True时在图形的默认范围下添加子范围,然后默认scope.reuse仍为False,并且Adam.minimize将起作用。