Создание TimeseriesGenerator с несколькими входами

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

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

Пример задачи создания последовательностей из независимых данных с накоплением

Вместо этого я хотел бы примерно следующее:

введите описание изображения здесь

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

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

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


person DasBoot    schedule 12.04.2020    source источник


Ответы (1)


Итак, что я закончил, так это выполнить всю предварительную обработку вручную и сохранить файл .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
  • If not:
    • Append the index of that sequence to usedDict to keep track as to not feed the same data twice to the model
    • Получите последовательность

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

person DasBoot    schedule 13.04.2020
comment
Когда вы сохраняете предварительно обработанные данные .npy, как вы их обрабатываете? - person Aprilcui11; 20.04.2021