В тренировке Tensorflow я использую slice_input_producer
для загрузки данных. Я хотел бы пробежать одну эпоху своего набора данных, выполнить некоторые вычисления на Python, а затем повторить. Я настроил продюсер так:Возможность повторного использования input_producer в тензорном потоке
input_queue = tf.train.slice_input_producer([images, labels], shuffle=False, num_epochs=1)
, а затем я хотел бы работать:
# Ideally this is all wrapped in a for loop:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
try:
while not coord.should_stop():
... = sess.run(f(input_queue))
finally:
# When done, ask the threads to stop.
coord.request_stop()
# Wait for threads to finish.
coord.join(threads)
Если я не называю sess.run(tf.initialize_local_variables())
в каждой петле после того, как первый не получают никаких данных. Если я называю это, то я получаю исключение, как:
INFO in coordinator: Error reported to Coordinator: <class 'tensorflow.python.framework.errors.AbortedError'>, FIFOQueue '_0_input_producer/input_producer/fraction_of_32_full/fraction_of_32_full' is closed.
...
tensorflow.python.framework.errors.AbortedError: FIFOQueue '_0_input_producer/input_producer/fraction_of_32_full/fraction_of_32_full' is closed.
[[Node: input_producer/input_producer/fraction_of_32_full/fraction_of_32_full_EnqueueMany = QueueEnqueueMany[Tcomponents=[DT_INT32], _class=["loc:@input_producer/input_producer/fraction_of_32_full/fraction_of_32_full"], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/cpu:0"](input_producer/input_producer/fraction_of_32_full/fraction_of_32_full, input_producer/input_producer/fraction_of_32_full/limit_epochs/_18)]]
предположительно потому, что лежащий в основе FIFOQueue
закрыт. Есть ли способ сбросить очередь или удалить ее из графика?
Это кажется связанным: https://github.com/tensorflow/tensorflow/issues/2514
Альтернативой повторного использования может быть просто удалить queue_runner из графика: Remove queue_runner from Tensorflow Graph.
Это не делает то, что я хочу. Я хотел бы запустить код python в конце каждой эпохи, и я не думаю, что ваше решение сообщит мне, что эпоха закончилась. –
вы всегда можете передать обратный вызов функции. Может быть, перефразировать вопрос и опубликовать полурабочий код поможет мне разобраться в этом случае. – fabrizioM
Я хочу запустить одну эпоху своих данных, запустить некоторый код python, а затем запустить другую эпоху своих данных. –