keras 有状态 LSTM

vol*_*ile 5 python lstm keras

请考虑这个简单的例子

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))
Run Code Online (Sandbox Code Playgroud)

所以我们基本上

Y[i] = X[i-1]
Run Code Online (Sandbox Code Playgroud)

并且该模型只是一个滞后算子。

我可以使用无状态 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()
Run Code Online (Sandbox Code Playgroud)

但是模型没有学到任何东西。

根据 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])
Run Code Online (Sandbox Code Playgroud)

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

我有什么问题吗?

Mar*_*jko 1

正如您可能在此处读到的,即使您的模型状态不会由于网络的状态性而重置(优化器的参数会重置),并且由于优化器在循环神经网络训练中极其重要这一事实 - 重置其状态可能极其有害为了您的训练。为了防止这种情况尝试:

for epoch in range(50):
    model.train_on_batch(X_train,
              Y_train)
    model.reset_states()
Run Code Online (Sandbox Code Playgroud)

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