2016-09-09 2 views
1

В тренировке 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.

ответ

0

num_epochs Просто настроить на номер эпохи, что у вас есть в вашем коде:

из Docs:

num_epochs: Целое число (по желанию). Если задано, slice_input_producer создает каждый фрагмент num_epochs раз перед генерированием ошибки OutOfRange. Если не указано, slice_input_producer может циклически проходить через срезы неограниченное количество раз.

coord = tf.train.Coordinator() 
    input_queue = tf.train.slice_input_producer([images, labels], shuffle=False, num_epochs=epochs) 

    threads = tf.train.start_queue_runners(sess=sess, coord=coord) 
    sess.run(tf.initialize_all_variables()) 
    try: 
     for e in xrange(epochs): 
      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) 
+0

Это не делает то, что я хочу. Я хотел бы запустить код python в конце каждой эпохи, и я не думаю, что ваше решение сообщит мне, что эпоха закончилась. –

+0

вы всегда можете передать обратный вызов функции. Может быть, перефразировать вопрос и опубликовать полурабочий код поможет мне разобраться в этом случае. – fabrizioM

+0

Я хочу запустить одну эпоху своих данных, запустить некоторый код python, а затем запустить другую эпоху своих данных. –

0

Почему бы не поставить его в цикле уже?

for looping_criterion in range(whenever): 
    for input in range(one_epoch): 
    y = sess.run(f(input_queue)) 
    .... maybe do other stuff 

    # end of one epoch 
    do_some_other_function() 
#Code now loops back until it reaches whenever 

В противном случае я не уверен, что понимаю, что у вас возникли проблемы, если вы обновите свой вопрос, чтобы расширить его?

+0

Что такое 'one_epoch' в этом случае? –

+0

Однако большая часть ваших данных соответствует одной эпохе. Или, если ваши данные упакованы one_epoch = dataset_size/batch_size – Steven

+0

Одна эпоха - полный проход по всем данным. Данные идеально сочетаются. Если размер данных не будет точно кратным размеру партии, то последняя партия будет иметь данные, охватывающие две эпохи. –

Смежные вопросы