我目前正在研究具有多个时间序列的类似机器和Keras中具有Tensorflow后端的多个功能的回归问题。
目标是预测每个时间步的值,这给出了机器的剩余寿命。
我对所有值进行了规范化,并在所有时间序列前面填充输入和输出,使其长度与最长时间一样长。 然后我添加了掩蔽层来掩盖那些零。
我遇到的问题是网络给出了输出变量的常量值。
我已经玩过隐藏的神经元,批次,激活函数,时代,但没有真正改变。 损失缓慢减少,但所有时间步长的输出保持不变。 哦,它有点适用于一个时间序列。
对于所有零填充行,我得到一些像4.88323085e-02
的值(我猜这好吗?),对于所有其他行,输出看起来像这样:
[...
8.72270355e+01, 8.72270355e+01, 8.72270355e+01,
8.72270355e+01, 8.72270355e+01, 8.72270355e+01,
8.72270355e+01, 8.72270355e+01, 8.72270355e+01,
8.72270355e+01, 8.72270355e+01, 8.72270355e+01,
8.72270355e+01, 8.72270355e+01, 8.72270355e+01,
8.72270355e+01, 8.72270355e+01, 8.72270355e+01,
8.72270355e+01, 8.72270355e+01, 8.72270355e+01,
8.72270355e+01, 8.72270355e+01]
我的数据形成如下:
[n_machines, n_timesteps, n_features]
输出如下:
[n_machines, n_timesteps, remaining_life]
我目前的型号如下:
model = Sequential()
model.add(Masking(mask_value=0., input_shape=(None, n_features)))
model.add(LSTM(1000, return_sequences = True, unit_forget_bias=True))
model.add(TimeDistributed(Dense(1)))
model.compile(loss="mse", optimizer="adam", metrics=[RMSE])
model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=100, batch_size=1, shuffle=True)
遗憾的是,使用某种东西而不是神经网络是一种选择,所以我需要做这项工作。 如果有人能帮助我,我会很高兴。
答案 0 :(得分:1)
经过多天的测试和游戏,我发现了一个有效的配置。显然我需要的是一个有状态的LSTM。这是我的工作解决方案:
model = Sequential()
model.add(Masking(mask_value=0., batch_input_shape=(1, 362, 105)))
model.add(
LSTM(100, return_sequences=True, unit_forget_bias=True, stateful=True))
model.add(TimeDistributed(Dense(1, activation="linear")))
model.compile(loss="mse", optimizer="adam", metrics=[RMSE])
# Train the model
for epoch in range(200):
print('Epoch %s' % epoch)
train_loss=[]
# Train
for i in range(x_train.shape[0]):
tr_loss, tr_RMSE = model.train_on_batch(x_train[i, :, :].reshape((1, x_train.shape[1], x_train.shape[2])), y_train[i, :, :].reshape(((1, y_train.shape[1], y_train.shape[2]))))
train_loss.append(tr_loss)
model.reset_states()
print('loss training = {}'.format(np.mean(train_loss)))