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

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

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

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

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

Как бы мы пошли об этом? Более конкретно, можем ли мы использовать генератор тензорного потока для достижения этой цели и как? Можете ли вы предоставить решение с использованием приведенных выше технических характеристик игрушечного примера?

Всего 1 ответ


Я думаю, что вам лучше всего конвертировать ваш файл .csv в формат .tfrecord , этот формат данных предназначен для обработки «мои данные не помещаются в регистр памяти». Если вы пишете свой собственный генератор, вы пытаетесь имитировать поведение из .tfrecord Вам действительно нужны данные в формате .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 оптимизировать ввод-вывод.


Есть идеи?

10000