tensorflow
Чтение данных
Поиск…
Считать примеры в 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)