Поиск…


Считать примеры в CSV-файле

import tensorflow as tf
filename_queue = tf.train.string_input_producer(["file.csv"], num_epochs=1)
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
col1, col2 = tf.decode_csv(value, record_defaults=[[0], [0]])

with tf.Session() as sess:
  sess.run(tf.initialize_local_variables())
  tf.train.start_queue_runners()
  num_examples = 0
  try:
    while True:
      c1, c2 = sess.run([col1, col2])
      num_examples += 1
  except tf.errors.OutOfRangeError:
    print "There are", num_examples, "examples"

num_epochs=1 заставляет string_input_producer закрываться после обработки каждого файла в списке один раз. Это приводит к повышению OutOfRangeError который пойман в try: По умолчанию string_input_producer создает имена файлов бесконечно.

tf.initialize_local_variables() является tensorflow Оп, которые при выполнении, инициализирует num_epoch локальную переменную внутри string_input_producer .

tf.train.start_queue_runners() запускает дополнительные ступени, которые обрабатывают добавление данных в очереди асинхронно.

Чтение и анализ файла TFRecord

Файлы TFRecord - это собственный бинарный формат тензорного потока для хранения данных (тензоров). Чтобы прочитать файл, вы можете использовать код, похожий на пример CSV:

import tensorflow as tf
filename_queue = tf.train.string_input_producer(["file.tfrecord"], num_epochs=1)
reader = tf.TFRecordReader()
key, serialized_example = reader.read(filename_queue)

Затем вам нужно проанализировать примеры из serialized_example Queue. Вы можете сделать это либо с помощью tf.parse_example , для которого требуется предыдущая доработка, но быстрее или tf.parse_single_example :

batch = tf.train.batch([serialized_example], batch_size=100)
parsed_batch = tf.parse_example(batch, features={
  "feature_name_1": tf.FixedLenFeature(shape=[1], tf.int64),
  "feature_name_2": tf.FixedLenFeature(shape=[1], tf.float32)
})

tf.train.batch соединяет последовательные значения заданных тензоров формы [x, y, z] с тензорами формы [batch_size, x, y, z] . features dict сопоставляют имена функций с определениями функций tensorflow. Вы используете parse_single_example аналогичным образом:

parsed_example = tf.parse_single_example(serialized_example, {
  "feature_name_1": tf.FixedLenFeature(shape=[1], tf.int64),
  "feature_name_2": tf.FixedLenFeature(shape=[1], tf.float32)
})

tf.parse_example и tf.parse_single_example возвращают имена функций отображения словаря в тензор со значениями.

Чтобы parse_single_example примеры из parse_single_example вы должны извлечь тензоры из dict и использовать tf.train.batch как и раньше:

