创建具有多个输入的TimeseriesGenerator

2024-09-28 19:33:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Example of problem of creating sequences from independent stacked data

相反,我想要的与此类似:

enter image description here

稍微相似的问题:Merge or append multiple Keras TimeseriesGenerator objects into one

我探讨了这样组合生成器的选项,因此建议:How do I combine two keras generator functions,但是在~4000个生成器的情况下,这是不理想的

我希望我的问题有意义


Tags: or数据内存模型示例tensorflow序列价格
1条回答
网友
1楼 · 发布于 2024-09-28 19:33:39

因此,我最终要做的是手动执行所有预处理,并为每个包含预处理序列的股票保存一个.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以保持跟踪,从而不向模型两次提供相同的数据
    • 产生序列

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

相关问题 更多 >