Как обрабатывать большие объемы данных в тензорном потоке?
Для моего проекта у меня есть большие объемы данных, около 60 ГБ в виде файлов npy, каждый из которых содержит около 1 ГБ, каждый из которых содержит около 750 000 записей и меток.
Каждая запись - 345 float32, а метки - 5 float32.
Я также прочитал документацию по набору данных tenorflow и документацию очередей / потоков, но я не могу понять, как лучше всего обрабатывать ввод для обучения, а затем как сохранить модель и веса для будущего прогнозирования.
Моя модель довольно прямолинейна, выглядит так:
x = tf.placeholder(tf.float32, [None, 345], name='x')
y = tf.placeholder(tf.float32, [None, 5], name='y')
wi, bi = weight_and_bias(345, 2048)
hidden_fc = tf.nn.sigmoid(tf.matmul(x, wi) + bi)
wo, bo = weight_and_bias(2048, 5)
out_fc = tf.nn.sigmoid(tf.matmul(hidden_fc, wo) + bo)
loss = tf.reduce_mean(tf.squared_difference(y, out_fc))
train_op = tf.train.AdamOptimizer().minimize(loss)
То, как я тренировал свою нейронную сеть, читало файлы по одному в случайном порядке, затем использовал перетасованный массив numpy для индексации каждого файла и вручную создавал каждый пакет для подачи train_op
с помощью feed_dict
, Из всего, что я прочитал, это очень неэффективно, и я должен как-то заменить его наборами данных или очередями и потоками, но, как я уже сказал, документация не помогла.
Итак, как лучше всего обрабатывать большие объемы данных в тензорном потоке?
Также, для справки, мои данные были сохранены в простой файл в 2 этапа:
with open('datafile1.npy', 'wb') as fp:
np.save(data, fp)
np.save(labels, fp)
1 ответ
Утилиты для npy
файлы действительно выделяют весь массив в памяти. Я бы порекомендовал вам конвертировать все ваши массивы NumPy в TFRecords
форматировать и использовать эти файлы в процессе обучения. Это один из наиболее эффективных способов чтения большого набора данных в тензорном потоке.
Преобразовать вTFRecords
def array_to_tfrecords(X, y, output_file):
feature = {
'X': tf.train.Feature(float_list=tf.train.FloatList(value=X.flatten())),
'y': tf.train.Feature(float_list=tf.train.FloatList(value=y.flatten()))
}
example = tf.train.Example(features=tf.train.Features(feature=feature))
serialized = example.SerializeToString()
writer = tf.python_io.TFRecordWriter(output_file)
writer.write(serialized)
writer.close()
Полный пример работы с изображениями можно найти здесь.
ЧитатьTFRecordDataset
def parse_proto(example_proto):
features = {
'X': tf.FixedLenFeature((345,), tf.float32),
'y': tf.FixedLenFeature((5,), tf.float32),
}
parsed_features = tf.parse_single_example(example_proto, features)
return parsed_features['X'], parsed_features['y']
def read_tfrecords(file_names=("file1.tfrecord", "file2.tfrecord", "file3.tfrecord"),
buffer_size=10000,
batch_size=100):
dataset = tf.contrib.data.TFRecordDataset(file_names)
dataset = dataset.map(parse_proto)
dataset = dataset.shuffle(buffer_size)
dataset = dataset.repeat()
dataset = dataset.batch(batch_size)
return tf.contrib.data.Iterator.from_structure(dataset.output_types, dataset.output_shapes)
Руководство по данным можно найти здесь.