请考虑这个简单的例子。
所以我们基本上
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,这是我随机生成的数据的标准差,因此模型似乎没有学习。
我是不是出了什么问题?
10
个单元可能对此来说不够。你也可以减少序列长度或尝试检查一些连续函数(如sine
或多项式)。目前,你的架构似乎对你的任务来说过于简单了。 - Marcin Możejko