我试图围绕Keras中的有状态LSTM进行研究,所以我想到了以下示例:
我想对序列Y(n)= X(n)+ Y(n-1)进行预测。
用于生成数据的代码为:
samples = 1000000
X = np.random.randn(samples).reshape(1000, 100, 10, 1)
Y = np.zeros((1000, 100, 1))
for i in range(X.shape[0]):
for j in range(X[i].shape[0]):
y_it = (Y[i][j-1] if j>0 else 0)
Y[i][j] = y_it + np.sum(X[i][j])
基本上,我正在生成1000个样本,每个样本包含100个具有10个步骤和1个特征的时间序列。对于每个时间序列,我都有一个计算值(所以它是多对一的)。
所以简而言之:
X的形状为1000x100x10x1,Y的形状为1000x100x1
我进一步将数据分为x_train, y_train
和x_test, y_test
进行训练和数据测试(前800个样本进行训练,200个用于测试)。
我使用的是有状态LSTM,因为网络需要跟踪系列之间的状态:
x_in = Input(batch_shape=[100, 10, 1])
lstm = LSTM(40, return_sequences=False, stateful=True)
dense = Dense(1)
model = keras.Model(inputs=x_in, outputs=dense(lstm(x_in)))
model.summary()
model.compile(optimizer=keras.optimizers.RMSprop(), loss='mean_squared_error', metrics=['mse'])
我的训练方法如下:
for _ in range(100):
for i in range(x_train.shape[0]):
model.reset_states()
model.fit(x_train[i], y_train[i], epochs=1, verbose=0, batch_size=100)
问题是结果与测试数据不太吻合。 MSE很大,这是三个随机图,其中绿色代表预测和蓝色测试数据:
我当时认为保持内部状态足以传递有关先前步骤结果的信息,但似乎效果不佳。我缺少基本的东西吗?