在 Tensorflow 中使用 Adam 优化器 TWICE



我正在尝试两次使用 adam optimizer 来最小化代码中的不同张量,我已经尝试使用 GradientDescentOptimizer 两次,这很好,但是在使用 adam 优化器两次时我收到错误消息,我在 tensorflowVariable RNNLM/RNNLM/embedding/Adam_2/上问了另一个问题不存在,但该解决方案在这里不起作用。 我也查找了页面:https://github.com/tensorflow/tensorflow/issues/6220,但我仍然不明白。

这是我的代码,我收到错误消息:ValueError:变量 NN/NN/W/Adam_2/不存在,或者不是用 tf.get_variable(( 创建的。你的意思是在 VarScope 中设置 reuse=None 吗?

然后我尝试了 tensorflowVariable RNNLM/RNNLM/embedding/Adam_2/的解决方案不存在,但不起作用

import tensorflow as tf
def main():
optimizer = tf.train.GradientDescentOptimizer(0.005)
# optimizer = tf.train.AdamOptimizer(0.005)
with tf.variable_scope('NN') as scope:
W = tf.get_variable(name='W', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1]))
X = tf.get_variable(name='X', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1]))
y_ = tf.get_variable(name='y_', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1]))
y1 = W + X
loss_1 = tf.reduce_mean(tf.abs(y_ - y1))

# train_op1 = tf.train.GradientDescentOptimizer(0.005).minimize(loss_1)
train_op1 = tf.train.AdamOptimizer(0.005).minimize(loss_1)
# with tf.variable_scope('opt'):
#     train_op1 = tf.train.AdamOptimizer(0.005).minimize(loss_1)
##############################################################################################
scope.reuse_variables()
W2 = tf.get_variable(name='W', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1]))
X2 = tf.get_variable(name='X', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1]))
b = tf.Variable(tf.random_normal(shape=[5, 1], dtype=tf.float32))
y2 = W2 + X2 + b
loss_2 = tf.reduce_mean(tf.abs(y_ - y2))
# train_op2 = tf.train.GradientDescentOptimizer(0.005).minimize(loss_2)
train_op2 = tf.train.AdamOptimizer(0.005).minimize(loss_2)
# with tf.variable_scope('opt'):
#     train_op2 = tf.train.AdamOptimizer(0.005).minimize(loss_2)

if __name__ == '__main__':
main()

解决此问题的最简单方法是将第二个优化器放在不同的范围内。这样命名就不会引起任何混淆。

如果你绝对必须在同一个范围内做, 确保及时定义所有变量。 我必须对它为什么这样工作做更多的研究,但优化器设置在较低级别的图形中被锁定,不再动态访问。

最小工作示例:

import tensorflow as tf
def main():
optimizer = tf.train.GradientDescentOptimizer(0.005)
# optimizer = tf.train.AdamOptimizer(0.005)
with tf.variable_scope('NN') as scope:
assert scope.reuse == False
W2 = tf.get_variable(name='W', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1]))
X2 = tf.get_variable(name='X', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1]))
y2_ = tf.get_variable(name='y_', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1]))
b = tf.get_variable(name='b', initializer=tf.random_normal(shape=[5, 1], dtype=tf.float32))
y2 = W2 + X2 + b
loss_2 = tf.reduce_mean(tf.abs(y2_ - y2))
# train_op2 = tf.train.GradientDescentOptimizer(0.005).minimize(loss_2)
train_op2 = tf.train.AdamOptimizer(0.005).minimize(loss_2)

# with tf.variable_scope('opt'):
#     train_op1 = tf.train.AdamOptimizer(0.005).minimize(loss_1)
##############################################################################################
with tf.variable_scope('NN', reuse = True) as scope:

W = tf.get_variable(name='W', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1]))
X = tf.get_variable(name='X', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1]))
y_ = tf.get_variable(name='y_', initializer=tf.random_uniform(dtype=tf.float32, shape=[5, 1]))
b = tf.get_variable(name='b', initializer=tf.random_normal(shape=[5, 1], dtype=tf.float32))
y1 = W + X
loss_1 = tf.reduce_mean(tf.abs(y_ - y1))

# train_op1 = tf.train.GradientDescentOptimizer(0.005).minimize(loss_1)
train_op1 = tf.train.AdamOptimizer(0.005).minimize(loss_1)
# with tf.variable_scope('opt'):
#     train_op2 = tf.train.AdamOptimizer(0.005).minimize(loss_2)

if __name__ == '__main__':
main()

最新更新