首页 > 解决方案 > 为什么 LSTM 不能预测回归中的低值和高值?

问题描述

我制作了一堆双向 LSTM 层,然后是 4 个具有 swish 激活函数的 Dense/Dropout 层,以预测 0 到 2 之间的连续值。我使用 mean_squared_error 损失函数、Adam 优化器和批量大小为 32 编译了模型.

我遇到的问题是网络无法很好地预测四肢(低值和高值),不知何故,最小预测值为 0.16,最大值为 1.85。见下图((2,2) 坐标处的点不是 LSTM 预测的一部分):

在此处输入图像描述

我想改进尾部的预测,能够得到低于 0.16 和高于 1.85 的预测。

下面是我搭建的网络:

一个输入数据由代表位移和距离的6个值组成。

num_features = 6

MODEL = Sequential()
MODEL.add(Bidirectional(LSTM(2**6, return_sequences=True, dropout=0.1),
                        input_shape=(None, num_features), merge_mode='concat'))
MODEL.add(Bidirectional(LSTM(2**5, return_sequences=True, dropout=0.1),
                        input_shape=(None, num_features), merge_mode='concat'))
MODEL.add(Bidirectional(LSTM(2**4, return_sequences=False, dropout=0.1),
                        input_shape=(None, num_features), merge_mode='concat'))

MODEL.add(Dense(2**5, activation='swish'))
MODEL.add(Dropout(0.2))
MODEL.add(Dense(2**4, activation='swish'))
MODEL.add(Dropout(0.2))
MODEL.add(Dense(2**3, activation='swish'))
MODEL.add(Dropout(0.1))
MODEL.add(Dense(2**2, activation='swish'))
MODEL.add(Dropout(0.1))
MODEL.add(Dense(1, activation='swish'))

MODEL.compile(loss='mean_squared_error', optimizer='adam', metrics=['MAE', 'accuracy'])

CALLBACKS = [
    EarlyStopping(monitor='val_loss', patience=20, min_delta=1e-4, verbose=1),
    ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=4, min_lr=1e-9, verbose=1),
    ModelCheckpoint(filepath='stackLSTM_best_model.h5', monitor='val_loss', save_best_only=True, verbose=1)
]

HISTORY = MODEL.fit(x=TRAIN_SET['feature'],
                    y=TRAIN_SET['label'],
                    epochs=1000,
                    callbacks=CALLBACKS,
                    batch_size=2**5,
                    shuffle=True,
                    validation_data=(VAL_SET['feature'], VAL_SET['label']),
                    verbose=2)

这里有人有类似的问题吗?可能是什么问题?我尝试将标签从 0 缩放到 1 而不是 0-2,并且我尝试了其他激活函数(sigmoid、linenar),但它没有帮助。在这种情况下是否可以使用特定的损失函数或优化器?

谢谢你的帮助!

更新: 我删除了倒数第二个 Dense 层并将激活函数更改为 ELU,我获得了极值,但是全局预测结果出乎意料地不如之前的结果:

MODEL = Sequential()
MODEL.add(Bidirectional(LSTM(2**6, return_sequences=True, dropout=0.1),
                        input_shape=(None, num_features), merge_mode='concat'))
MODEL.add(Bidirectional(LSTM(2**5, return_sequences=True, dropout=0.1),
                        input_shape=(None, num_features), merge_mode='concat'))
MODEL.add(Bidirectional(LSTM(2**4, return_sequences=False, dropout=0.1),
                        input_shape=(None, num_features), merge_mode='concat'))
MODEL.add(Dense(2**5, activation='elu'))
MODEL.add(Dropout(0.2))
MODEL.add(Dense(2**4, activation='elu'))
MODEL.add(Dropout(0.2))
MODEL.add(Dense(2**3, activation='elu'))
MODEL.add(Dropout(0.1))
# MODEL.add(Dense(2**2, activation='elu'))
# MODEL.add(Dropout(0.1))
MODEL.add(Dense(1, activation=None))

在此处输入图像描述

标签: kerasregressionlstmloss-functionactivation-function

解决方案


推荐阅读