创建一个多输入的TimeseriesGenerator。

问题描述 投票:0回答:1

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

这使我不得不使用一个生成器来代替,如 时间序列生成器 从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台发电机的情况下的想法。

我希望我的问题有意义。

python tensorflow keras time-series generator
1个回答
0
投票

所以我最后做的是手动做所有的预处理,并为每只股票保存一个包含预处理序列的.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的方法 数据集 种类:

© www.soinside.com 2019 - 2024. All rights reserved.