Как читать данные в пакетах TensorFlow из очереди примеров?

18

Как получить очереди примеров TensorFlow в правильные партии для обучения?

У меня есть изображения и метки:

IMG_6642.JPG 1
IMG_6643.JPG 2

(не стесняйтесь предлагать другой формат ярлыков, я думаю, мне может понадобиться еще один плотный до редкого шага ...)

Я прочитал довольно много учебников, но пока не все это вместе. Вот то, что у меня есть, с комментариями, указывающими шаги, требуемые от TansorFlow Чтение Данные .

  1. Список имен файлов (для простоты удалены удаленные шаги)
  2. Очередь имен файлов
  3. Читатель для формата файла
  4. Декодер для записи, считанной читателем.
  5. Пример очереди

И после очереди в очереди мне нужно получить эту очередь в партии для обучения; вот где я застрял ...

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

Мой вопрос: как использовать приведенный выше примерный код с кодом, который у меня выше? Мне нужно пакеты для работы, и большинство учебных пособий мнистские партии уже.

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)
    
задан JohnAllen 09.05.2016 в 23:57
источник
  • вы нашли решение для этого? –  user3639557 14.09.2016 в 05:17
  • Я также ищу объяснение. У меня сложилось впечатление, что пример mnist обрабатывает вывод для создания «стоимости», что делает код слишком специфичным. Я не могу найти другого примера, чтобы помочь мне разобраться. –  rtmc 30.12.2016 в 19:48

1 ответ

13

Если вы хотите, чтобы этот входной конвейер работал, вам нужно добавить механизм асинхронной очереди, который генерирует партии примеров. Это выполняется путем создания tf.RandomShuffleQueue или tf.FIFOQueue и вставки изображений JPEG, которые были прочитаны, декодированы и предварительно обработаны.

Вы можете использовать удобные конструкции, которые будут генерировать очереди и соответствующие потоки для запуска очередей через tf.train.shuffle_batch_join или tf.train.batch_join . Вот упрощенный пример того, что бы это хотелось. Обратите внимание, что этот код не проверен:

# Let's 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 :

Ссылка

Наконец, если вы работаете с изображениями & gt; O (1000) JPEG, имейте в виду, что он чрезвычайно неэффективен для индивидуально готовых 1000-х маленьких файлов. Это немного замедлит ваше обучение.

Более надежное и быстрое решение для преобразования набора данных изображений в обработанный TFRecord Example protos. Ниже приведен полный сценарий для преобразования набора данных ImageNet в такой формат. И вот набор инструкции для запуска общей версии этого сценария предварительной обработки в произвольном каталоге, содержащем изображения JPEG.

    
ответ дан user5869947 10.05.2016 в 20:56