Я пытаюсь использовать очереди для загрузки данных из файлов в Tensorflow.
Я хотел бы запустить график с данными валидации в конце каждой эпохи, чтобы лучше понять, как проходит обучение.
Вот где я столкнулся с проблемами. Я не могу понять, как переключение между данными тренировки и данными проверки при использовании очередей.
Я разделил свой код на минимальный пример игрушки, чтобы облегчить получить помощь. Вместо того, чтобы включать весь код, который загружает файлы изображений, выполняет вывод и обучение, я отрубил его на где имена файлов загружаются в очередь.
import tensorflow as tf
# DATA
train_items = ["train_file_{}".format(i) for i in range(6)]
valid_items = ["valid_file_{}".format(i) for i in range(3)]
# SETTINGS
batch_size = 3
batches_per_epoch = 2
epochs = 2
# CREATE GRAPH
graph = tf.Graph()
with graph.as_default():
file_list = tf.placeholder(dtype=tf.string, shape=None)
# Create a queue consisting of the strings in `file_list`
q = tf.train.string_input_producer(train_items, shuffle=False, num_epochs=None)
# Create batch of items.
x = q.dequeue_many(batch_size)
# Inference, train op, and accuracy calculation after this point
# ...
# RUN SESSION
with tf.Session(graph=graph) as sess:
# Initialize variables
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
# Start populating the queue.
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
try:
for epoch in range(epochs):
print("-"*60)
for step in range(batches_per_epoch):
if coord.should_stop():
break
train_batch = sess.run(x, feed_dict={file_list: train_items})
print("TRAIN_BATCH: {}".format(train_batch))
valid_batch = sess.run(x, feed_dict={file_list: valid_items})
print("\nVALID_BATCH : {} \n".format(valid_batch))
except Exception, e:
coord.request_stop(e)
finally:
coord.request_stop()
coord.join(threads)
Вариации и эксперименты
Попытка использовать разные значения для num_epochs
num_epochs = None
Если я установил аргумент num_epochs
в tf.train.string_input_producer()
, чтобы
None
он дает следующий вывод,
который показывает, что он выполняет две эпохи, как предполагалось, но использует данные
из набора тренировок при выполнении оценки.
------------------------------------------------------------
TRAIN_BATCH: ['train_file_0' 'train_file_1' 'train_file_2']
TRAIN_BATCH: ['train_file_3' 'train_file_4' 'train_file_5']
VALID_BATCH : ['train_file_0' 'train_file_1' 'train_file_2']
------------------------------------------------------------
TRAIN_BATCH: ['train_file_3' 'train_file_4' 'train_file_5']
TRAIN_BATCH: ['train_file_0' 'train_file_1' 'train_file_2']
VALID_BATCH : ['train_file_3' 'train_file_4' 'train_file_5']
num_epochs = 2
Если я устанавливаю аргумент num_epochs
в tf.train.string_input_producer()
на 2
это дает следующий результат,
который показывает, что он даже не запускает полные две партии вообще
(и оценка по-прежнему использует учебные данные)
------------------------------------------------------------
TRAIN_BATCH: ['train_file_0' 'train_file_1' 'train_file_2']
TRAIN_BATCH: ['train_file_3' 'train_file_4' 'train_file_5']
VALID_BATCH : ['train_file_0' 'train_file_1' 'train_file_2']
------------------------------------------------------------
TRAIN_BATCH: ['train_file_3' 'train_file_4' 'train_file_5']
num_epochs = 1
Если я устанавливаю аргумент num_epochs
в tf.train.string_input_producer()
на 1
в надежде, что он выветрится
любые дополнительные данные обучения из очереди, чтобы он мог использовать проверку
данных, я получаю следующий вывод, который показывает, что он завершается, как только
он проходит через одну эпоху учебных данных и не может пройти
Загрузка оценочных данных.
------------------------------------------------------------
TRAIN_BATCH: ['train_file_0' 'train_file_1' 'train_file_2']
TRAIN_BATCH: ['train_file_3' 'train_file_4' 'train_file_5']
Настройка аргумента capacity
для различных значений
Я также попытался установить аргумент capacity
в
tf.train.string_input_producer()
до небольших значений, таких как 3 и 1. Но эти
не повлияло на результаты.
Какой другой подход следует принять?
Какой другой подход я могу предпринять для переключения между данными обучения и валидации? Должен ли я создавать отдельные очереди? Я не понимаю, как это сделать. Работа. Должен ли я создавать дополнительные координаторы и бегуны очереди?