TensorFlow:如何重用Adam优化器变量?

时间:2017-05-02 19:11:29

标签: python tensorflow conv-neural-network

在最近升级我的TensorFlow版本后,我遇到了这个错误,我无法解决:

Traceback (most recent call last):
  File "cross_train.py", line 177, in <module>
    train_network(use_gpu=True)
  File "cross_train.py", line 46, in train_network
    with tf.control_dependencies([s_opt.apply_gradients(s_grads), s_increment_step]):

...

ValueError: Variable image-conv1-layer/weights/Adam/ already exists, disallowed. Did you mean to set reuse=True in VarScope? Originally defined at:

  File "cross_train.py", line 34, in train_network
    with tf.control_dependencies([e_opt.apply_gradients(e_grads), e_increment_step]):
  File "cross_train.py", line 177, in <module>
    train_network(use_gpu=True)

我的模型架构是3个不同的卷积神经网络分支:M,E,S。在训练中,我试图交替步骤,我通过M&amp; S传播样本。 E(嵌入点的点积距离)并与Adam一起更新;然后通过M&amp; amp; S并与亚当一起更新;并重复。所以基本上M是固定的(每一步都得到更新),但E和S分支交替更新。

因此我创建了两个AdamOptimizer实例(e_opts_opt),但是我得到了错误,因为当我尝试更新S分支时,权重变量M-conv1/weights/Adam/已经存在。 / p>

在更新我的TensorFlow版本之前,这并没有发生在我身上。我知道如何在TensorFlow中设置变量的重用,例如:

with tf.variable_scope(name, values=[input_to_layer]) as scope:
    try:
        weights = tf.get_variable("weights", [height, width, input_to_layer.get_shape()[3], channels], initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32))
        bias = tf.get_variable("bias", [channels], initializer=tf.constant_initializer(0.0, dtype=tf.float32))
    except ValueError:
        scope.reuse_variables()
        weights = tf.get_variable("weights", [height, width, input_to_layer.get_shape()[3], channels], initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32))
        bias = tf.get_variable("bias", [channels], initializer=tf.constant_initializer(0.0, dtype=tf.float32))

但我不确定我是否可以为亚当做同样的事情。有任何想法吗?非常感谢帮助。

1 个答案:

答案 0 :(得分:2)

原来我不需要实例化两个不同的Adam优化器。我刚创建了一个实例,没有名称冲突或尝试共享变量的问题。无论正在更新哪些网络分支,我都使用相同的优化器:

    e_grads = opt.compute_gradients(e_loss)
with tf.control_dependencies([opt.apply_gradients(e_grads), e_increment_step]):
    e_train = tf.no_op(name='english_train') 

和...

    s_grads = opt.compute_gradients(s_loss)
with tf.control_dependencies([opt.apply_gradients(s_grads), s_increment_step]):
    s_train = tf.no_op(name='spanish_train')

有趣的是,对于旧版本的Tensorflow,即使M分支名称冲突,使用两个Adam实例也没有问题......