keras - 为什么 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))
解决方案
推荐阅读
- python - 在 matplotlib 中手动更改 xticks
- php - Microsoft Dynamics Nav API 错误:客户过帐组必须在客户中具有值
- docker - 如何更改 Docker 堆栈重启行为?
- computer-vision - CASIA人脸反欺骗数据库
- vba - Document.ExportAsFixedFormat 或 Document.SaveAs 以相反的顺序
- c# - COM接口 c# marshalling array of arrays
- javascript - 带有嵌套 forEach 循环的 Promise 生成解析值
- spring - Spring MVC - 非常简单的 Web 应用程序返回 404 错误
- android - 如何检查图纸布局是否为空?
- java - 休眠性能不佳