parsed_batch = dict(zip(parsed_example.keys(),
    tf.train.batch(parsed_example.values(), batch_size=100)

Вы читаете данные по-прежнему, передавая список всех тензоров для оценки sess.run :

with tf.Session() as sess:
  sess.run(tf.initialize_local_variables())
  tf.train.start_queue_runners()
  try:
    while True:
      data_batch = sess.run(parsed_batch.values())
      # process data
  except tf.errors.OutOfRangeError:
    pass

Случайное перетасовка примеров

Чтобы случайным образом перетасовать примеры, вы можете использовать функцию tf.train.shuffle_batch вместо tf.train.batch следующим образом:

parsed_batch = tf.train.shuffle_batch([serialized_example],
    batch_size=100, capacity=1000,
    min_after_dequeue=200)

tf.train.shuffle_batch (а также tf.train.batch ) создает tf.Queue и продолжает добавлять к нему serialized_examples .

capacity измеряет, сколько элементов может храниться в очереди за один раз. Большая емкость приводит к большему использованию памяти, но более низкая латентность, вызванная потоками, ожидающими ее заполнения.

min_after_dequeue - минимальное количество элементов, присутствующих в очереди после получения из него элементов. Очередь shuffle_batch не перетасовывает элементы совершенно равномерно - она ​​разработана с учетом огромных данных, не относящихся к памяти. Вместо этого он читает между min_after_dequeue и capacity , сохраняет их в памяти и произвольно выбирает их партию. После этого он выделяет еще несколько элементов, чтобы сохранить его количество между min_after_dequeue и capacity . Таким образом, чем больше значение min_after_dequeue , тем больше случайных элементов - выбор элементов batch_size гарантированно берется из по меньшей мере min_after_dequeue последовательных элементов, но большая capacity должна быть и чем дольше требуется, чтобы заполнить очередь изначально.

Чтение данных для n эпох с дозированием

Предположим, что ваши примеры данных уже прочитаны переменной python, и вы хотели бы прочитать ее n раз, в партиях заданного размера:

import numpy as np
import tensorflow as tf
data = np.array([1, 2, 3, 4, 5])
n = 4

Чтобы объединить данные в партии, возможно со случайным перетасовкой, вы можете использовать tf.train.batch или tf.train.batch_shuffle , но вам нужно передать ему тензор, который будет генерировать целые данные n раз:

limited_tensor = tf.train.limit_epochs(data, n)
batch = tf.train.shuffle_batch([limited_tensor], batch_size=3, enqueue_many=True, capacity=4)

limit_epochs преобразует массив numpy в тензор под капотом и возвращает тензор, производящий его n раз, и затем выдает OutOfRangeError. enqueue_many=True передается shuffle_batch что каждый тензор в тензорном списке [limited_tensor] должен интерпретироваться как содержащий ряд примеров. Заметим, что емкость очереди дозирования может быть меньше, чем количество примеров в тензоре.

Как обычно, можно обрабатывать данные:

with tf.Session() as sess:
  sess.run(tf.initialize_local_variables())
  tf.train.start_queue_runners()
  try:
    while True:
      data_batch = sess.run(batch)
      # process data
  except tf.errors.OutOfRangeError:
    pass

Как загружать изображения и метки из файла TXT

В документации Tensorflow не было объяснено, как загружать изображения и метки непосредственно из файла TXT. В приведенном ниже коде показано, как я это достиг. Однако это не значит, что это лучший способ сделать это, и этот способ поможет в дальнейших шагах.

Например, я загружаю метки в одно целое число {0,1}, в то время как в документации используется один горячий вектор [0,1].

# Learning how to import images and labels from a TXT file
#
# TXT file format
#
# path/to/imagefile_1 label_1
# path/to/imagefile_2 label_2
# ...                 ...
#
# where label_X is either {0,1}

#Importing Libraries
import os
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.python.framework import ops
from tensorflow.python.framework import dtypes

#File containing the path to images and the labels [path/to/images label]
filename = '/path/to/List.txt'

#Lists where to store the paths and labels
filenames = []
labels = []

#Reading file and extracting paths and labels
with open(filename, 'r') as File:
    infoFile = File.readlines() #Reading all the lines from File
    for line in infoFile: #Reading line-by-line
        words = line.split() #Splitting lines in words using space character as separator
        filenames.append(words[0])
        labels.append(int(words[1]))

NumFiles = len(filenames)

#Converting filenames and labels into tensors
tfilenames = ops.convert_to_tensor(filenames, dtype=dtypes.string)
tlabels = ops.convert_to_tensor(labels, dtype=dtypes.int32)

#Creating a queue which contains the list of files to read and the value of the labels
filename_queue = tf.train.slice_input_producer([tfilenames, tlabels], num_epochs=10, shuffle=True, capacity=NumFiles)

#Reading the image files and decoding them
rawIm= tf.read_file(filename_queue[0])
decodedIm = tf.image.decode_png(rawIm) # png or jpg decoder

#Extracting the labels queue
label_queue = filename_queue[1]

#Initializing Global and Local Variables so we avoid warnings and errors
init_op = tf.group(tf.local_variables_initializer() ,tf.global_variables_initializer())

#Creating an InteractiveSession so we can run in iPython
sess = tf.InteractiveSession()

with sess.as_default():
    sess.run(init_op)
    
    # Start populating the filename queue.
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)

    for i in range(NumFiles): #length of your filenames list
        nm, image, lb = sess.run([filename_queue[0], decodedIm, label_queue])
        
        print image.shape
        print nm
        print lb
        
        #Showing the current image
        plt.imshow(image)
        plt.show()

    coord.request_stop()
    coord.join(threads)


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow