为了账号安全,请及时绑定邮箱和手机立即绑定

创建具有多个输入的 TimeseriesGenerator

创建具有多个输入的 TimeseriesGenerator

LEATH 2022-10-06 20:02:05
我正在尝试根据约 4000 支股票的每日基本面和价格数据训练 LSTM 模型,由于内存限制,在转换为模型的序列后,我无法将所有内容都保存在内存中。这导致我使用生成器来代替 Keras / Tensorflow 的TimeseriesGenerator。问题是,如果我尝试在所有堆叠的数据上使用生成器,它将创建混合股票序列,请参见下面的示例,序列为 5,这里序列 3将包括“股票 1 ”的最后 4 个观察值和第一个观察“股票2 ”相反,我想要的是类似于这个:稍微类似的问题:Merge or append multiple Keras TimeseriesGenerator objects into one我探索了像这样组合生成器的选项 SO 建议:我如何组合两个 keras 生成器函数,但是在大约 4000 个生成器的情况下这不是想法。我希望我的问题是有道理的。
查看完整描述

1 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

所以我最终要做的是手动进行所有预处理并为每个包含预处理序列的库存保存一个 .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)

Wherelist_of_filepaths只是预处理 .npy 数据的路径列表。

这将:

  • 加载随机股票的预处理 .npy 数据

  • 随机选择一个序列

  • 检查序列的索引是否已经被使用usedDict

  • 如果不:

    • 附加该序列的索引usedDict以跟踪不向模型提供两次相同的数据

    • 产生序列

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


查看完整回答
反对 回复 2022-10-06
  • 1 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信