创建具有多个输入的 TimeseriesGenerator

Das*_*oot 5 python time-series generator keras tensorflow

由于内存限制,我正在尝试使用来自约 4000 只股票的每日基本面和价格数据训练 LSTM 模型,在转换为模型的序列后,我无法将所有内容保存在内存中。

这导致我使用生成器代替Keras / Tensorflow 的 TimeseriesGenerator。问题是,如果我尝试在所有堆叠的数据上使用生成器,它将创建混合股票序列,请参见下面的示例,序列为 5,这里的序列 3将包括“股票 1 ”的最后 4 个观察值和第一个观察“股票2

从独立堆叠数据创建序列的问题示例

相反,我想要的是类似于:

在此处输入图片说明

稍微相似的问题:将多个 Keras TimeseriesGenerator 对象合并或附加到一个

我探索了像 SO 建议的那样组合生成器的选项:How do I combine two keras generator functions,但是在 ~4000 个生成器的情况下这不是想法。

我希望我的问题是有道理的。

Das*_*oot 4

所以我最终要做的是手动进行所有预处理,并为包含预处理序列的每个股票保存一个 .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)
Run Code Online (Sandbox Code Playgroud)

其中list_of_filepaths只是预处理的 .npy 数据的路径列表。


这会:

  • 加载随机股票的预处理 .npy 数据
  • 随机选择一个序列
  • 检查序列的索引是否已被使用usedDict
  • 如果不:
    • 附加该序列的索引以usedDict跟踪,以免将相同的数据两次提供给模型
    • 产生序列

这意味着生成器将在每次“调用”时从随机库存中提供单个唯一序列,使我能够使用Tensorflows数据集.from_generator()类型中的和方法。.batch()