Доступ к имени файла из очереди файлов в Tensor Flow

У меня есть каталог изображений и отдельный файл, сопоставляющий имена файлов изображений с ярлыками. Поэтому в каталоге изображений есть такие файлы, как «train / 001.jpg», и файл с надписью выглядит так:

train/001.jpg 1 train/002.jpg 2 ... 

Я могу легко загружать изображения из каталога изображений в Tensor Flow, создавая файл из имен файлов:

 filequeue = tf.train.string_input_producer(filenames) reader = tf.WholeFileReader() img = reader.read(filequeue) 

Но я не понимаю, как связать эти файлы с метками из файла маркировки. Кажется, мне нужен доступ к именам файлов внутри очереди на каждом шаге. Есть ли способ получить их? Кроме того, как только у меня будет имя файла, мне нужно будет найти метку с именем файла. Похоже, что стандартный словарь Python не будет работать, потому что эти вычисления должны выполняться на каждом этапе графика.

  • Tensorflow считывает изображения с помощью меток
  • Tensorflow VarLenFeature vs FixedLenFeature
  • «Заморозить» некоторые переменные / области действия в тензорном потоке: stop_gradient vs пропускает переменные для минимизации
  • TensorFlow - индексирование тензоподобных тензоров
  • Почему пример TensorFlow не работает при увеличении размера партии?
  • Использование тензоров в потоке управления и условных операторах
  • Тензорный поток: как изменить значение в тензоре
  • Базовая 1-я свертка в тензорном потоке
  • 5 Solutions collect form web for “Доступ к имени файла из очереди файлов в Tensor Flow”

    Учитывая, что ваши данные не слишком велики, чтобы вы могли указать список имен файлов в виде массива python, я бы предложил просто выполнить предварительную обработку в Python. Создайте два списка (один и тот же порядок) имен файлов и меток и вставьте их либо в randomshufflequeue, либо в очередь, и удалите из него. Если вы хотите, чтобы поведение «string_input_producer» выполнялось бесконечно, вы можете повторно запустить «enqueue» в начале каждой эпохи.

    Очень игрушечный пример:

     import tensorflow as tf f = ["f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8"] l = ["l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8"] fv = tf.constant(f) lv = tf.constant(l) rsq = tf.RandomShuffleQueue(10, 0, [tf.string, tf.string], shapes=[[],[]]) do_enqueues = rsq.enqueue_many([fv, lv]) gotf, gotl = rsq.dequeue() with tf.Session() as sess: sess.run(tf.initialize_all_variables()) tf.train.start_queue_runners(sess=sess) sess.run(do_enqueues) for i in xrange(2): one_f, one_l = sess.run([gotf, gotl]) print "F: ", one_f, "L: ", one_l 

    Ключ состоит в том, что вы эффективно размещаете пары имен файлов / ярлыков, когда вы делаете enqueue , и эти пары возвращаются в dequeue .

    Вот что я смог сделать.

    Я сначала перетасовал имена файлов и сопоставил их в Python:

     np.random.shuffle(filenames) labels = [label_dict[f] for f in filenames] 

    Затем создайте файл string_input_producer для имен файлов с shuffle off и FIFO для меток:

     lv = tf.constant(labels) label_fifo = tf.FIFOQueue(len(filenames),tf.int32, shapes=[[]]) file_fifo = tf.train.string_input_producer(filenames, shuffle=False, capacity=len(filenames)) label_enqueue = label_fifo.enqueue_many([lv]) 

    Затем, чтобы прочитать изображение, я мог бы использовать WholeFileReader и получить ярлык, который я мог бы удалить из списка fifo:

     reader = tf.WholeFileReader() image = tf.image.decode_jpeg(value, channels=3) image.set_shape([128,128,3]) result.uint8image = image result.label = label_fifo.dequeue() 

    И сгенерируйте партии следующим образом:

     min_fraction_of_examples_in_queue = 0.4 min_queue_examples = int(num_examples_per_epoch * min_fraction_of_examples_in_queue) num_preprocess_threads = 16 images, label_batch = tf.train.shuffle_batch( [result.uint8image, result.label], batch_size=FLAGS.batch_size, num_threads=num_preprocess_threads, capacity=min_queue_examples + 3 * FLAGS.batch_size, min_after_dequeue=min_queue_examples) 

    Существует tf.py_func() который можно использовать для реализации сопоставления из пути к метке файла.

     files = gfile.Glob(data_pattern) filename_queue = tf.train.string_input_producer( files, num_epochs=num_epochs, shuffle=True) # list of files to read def extract_label(s): # path to label logic for cat&dog dataset return 0 if os.path.basename(str(s)).startswith('cat') else 1 def read(filename_queue): key, value = reader.read(filename_queue) image = tf.image.decode_jpeg(value, channels=3) image = tf.cast(image, tf.float32) image = tf.image.resize_image_with_crop_or_pad(image, width, height) label = tf.cast(tf.py_func(extract_label, [key], tf.int64), tf.int32) label = tf.reshape(label, []) training_data = [read(filename_queue) for _ in range(num_readers)] ... tf.train.shuffle_batch_join(training_data, ...) 

    Я использовал это:

      filename = filename.strip().decode('ascii') 

    Еще одно предложение – сохранить ваши данные в формате TFRecord . В этом случае вы сможете сохранить все изображения и все метки в одном файле. Для большого количества файлов это дает много преимуществ:

    • может хранить данные и метки в одном и том же месте
    • данные выделяются в одном месте (нет необходимости запоминать разные каталоги)
    • если есть много файлов (изображений), открытие / закрытие файла занимает много времени. Поиск местоположения файла из ssd / hdd также требует времени
    Python - лучший язык программирования в мире.