【发布时间】:2019-04-23 12:14:30
【问题描述】:
我有P 进程的时间序列,每个进程的长度各不相同,但都有 5 个变量(维度)。我正在尝试预测测试过程的估计寿命。我在 Keras 中使用有状态的 LSTM 来解决这个问题。但我不确定我的训练过程是否正确。
我将每个序列分成长度为30 的批次。所以每个序列的形状都是(s_i, 30, 5),其中s_i 对于每个P 序列(s_i = len(P_i)//30)都是不同的。我将所有序列附加到我的训练数据中,其形状为(N, 30, 5),其中N = s_1 + s_2 + ... + s_p。
型号:
# design network
model = Sequential()
model.add(LSTM(32, batch_input_shape=(1, train_X[0].shape[1], train_X[0].shape[2]), stateful=True, return_sequences=True))
model.add(LSTM(16, return_sequences=False))
model.add(Dense(1, activation="linear"))
model.compile(loss='mse', optimizer=Adam(lr=0.0005), metrics=['mse'])
model.summary() 看起来像
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_1 (LSTM) (1, 30, 32) 4864
_________________________________________________________________
lstm_2 (LSTM) (1, 16) 3136
_________________________________________________________________
dense_1 (Dense) (1, 1) 17
=================================================================
训练循环:
for epoch in range(epochs):
mean_tr_acc = []
mean_tr_loss = []
for seq in range(train_X.shape[0]): #24
# train on whole sequence batch by batch
for batch in range(train_X[seq].shape[0]): #68
b_loss, b_acc = model.train_on_batch(np.expand_dims(train_X[seq][batch], axis=0), train_Y[seq][batch][-1])
mean_tr_acc.append(b_acc)
mean_tr_loss.append(b_loss)
#reset lstm internal states after training of each complete sequence
model.reset_states()
编辑:
损失图的问题是我将自定义损失中的值分开,使它们太小。如果我删除除法并以对数方式绘制损失图,它看起来还不错。
新问题:
训练完成后,我会尝试进行预测。我向我的模型展示了一个新流程的 30 个时间样本;因此输入形状与训练期间的batch_input_shape 相同,即(1, 30, 5)。我对相同序列的不同批次的预测都是相同的。
我几乎可以肯定我在训练过程中做错了什么。如果有人可以帮助我,将不胜感激。谢谢。
编辑 2:
因此,只有经过 20 多个 epoch 的训练,模型才能预测出完全相同的结果。否则,预测值非常接近,但仍然有些不同。我想这是由于某种过度拟合造成的。救命!!!
【问题讨论】:
-
模型的输出是什么?它是一个布尔值评估该过程将继续吗?
-
不,输出是
float,这是估计的进程剩余时间。 -
你的 custom_loss() 函数是什么?
-
@Anakin 好的,太好了!因为您没有那么多数据,所以很难验证这是网络结构还是数据本身的问题。我建议尝试获得更多积分或简化结构,以免过度拟合。
-
通常当结果相同时,这是因为您的数据未标准化。我建议您使用简单的法线变换(即 (data - mean)/std )将数据集中在 0 附近。在训练和测试之前尝试像这样转换它。
标签: python machine-learning keras lstm recurrent-neural-network