Преобразование данных, хранящихся в CSV-файле или файле паркета, для подачи в модель Keras lstm с использованием генератора в TensorFlow 2 - PullRequest
0 голосов
/ 08 февраля 2020

У меня очень длинный фрейм данных (25 миллионов строк x 500 столбцов), к которому я могу получить доступ как файл CSV или файл паркета, но могу загрузить в оперативную память моего P C.

Данные должны быть соответствующим образом сформированы для того, чтобы стать входными данными для модели Keras LSTM (Tensorflow 2), учитывая желаемое количество временных меток на выборку и желаемое количество выборок на серию.

Хотя это описывает реальную ситуацию, с которой я сталкиваюсь, чтобы упростить вещи и сделать их конкретными и воспроизводимыми, давайте предположим, что кадр данных имеет форму 1000 строк по 3 столбца, где первые два столбца являются объектами, а последний является целью, а каждая строка соответствует временной отметке. , Предположим далее, что мы хотели бы преобразовать данные таким образом, чтобы каждая выборка содержала 5 временных шагов, имеющих в качестве цели метку, соответствующую последней (самой последней) временной отметке. Мы хотим передать данные в модель keras lstm с пакетами, содержащими каждые 32 образца.

Данные находятся на нашем жестком диске в формате CSV или в виде паркета. Мы не можем загрузить все данные в нашу оперативную память.

Как бы мы go об этом? В частности, можем ли мы использовать генератор TensorFlow для достижения sh этой цели и как? Как мне найти решение, используя приведенные выше примеры спецификаций?

1 Ответ

1 голос
/ 08 февраля 2020

Я думаю, что вам лучше всего конвертировать файл .csv в формат .tfrecord, этот формат данных предназначен для обработки «мои данные не помещаются в регистр памяти». Если вы напишите свой собственный генератор, ваш пытаясь имитировать c поведение .tfrecord s. Вам действительно нужны данные в формате .csv?

Если вы действительно хотите генератор, начните с tf.data.Dataset.from_generator :

import csv 
def generator:
  with open("data.csv", "r"):
    reader = csv.reader(f)
    for row in reader:
      yield row

# you'll have to define your timestamp as a string. Your
# data description is not too clear so adapt to your needs.
output_types = (tf.int32, tf.string. tf.int32)

data_set = tf.data.Dataset.from_generator(
    generator,
    output_types)

Использование этого метода может создать узкое место для ввода-вывода для обучения вашей сети. Я настоятельно рекомендую вам преобразовать ваши данные в .tfrecords, особенно в LSTM - что, вероятно, потребует длительное время обучения - использование .tfrecords также сокращает время обучения, поскольку позволяет tensorflow оптимизировать ввод / вывод.

...