У меня есть модель, которая работает над набором изображений и вычисляет некоторую статистику по ним, - для простоты говорят, что она выводит только среднее изображение из набора (оно делает больше, чем это на практике). У меня есть несколько каталогов, содержащих изображения, и я хочу получить вывод из каждого каталога. Каждый каталог имеет переменное количество изображений в нем.Tensorflow: пакетные очереди ввода, а затем изменение источника очереди
Я построил график, функцию вывода и функцию потерь один раз для моего скрипта. Входы загружаются с использованием слегка адаптированного code from here. Я адаптировал его, чтобы взять массив путей, которые я использую, используя заполнитель переменного размера. Я получил вдохновение для этого from here.
Тогда я цикл по каталогам и выполните следующие действия:
- Инициализация переменных (это сбрасывает предыдущую выходную переменную из результатов, рассчитанных на предыдущий каталог)
- Набор пути изображения переменных в Текущие файлы массив из нового каталога:
sess.run(image_paths.initializer, feed_dict={image_paths_initializer: image_paths})
- Начало очереди запуска:
queue_threads = tf.train.start_queue_runners(sess=sess, coord=coord)
- Run для ряда эпох, чтобы получить результаты
- Закрыть темы
coord.request_stop(); coord.join(queue_threads); coord.clear_stop()
- возврата результатов, сохранить результаты, перейти на следующий каталог ...
Проблемы в том, что, когда речь идет о втором каталоге в очереди бегун нить отказывается начать (я могу видеть это путем отладки переменной queue_threads
). Это дает ошибки, как:
Compute status: Aborted: FIFOQueue '_1_input_producer' is closed.
Compute status: Aborted: RandomShuffleQueue '_0_shuffle_batch/random_shuffle_queue' is closed.
Если я не закрываю нити (и не начинать их во второй раз), то они не производят файлы из нового каталога - они игнорируют оп присваивание переменной в (2). Невозможно перезапустить очереди таким образом?
Я попытался настроить очереди в отдельном сеансе и вытащить партии из них, но это дает мне различные ошибки CUDA/памяти. Если я это сделаю и добавлю остановки отладки, я могу заставить его работать довольно далеко до того, как он ударит это, но я не знаю, можно ли добавить зависимости управления между несвязанными сеансами/графиками?
Можно было бы начать с нуля для каждого нового каталога, но это добавляет много накладных расходов к процессу, который я пытаюсь избежать. Я сделал с ним подобные вещи (т. Е. Сброс переменных и повторное использование с разными входами) без очередей, и это экономит много времени, поэтому я знаю, что бит работает.
Может ли кто-нибудь из вас замечательный SO folk думать о выходе из этого?
Спасибо за предложение! Я пытался заставить его работать, как вы говорите, но он держится, когда я пытаюсь получить партию. Похоже, это вызвано очередью подачи в другую очередь (поскольку 'filename_queue' входит в очередь' shuffle_batch')? – lopsided
Он будет зависать, когда вы пытаетесь установить очередь на полную очередь или удалить из пустой очереди. Попробуйте «sess.run ([filename_queue.size()]), чтобы узнать, сколько элементов уже в очереди –
Также вам нужно запустить бегунов очереди, так как tf.batch также является очередью –