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_crossentropymsecategorical_crossentropy 在实践中效果更好)。

否则,您正在尝试预测实数/浮点数并为此使用 mse 损失函数,那么您必须在最后一层上使用 model.add(tf.keras.layers.Dense(1, activation='linear')) 才能使模型能够学习。

因此,您最后一层的relu 激活不适用于上述两种情况。

【讨论】:

以上是关于Tensorflow LSTM 模型预测相同的常数值的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow中间歇振荡器的LSTM时间序列预测

使用 Tensorflow 进行 LSTM 单步预测

TensorFlow搭建LSTM实现多变量时间序列预测(负荷预测)

TensorFlow搭建双向LSTM实现时间序列预测(负荷预测)

TensorFlow搭建LSTM实现时间序列预测(负荷预测)

LSTM模型预测cos函数