我做错了什么?我该如何训练?
在这里我尝试训练LSTM:
def lstmFit(y, X, n_hidden=1, n_neurons=30, learning_rate=1e-2):
lstm = Sequential()
lstm.add(Masking(mask_value=np.nan, input_shape=(None, X.shape[2])))
for layer in range(n_hidden):
lstm.add(LSTM(n_neurons,
activation="tanh",
recurrent_activation = "sigmoid",
return_sequences=True))
lstm.add(Dense(1))
lstm.compile(loss="mse", optimizer="adam")
early_stopping = EarlyStopping(monitor='loss', patience=10, verbose=1, restore_best_weights=True)
lstm.fit(X, y.reshape(-1), epochs=100, callbacks=[early_stopping])
y_train_fit = lstm.predict(X)
return lstm, y_train_fit
模型的摘要:
lstm.summary()
Model: "sequential_9"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
masking_7 (Masking) (None, None, 15) 0
lstm_6 (LSTM) (None, None, 30) 5520
dense_10 (Dense) (None, None, 1) 31
=================================================================
Total params: 5551 (21.68 KB)
Trainable params: 5551 (21.68 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
和训练的第一个时期:
Epoch 1/100
18/18 [==============================] - 20s 335ms/step - loss: nan
Epoch 2/100
18/18 [==============================] - 6s 335ms/step - loss: nan
Epoch 3/100
18/18 [==============================] - 7s 365ms/step - loss: nan
您可以尝试:
将输入中的所有NAN值用0。或其他值更有意义。
切割序列,因此序列的长度等于最小序列的长度。 序列中的最后一个或第一个数据点序列中的最后一个数据点,因此所有序列均具有相同的长度(最大序列长度)。 plick以更有意义的措施。如果您不知道哪个更好,请尝试所有这些并比较结果。