2017-04-07 1 views
2

Ich übe Tensorflow mit mehreren Gpus. Mittelungsgradienten, die von jedem GPU berechnet werden. Es funktioniert jedoch nicht, wenn mein Optimierer AdamOptimizer ist. Es funktioniert immer, wenn ich GradientDescent verwende.mehrere Gpus und AdamOptimizer in Tensorflow

Hier Code:

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

Hier meine Fehlermeldung lautet:

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? 

Es scheint AdamOptimizer zusätzlichen sucht '/ Adam /' nach meinen Variablennamen. Kann jemand es reparieren?

+0

Können Sie bitte die vollständige Stack-Trace für den Fehler hinzufügen? Es sieht so aus, als wäre es ein Fehler (oder wir brauchen vielleicht bessere Dokumentation), aber es ist nicht sofort klar, welcher Aufruf von 'get_variable()' das Problem verursacht .... – mrry

Antwort

0

Ich weiß nicht, ob es einen Fehler gibt oder nicht, aber die Frage war "kann jemand es beheben". Ja.

Encapsulate die GPU-Schleife (aber nicht den apply_gradients-Code) mit einem "mit tf.variable_scope" -Kontextmanager, so dass der Bereich nicht mehr verwendet wird, sobald die GPU-Schleife beendet wird.

Verwandte Themen