如何在 Keras 中的每个时期后重置 LSTM RNN 的状态?

How to reset the state of an LSTM RNN after each epoch within Keras?

我已经定义了一个有状态的 LSTM RNN,我想在每个 epoch 之后重置 RNN 的状态。我发现执行此操作的一种方法是:

n_epochs = 50
for i in range(n_epochs):
    lstm.fit(X, y, epochs = 1, batch_size = 64)
    lstm.reset_states()

在模型规范中或在 Keras 支持的训练中是否有任何其他更优雅的方法来实现它?

仅用于实验,每个人都知道在处理多个步骤时,您将所有数据(足够长的潜在值或与输入相同的数字)的所有输入值设置回 0,这会重置 LSTM 的所有记忆。 这就是 LSTM 的行为,因为它们对输入敏感,因为它包含比较单元和求和单元。

你应该可以通过 Keras 回调来解决这个问题,这可能更优雅一些:

import tensorflow as tf

class CustomCallback(tf.keras.callbacks.Callback):
   def on_epoch_end(self, epoch, logs=None):
        lstm_layer.reset_states()

inputs = tf.keras.layers.Input(batch_shape = (10, 5, 2))
x = tf.keras.layers.LSTM(10, stateful=True)(inputs)
outputs = tf.keras.layers.Dense(1, activation='linear')(x)
model = tf.keras.Model(inputs, outputs)

lstm_layer = model.layers[1]

model.compile(optimizer='adam', loss='mse')
x = tf.random.normal((200, 5, 2))
y = tf.random.normal((200, 1))

model.fit(x, y, epochs=5, callbacks=[CustomCallback()], batch_size=10)