语境
我阅读了一些关于在 Keras 中实现有状态循环神经网络的博客(例如这里和这里)。
在 stackoverflow 上还有几个关于有状态 RNN 的问题,这个问题与我的很接近。
链接的教程使用fit()
- 方法代替fit_generator()
并通过手动迭代 epoch 来传递状态,epochs=1
如fit()
本示例中取自此处的示例:
# fit an LSTM network to training data
def fit_lstm(train, batch_size, nb_epoch, neurons):
X, y = train[:, 0:-1], train[:, -1]
X = X.reshape(X.shape[0], 1, X.shape[1])
model = Sequential()
model.add(LSTM(neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]), stateful=True))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
for i in range(nb_epoch):
model.fit(X, y, epochs=1, batch_size=batch_size, verbose=0, shuffle=False)
model.reset_states()
return model
我的问题
我想使用fit_generator()
而不是fit()
,但也使用无状态 LSTM/GRU 层。我在上面链接的其他stackoverflow问题中缺少的是:
- 我可以像示例中那样在每次迭代中设置时以与 with 相同的方式进行操作
fit()
,即设置epochs=1
,并对其进行 x 次 迭代吗?model.reset_states()
- 还是仅在使用
fit_generator()
完成后才重置状态(什么会很棒)?batch_size
stateful=True
- 还是
fit_generator()
在每个批次之后重置状态(会有什么问题)?
后一个问题在这里特别涉及这种陈述形式:
无状态:在无状态 LSTM 配置中,内部状态在每个训练批次或每个批次进行预测时重置。
Stateful:在有状态的 LSTM 配置中,只有在调用 reset_state() 函数时才会重置内部状态。