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 x
和 y
,然后产生该元素。当您返回单个元素时,您将获得 batch_size=1
,因为您的 fit_generator
是逐个元素训练的。
假设您希望批量大小为 10,那么您将必须对数据进行切片并获得每个 10 个元素的片段,并且 yield
这些切片而不是单个元素。只要确保您在输入层的形状上相应地反映了这些变化,并传递相应的 batch_size
.
我想在 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 x
和 y
,然后产生该元素。当您返回单个元素时,您将获得 batch_size=1
,因为您的 fit_generator
是逐个元素训练的。
假设您希望批量大小为 10,那么您将必须对数据进行切片并获得每个 10 个元素的片段,并且 yield
这些切片而不是单个元素。只要确保您在输入层的形状上相应地反映了这些变化,并传递相应的 batch_size
.