我正在尝试了解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()
电话有关,但我不确定。
任何帮助都非常感激。
答案 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将起作用。