Создание TimeseriesGenerator с несколькими входами - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь обучить модель LSTM ежедневным фундаментальным и ценовым данным из ~ 4000 акций, из-за ограничений памяти, я не могу держать все в памяти после преобразования в последовательности для модели.

Это подводит меня использовать генератор вместо, например TimeseriesGenerator от Keras / Tensorflow. Проблема заключается в том, что если я попытаюсь использовать генератор на всех моих накопленных данных, он создаст последовательности смешанных акций, см. Пример ниже с последовательностью 5, здесь Последовательность 3 будет включать последние 4 наблюдения " акции 1"и первое наблюдение" акции 2"

Example of problem of creating sequences from independent stacked data

Вместо того, что я хотел бы похож на это:

enter image description here

Немного похожий вопрос: Объединение или добавление нескольких объектов Keras TimeseriesGenerator в один

Я рассмотрел вариант объединения генераторов, как это предлагает SO: Как мне объединить две функции генератора keras , однако это не идея в случае ~ 4000 генераторов.

Я надеюсь мой вопрос имеет смысл.

1 Ответ

0 голосов
/ 13 апреля 2020

Итак, в итоге я выполнил всю предварительную обработку вручную и сохранил файл .npy для каждого запаса, содержащего предварительно обработанные последовательности, а затем с помощью генератора, созданного вручную, я делаю партии следующим образом:

class seq_generator():

  def __init__(self, list_of_filepaths):
    self.usedDict = dict()
    for path in list_of_filepaths:
      self.usedDict[path] = []

  def generate(self):
    while True: 
      path = np.random.choice(list(self.usedDict.keys()))
      stock_array = np.load(path) 
      random_sequence = np.random.randint(stock_array.shape[0])
      if random_sequence not in self.usedDict[path]:
        self.usedDict[path].append(random_sequence)
        yield stock_array[random_sequence, :, :]

train_generator = seq_generator(list_of_filepaths)

train_dataset = tf.data.Dataset.from_generator(seq_generator.generate(),
                                               output_types=(tf.float32, tf.float32), 
                                               output_shapes=(n_timesteps, n_features)) 

train_dataset = train_dataset.batch(batch_size)

Где list_of_filepaths - это просто список путей к предварительно обработанным данным .npy.


Это будет:

  • Загрузка предварительно обработанных данных .npy случайного запаса
  • Выберите последовательность случайным образом
  • Проверьте, был ли индекс последовательности уже использован в usedDict
  • Если нет:
    • Добавьте индекс этого последовательность к usedDict для отслеживания, чтобы не передавать одни и те же данные дважды на модель
    • Получите последовательность

Это означает, что генератор будет подавать одна уникальная последовательность из случайного запаса при каждом «вызове», что позволяет мне использовать методы .from_generator() и .batch() из типа Tensorflows Dataset .

...