无法访问 TensorFlow Adam 优化器命名空间
Can't access TensorFlow Adam optimizer namespace
我正在努力学习 GAN,并且正在学习 the example here。
下面使用 Adam 优化器的代码给出了错误
"ValueError: Variable d_w1/Adam/ does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?"
我正在使用 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()
调用有关,但我不确定。
非常感谢任何帮助。
您的 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
我猜你在 post 代码之前的某处将 reuse 设置为 True,因此默认为 variable_scope.reuse==True。然后你为 Adam 创建一个新的 variable_scope,但是,新的范围将继承默认范围的重用状态。然后,Adam 在状态 reuse==True 下创建变量,这会引发错误。
解决方法是在设置variable_scope.reuse=True时在图的默认范围下添加一个子范围,那么默认的scope.reuse仍然是False,Adam.minimize就可以了。
我正在努力学习 GAN,并且正在学习 the example here。
下面使用 Adam 优化器的代码给出了错误
"ValueError: Variable d_w1/Adam/ does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?"
我正在使用 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()
调用有关,但我不确定。
非常感谢任何帮助。
您的 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
我猜你在 post 代码之前的某处将 reuse 设置为 True,因此默认为 variable_scope.reuse==True。然后你为 Adam 创建一个新的 variable_scope,但是,新的范围将继承默认范围的重用状态。然后,Adam 在状态 reuse==True 下创建变量,这会引发错误。
解决方法是在设置variable_scope.reuse=True时在图的默认范围下添加一个子范围,那么默认的scope.reuse仍然是False,Adam.minimize就可以了。