Tensorflow LSTM 模型预测相同的常数值
Posted
技术标签:
【中文标题】Tensorflow LSTM 模型预测相同的常数值【英文标题】:Tensorflow LSTM Model predicting the same constant value 【发布时间】:2021-12-28 04:27:22 【问题描述】:我想使用历史数据(2021.01~2021.08)和天气数据预测每小时的使用情况。
我想用过去 3 天(72 小时)的数据预测接下来 24 小时的使用情况
训练数据为 2021.01.31~2021.07.31,测试数据为 2021.08.01~2021.08.31。
我做了数据缩放(RobustScaler)和 one-hot 编码。
这是我的代码:
final_x_train.shape : (49393, 72, 276)
final_y_train.shape : (49393, 24)
final_x_test.shape : (7220, 72, 276)
final_y_test.shape : (7220, 24)
val_data = (final_x_test, final_y_test)
adam = tf.keras.optimizers.Adam()
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.LSTM(units=1024, return_sequences=True, activation='relu', input_shape=final_x_train.shape[-2:]))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.LSTM(1024, activation='relu'))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Dense(24, activation='relu'))
model.compile(loss="mse", optimizer= adam)
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm (LSTM) (None, 72, 1024) 5328896
dropout (Dropout) (None, 72, 1024) 0
lstm_1 (LSTM) (None, 1024) 8392704
dropout_1 (Dropout) (None, 1024) 0
dense (Dense) (None, 24) 24600
=================================================================
Total params: 13,746,200
Trainable params: 13,746,200
Non-trainable params: 0
_________________________________________________________________
early_stopping = EarlyStopping(monitor='val_loss', patience=20, verbose=1)
path_checkpoint = 'short_normal_best_model.h5'
callback_checkpoint = ModelCheckpoint(filepath=path_checkpoint,monitor='val_loss',
verbose=1,save_weights_only=True,save_best_only=True)
model.fit(final_x_train, final_y_train, validation_data=val_data, batch_size=256,
epochs=1000, verbose=2, callbacks=[early_stopping, callback_checkpoint])
y_pred = model.predict(final_x_test)
y_true = scaler_usage.inverse_transform(final_y_test)
y_pred = scaler_usage.inverse_transform(y_pred)
y_pred
array([[6.094296 , 6.0942955, 6.094296 , ..., 6.094296 , 6.094296 ,
6.094296 ],
[6.094296 , 6.0942955, 6.094296 , ..., 6.094296 , 6.094296 ,
6.094296 ],
[6.094296 , 6.0942955, 6.094296 , ..., 6.094296 , 6.094296 ,
6.094296 ],
...,
[6.094296 , 6.0942955, 6.094296 , ..., 6.094296 , 6.094296 ,
6.094296 ],
[6.094296 , 6.0942955, 6.094296 , ..., 6.094296 , 6.094296 ,
6.094296 ],
[6.094296 , 6.0942955, 6.094296 , ..., 6.094296 , 6.094296 ,
6.094296 ]], dtype=float32)
为什么我的模型预测相同的常数值?
【问题讨论】:
scaler_usage 是 RobustScaler()。 【参考方案1】:如果您尝试分别预测每个小时的使用情况(而不是一小时),则必须使用 model.add(tf.keras.layers.Dense(24, activation='softmax'))
和 categorical_crossentropy
或 mse
(categorical_crossentropy
在实践中效果更好)。
否则,您正在尝试预测实数/浮点数并为此使用 mse
损失函数,那么您必须在最后一层上使用 model.add(tf.keras.layers.Dense(1, activation='linear'))
才能使模型能够学习。
因此,您最后一层的relu
激活不适用于上述两种情况。
【讨论】:
以上是关于Tensorflow LSTM 模型预测相同的常数值的主要内容,如果未能解决你的问题,请参考以下文章
TensorFlow搭建LSTM实现多变量时间序列预测(负荷预测)
TensorFlow搭建双向LSTM实现时间序列预测(负荷预测)