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