2017-04-07 6 views
2

複数のGPUでテンソルフローを実践しています。 各GPUによって計算された平均勾配。しかし、私のオプティマイザがAdamOptimizerの場合は動作しません。 GradientDescentを使用しているときは常に動作します。テンソルフローの複数のgpusとAdamOptimizer

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は私の変数名の後に追加された '/アダム/' 求めているようだ:

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)) 

はここに私のエラーメッセージです:ここで

はコードです。誰でもそれを修正できますか?

+0

エラーの完全なスタックトレースを追加できますか?これはバグかもしれない(あるいは、より良いドキュメンテーションが必要かもしれない)ようですが、 'get_variable()'がどのような呼び出しによって問題を引き起こしているかはすぐには分かりません.... – mrry

答えて

0

バグがあるかどうかわかりませんが、問題は「誰でも解決できますか」でした。はい。

"with tf.variable_scope"コンテキストマネージャを使用してgpuループ(ただしapply_gradientsコードではない)をカプセル化し、gpuループが終了するとスコープが再利用されなくなります。

関連する問題