【问题标题】:Merge or append multiple Keras TimeseriesGenerator objects into one将多个 Keras TimeseriesGenerator 对象合并或附加到一个中
【发布时间】:2020-07-24 02:48:01
【问题描述】:

我正在尝试制作 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)

这很好,但我想将这些序列中的每一个合并成一个更大的序列,用于训练并包含所有股票的数据。

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

【问题讨论】:

    标签: python tensorflow keras lstm


    【解决方案1】:

    编辑:新答案:


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

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


    原答案:

    我认为@TF_Support 的回答有点不妥。如果我理解您的问题,这并不是说您想训练一个模型公关。股票,你想要一个在整个数据集上训练的模型

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

    相反,我正在探索单独预处理每个股票的所有数据的可能性,保存为 .npy 文件,然后使用生成器将这些 .npy 文件的随机样本加载到模型中批量数据,我不是完全确定如何解决这个问题。

    【讨论】:

    • 这与我最终所做的类似,因此我将其标记为正确。我最终编写了自己的生成器,因为它看起来没有办法在这个用例中使用 TimeseriesGenerator()。你说得对,我想做的是使用整个数据集进行训练。
    【解决方案2】:

    对于该场景,您希望将这些序列中的每一个合并成一个更大的序列,其中包含所有股票的数据并将用于训练

    您可以将创建的 TimeSeriesGenerators追加到 Python 列表中

    stock_timegenerators = []
    for stock in stocks:
        stock_df = stock.copy()
        features = stock_df.pop('symbol')
        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)
        stock_timegenerators.append(TimeseriesGenerator(x, y, length = 4, sampling_rate = 1, batch_size = 1))
    

    此输出将是一个附加的 TimeSeriesGenerator,您可以通过 迭代 列表reference 来使用它按索引

    [<tensorflow.python.keras.preprocessing.sequence.TimeseriesGenerator at 0x7eff62c699b0>,
     <tensorflow.python.keras.preprocessing.sequence.TimeseriesGenerator at 0x7eff62c6eba8>,
     <tensorflow.python.keras.preprocessing.sequence.TimeseriesGenerator at 0x7eff62c782e8>]
    

    同时拥有多个 Keras 时间序列意味着您正在为每只股票训练 多个 LSTM 模型
    您还可以使用这种方法有效地处理多个模型。

    lstm_models = []
    for time_series_gen in stock_timegenerators:
    
        # lstm_models.append(create_model()) : You could create everything using functions
    
        # Or in the loop like this.
        model = Sequential()
        model.add(LSTM(32, input_shape = (n_input, n_features)))
        model.add(Dense(1))
    
        model.compile(loss ='mse', optimizer = 'adam')
    
        model.fit(time_series_gen, steps_per_epoch= 1, epochs = 5)
        
        lstm_models.append(model)
    
    

    这将输出一个附加的模型列表,并使用索引轻松引用。

    [<tensorflow.python.keras.engine.sequential.Sequential at 0x7eff62c7b748>,
     <tensorflow.python.keras.engine.sequential.Sequential at 0x7eff6100e160>,
     <tensorflow.python.keras.engine.sequential.Sequential at 0x7eff63dc94a8>]
    

    通过这种方式,您可以为不同的股票创建多个具有不同时间序列生成器的 LSTM 模型

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 2023-01-19
      • 2013-09-19
      • 2020-10-27
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多