2016-08-15 5 views
1

Ich habe ein Problem, wo, wenn ich sess.run(tf.merge_all_summaries()) während des Trainings ausführen, wird das Programm hängen. Das wurde auch in a github issue erzogen, obwohl ich nicht sicher bin, dass mein Problem das gleiche ist.tensorflow.merge_all_summaries() hängt

als Referenz, ist dies der Code, den ich auf der Bahn bin mit:

logits = fcn8.upscore # last layer of the network 
loss = softmax_loss(logits, lb, pipe.NUM_CLASSES) 

train_op = build_graph(loss, global_step) 
saver = tf.train.Saver(tf.all_variables()) 
summary_op = tf.merge_all_summaries() 

sess.run(tf.initialize_all_variables()) 
tf.train.start_queue_runners(sess=sess) 
summary_writer = tf.train.SummaryWriter(FLAGS.train_dir, sess.graph) 

for step in range(FLAGS.max_epochs * pipe.EPOCH_LENGTH): 
    if sess.run(queue.size()) == 0: 
    sess.run(enqueue_files) 

    _, loss_val = sess.run([train_op, loss]) 

    if step % 10 == 0: 
    print('loss at step {}: {}'.format(step, loss_val)) 
    summary = sess.run(summary_op) # hangs here 
    summary_writer.add_summary(summary, step) 

Ist das eine gemeinsame Sache? Oder gibt es einen Fehler beim Schreiben des Trainingscodes? Vielen Dank im Voraus für jede Hilfe.

EDIT: Es scheint wie der einzige Zeitpunkt, zu dem dies passiert, wenn die Warteschlange leer ist, wenn ich versuche, Zusammenfassungen zusammenzuführen. Ich frage mich, ob das ein Zufall ist.

Antwort

1

Ihre summary_op löst wahrscheinlich eine Queue dequeue aus, die hängt, wenn die Warteschlange leer ist.

Ein Work-around ist der Code unter Verwendung von Variablen zu restrukturieren, so dass Zusammenfassungen keine Warteschlange dequeue auslösen, wie hier - TensorFlow: Reading images in queue without shuffling

Eine einfachere Work-around ist Ihre Session mit einer Frist zu initialisieren, so dass Ihre leeren dequeues scheitern mit DeadlineExceeded nach einiger Zeit, anstatt zu hängen

tf.reset_default_graph() 
queue = tf.FIFOQueue(capacity=5, dtypes=[tf.int32]) 
config = tf.ConfigProto() 
config.operation_timeout_in_ms=2000 
sess = tf.InteractiveSession("", config=config) 
try: 
    sess.run(queue.dequeue()) 
except tf.errors.DeadlineExceededError: 
    print "DeadlineExceededError detected"