keras 有状态 LSTM

Posted

技术标签:

【中文标题】keras 有状态 LSTM【英文标题】:keras stateful LSTM 【发布时间】:2017-08-31 10:06:15 【问题描述】:

请考虑这个简单的例子

nb_samples = 100000
X = np.random.randn(nb_samples)
Y = X[1:]
X = X[:-1]
X = X.reshape((len(Y), 1, 1))
Y = Y.reshape((len(Y), 1))

所以我们基本上有

Y[i] = X[i-1]

模型只是一个滞后算子。

我可以用无状态 LSTM 学习这个模型,但我想在这里理解和应用 Keras 中的有状态 LSTM。

所以我尝试使用有状态 LSTM 来学习这个模型,方法是一对一地给出值对 (x, y) (batch_size = 1)

model = Sequential()
model.add(LSTM(batch_input_shape=(1, 1, 1),
               output_dim =10,
               activation='tanh', stateful=True
          )
    )
model.add(Dense(output_dim=1, activation='linear'))
model.compile(loss='mse', optimizer='adam')


for epoch in range(50):
    model.fit(X_train,
              Y_train,
              nb_epoch = 1,
              verbose = 2,
              batch_size = 1,
              shuffle = False)
    model.reset_states()

但是模型什么也没学到。

根据 Marcin 的建议,我将训练代码修改如下:

for epoch in range(10000):
    model.reset_states()
    train_loss = 0
    for i in range(Y_train.shape[0]):
        train_loss += model.train_on_batch(X_train[i:i+1],
                         Y_train[i:i+1],
                         )
    print '# epoch', epoch, '  loss ', train_loss/float(Y_train.shape[0])

但我仍然看到 1 左右的平均损失,这是我随机生成的数据的标准差,因此模型似乎没有学习。

我有什么问题吗?

【问题讨论】:

您是否尝试过增加单元数?您希望您的网络记忆长度为 10000 的完全随机模式 - 所以实际上它应该完全记忆为一个序列。 10 单位可能根本不够用。您还可以减少序列长度或尝试检查一些连续函数(如sin 或多项式)。目前,您的架构似乎对您的任务来说很简单。 @volatile LSTM 经常学习运行平均值。 randn 的运行平均值将为 0。如果这是您的输出,那么学习实际上是成功的。尝试学习一些有意义的东西。 @nemo :感谢您的回答。我不是在学习长度为 10000 的随机模式,而是在 t 的输出应该是 t-1 的输入的模式。我希望网络将学会简单地将输入 x[t] 置于其隐藏状态,然后在 t+1,将其隐藏状态返回为输出 y[t+1],并将隐藏状态替换为 x[ t + 1],并递归地这样做。显然,我可以通过使用带有移动窗口的无状态 LSTM 来实现这一点,但希望获得有状态的结果 【参考方案1】:

正如您可能读到的here,即使您的模型状态由于网络的状态性而没有重置——优化器的参数是——并且由于优化器在循环神经网络训练中极其重要——重置它们的状态可能对您的训练极为有害。为了防止这种尝试:

for epoch in range(50):
    model.train_on_batch(X_train,
              Y_train)
    model.reset_states()

train_on_batch 方法不会重置您的优化器状态,​​说明什么可以使您的训练成为可能。

【讨论】:

谢谢。我试过但似乎没有用。我更新了我的问题,告诉我现在在做什么

以上是关于keras 有状态 LSTM的主要内容,如果未能解决你的问题,请参考以下文章

将 Pytorch LSTM 的状态参数转换为 Keras LSTM

Keras LSTM TimeDistributed,有状态

在 Keras 中,当我创建具有 N 个“单元”的有状态“LSTM”层时,我到底在配置啥?

如何在Keras训练LSTM的初始状态?

keras 何时重置 LSTM 状态?

了解有状态的 LSTM [关闭]