Keras Stateful LSTM fit_generator 如何使用 batch_size > 1

Keras Stateful LSTM fit_generator how to use batch_size > 1

我想在 Keras 中使用函数 API 训练一个 有状态 LSTM 网络。

拟合方法为fit_generator.

我可以训练它,使用:batch_size = 1

我的输入层是:

Input(shape=(n_history, n_cols),batch_shape=(batch_size, n_history, n_cols), 
    dtype='float32', name='daily_input')

生成器如下:

def training_data():
    while 1:       
        for i in range(0,pdf_daily_data.shape[0]-n_history,1):            
            x = f(i)() # f(i) shape is (1, n_history, n_cols)
            y = y(i)
            yield (x,y)

然后拟合为:

model.fit_generator(training_data(),
                    steps_per_epoch=pdf_daily_data.shape[0]//batch_size,...

这很有效,训练也很好,但是非常慢,并且自 batch_size = 1

以来每个时间步都执行梯度更新

如何在此配置中设置 batch_size > 1记住:LSTM 层有 stateful = True

您必须修改您的生成器以yeld您希望您的批次具有的所需元素数量

目前您正在逐个元素迭代数据(根据 range() 的第三个参数),获得 single xy,然后产生该元素。当您返回单个元素时,您将获得 batch_size=1,因为您的 fit_generator 是逐个元素训练的。

假设您希望批量大小为 10,那么您将必须对数据进行切片并获得每个 10 个元素的片段,并且 yield 这些切片而不是单个元素。只要确保您在输入层的形状上相应地反映了这些变化,并传递相应的 batch_size.