Python tensorflow中的多GPU和AdamOptimizer

Python tensorflow中的多GPU和AdamOptimizer,python,tensorflow,Python,Tensorflow,我正在用多个GPU练习tensorflow。 平均每个gpu计算的梯度。但是,当我的优化器是AdamOptimizer时,它不起作用。当我使用梯度下降时,它总是有效的 以下是代码: G = tf.Graph() with G.as_default(), tf.device('/cpu:0'): full_data_dims = [batch_size*num_gpus] + data_dims data = tf.placeholder(dtype=tf.float32, sha

我正在用多个GPU练习tensorflow。 平均每个gpu计算的梯度。但是,当我的优化器是
AdamOptimizer
时,它不起作用。当我使用
梯度下降
时,它总是有效的

以下是代码:

G = tf.Graph()
with G.as_default(), tf.device('/cpu:0'):
    full_data_dims = [batch_size*num_gpus] + data_dims
    data = tf.placeholder(dtype=tf.float32, shape=full_data_dims, name='data')
    labels = tf.placeholder(dtype=tf.int32, shape=[batch_size*num_gpus], name='labels')

    split_data = tf.split(data, num_gpus, axis=0)
    split_labels = tf.split(labels, num_gpus, axis=0)

    optimizer = tf.train.AdamOptimizer(learning_rate)

    replica_grads = []
    for i in range(num_gpus):
        with tf.name_scope('tower_{}'.format(i)), tf.device('/gpu:{}'.format(i)):

            model = build_model(split_data[i], split_labels[i])
            loss = model['loss']
            grads = optimizer.compute_gradients(loss)
            replica_grads.append(grads)
            tf.get_variable_scope().reuse_variables()


    tf.get_variable_scope().reuse_variables()
    average_grad = average_gradients_layer(replica_grads)
    grad_step = optimizer.apply_gradients(average_grad)
    train_step = tf.group(grad_step)
    init = tf.global_variables_initializer()

# Part3
config_proto = tf.ConfigProto(allow_soft_placement=True)
sess = tf.Session(graph=G, config=config_proto)
sess.run(init)
tf.train.start_queue_runners(sess=sess)
with sess.as_default():
    for step in range(num_steps):
        data_batch, label_batch = batch_maker(X_ok, y_ok, X_ng, y_ng, batch_size*num_gpus)
        results = sess.run([train_step, loss], feed_dict={data : data_batch, labels : label_batch})
        if step % flag == 0:
            print('\n')
            print('step : %s loss : %s' % (step, results[1]))
        sys.stdout.write('\r'+str(step)+'/'+str(num_steps))
以下是我的错误消息:

 32     tf.get_variable_scope().reuse_variables()
 33     average_grad = average_gradients_layer(replica_grads)
---> 34     grad_step = optimizer.apply_gradients(average_grad)
 35     train_step = tf.group(grad_step)
 36     init = tf.global_variables_initializer()

Variable conv1_1/weight/Adam/ does not exist, or was not created with 
tf.get_variable(). Did you mean to set reuse=None in VarScope?

似乎
AdamOptimizer
在我的变量名之后寻找额外的
'/Adam/'
。有人能修复它吗?

我不知道是否有bug,但问题是“有人能修复它吗?”。对


用“with tf.variable_scope”上下文管理器封装gpu循环(而不是apply_gradients代码),这样一旦gpu循环退出,该作用域就不再被重用。

能否为错误添加完整的堆栈跟踪?这看起来可能是一个bug(或者我们可能需要更好的文档),但是现在还不清楚是什么调用
get\u variable()
导致了这个问题。。。。