将多个 Keras TimeseriesGenerator 对象合并或附加到一个对象中

Bio*_*oXD 5 python lstm keras tensorflow

我正在尝试制作一个 LSTM 模型。数据来自包含多个股票值的 csv 文件。

我无法使用文件中出现的所有行来创建序列,因为每个序列仅在其自己的股票上下文中相关,因此我需要为每个股票选择行并根据该行创建序列。

我有这样的事情:

for stock in stocks:

    stock_df = df.loc[(df['symbol'] == stock)].copy()
    target = stock_df.pop('price')

    x = np.array(stock_df.values)
    y = np.array(target.values)

    sequence = TimeseriesGenerator(x, y, length = 4, sampling_rate = 1, batch_size = 1)
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但是我想将每个序列合并成一个更大的序列,我将使用它进行训练,并且包含所有股票的数据。

无法使用追加或合并,因为该函数返回一个生成器对象,而不是一个 numpy 数组。

Das*_*oot 5

编辑:新答案:


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


原答案:

我认为@TF_Support 的回答有点没有抓住要点。如果我理解你的问题,那么你并不是想训练一个模型。stock,您需要一个模型在整个数据集上进行训练

如果您有足够的内存,您可以手动创建序列并将整个数据集保存在内存中。我面临的问题是类似的,我根本无法将所有内容保存在内存中:Creating a TimeseriesGenerator with multiple input

相反,我正在探索单独预处理每个股票的所有数据的可能性,另存为 .npy 文件,然后使用生成器加载这些 .npy 文件的随机样本以将数据批量传输到模型,我不完全确定如何不过,还没有接近这个目标。