Как читать данные в партии TensorFlow из очереди примеров?
Как получить очереди примеров TensorFlow в правильные партии для обучения?
У меня есть изображения и метки:
IMG_6642.JPG 1
IMG_6643.JPG 2
(не стесняйтесь предлагать другой формат ярлыков, я думаю, мне может понадобиться еще один плотный до редкого шага...)
Я прочитал довольно много учебников, но пока не все это вместе.
Вот что я имею, с комментариями, указывающими шаги, требуемые от страницы TansorFlow Чтение данных.
- Список имен файлов
(для простоты удалены удаленные шаги)
- Очередь имен файлов
- Читатель для формата файла
- Декодер для записи, считанной читателем.
- Пример очереди
И после очереди в очереди мне нужно получить эту очередь в партии для обучения; что где я застрял...
1. Список имен файлов
files = tf.train.match_filenames_once('*.JPG')
4. Очередь имен файлов
filename_queue = tf.train.string_input_producer(files, num_epochs=None, shuffle=True, seed=None, shared_name=None, name=None)
5. Читатель
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
6. Декодер
record_defaults = [[""], [1]]
col1, col2 = tf.decode_csv(value, record_defaults=record_defaults)
(Я не думаю, что мне нужен этот шаг ниже, потому что у меня уже есть мой ярлык в тензоре, но я все равно включаю его)
features = tf.pack([col2])
На странице документации есть пример для запуска одного изображения, а не для получения изображений и меток в партии:
for i in range(1200):
# Retrieve a single instance:
example, label = sess.run([features, col5])
Затем под ним находится раздел дозирования:
def read_my_file_format(filename_queue):
reader = tf.SomeReader()
key, record_string = reader.read(filename_queue)
example, label = tf.some_decoder(record_string)
processed_example = some_processing(example)
return processed_example, label
def input_pipeline(filenames, batch_size, num_epochs=None):
filename_queue = tf.train.string_input_producer(
filenames, num_epochs=num_epochs, shuffle=True)
example, label = read_my_file_format(filename_queue)
# min_after_dequeue defines how big a buffer we will randomly sample
# from -- bigger means better shuffling but slower start up and more
# memory used.
# capacity must be larger than min_after_dequeue and the amount larger
# determines the maximum we will prefetch. Recommendation:
# min_after_dequeue + (num_threads + a small safety margin) * batch_size
min_after_dequeue = 10000
capacity = min_after_dequeue + 3 * batch_size
example_batch, label_batch = tf.train.shuffle_batch(
[example, label], batch_size=batch_size, capacity=capacity,
min_after_dequeue=min_after_dequeue)
return example_batch, label_batch
Мой вопрос: как использовать приведенный выше примерный код с кодом, который у меня выше? Мне нужны партии для работы, и большинство учебных пособий уже поставляются с пакетами mnist.
with tf.Session() as sess:
sess.run(init)
# Training cycle
for epoch in range(training_epochs):
total_batch = int(mnist.train.num_examples/batch_size)
# Loop over all batches
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
Ответы
Ответ 1
Если вы хотите, чтобы этот входной конвейер работал, вам нужно добавить механизм асинхронной очереди, который генерирует партии примеров. Это выполняется путем создания tf.RandomShuffleQueue
или tf.FIFOQueue
и вставки изображений JPEG, которые были прочитаны, декодированы и предварительно обработаны.
Вы можете использовать удобные конструкции, которые будут генерировать очереди и соответствующие потоки для запуска очередей через tf.train.shuffle_batch_join
или tf.train.batch_join
. Вот упрощенный пример того, что бы это хотелось. Обратите внимание, что этот код не проверен:
# Let assume there is a Queue that maintains a list of all filenames
# called 'filename_queue'
_, file_buffer = reader.read(filename_queue)
# Decode the JPEG images
images = []
image = decode_jpeg(file_buffer)
# Generate batches of images of this size.
batch_size = 32
# Depends on the number of files and the training speed.
min_queue_examples = batch_size * 100
images_batch = tf.train.shuffle_batch_join(
image,
batch_size=batch_size,
capacity=min_queue_examples + 3 * batch_size,
min_after_dequeue=min_queue_examples)
# Run your network on this batch of images.
predictions = my_inference(images_batch)
В зависимости от того, как вам нужно масштабировать свое задание, вам может потребоваться запустить несколько независимых потоков, которые будут читать/декодировать/препроизводить изображения и выгружать их в очереди вашего примера. Полный пример такого конвейера представлен в модели Inception/ImageNet. Взгляните на batch_inputs
:
https://github.com/tensorflow/models/blob/master/inception/inception/image_processing.py#L407
Наконец, если вы работаете с изображениями > O (1000) JPEG, имейте в виду, что он чрезвычайно неэффективен для индивидуально готового 1000 небольших файлов. Это немного замедлит ваше обучение.
Более надежное и быстрое решение для преобразования набора данных изображений в оштукатуренный TFRecord
прототипов Example
. Вот полностью обработанный script для преобразования набора данных ImageNet в такой формат. И вот набор инструкций для запуска общей версии этой предварительной обработки script в произвольном каталоге, содержащем изображения JPEG.