如何在 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)
我已经定义了一个有状态的 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)