Keras LSTM信号分类性能不佳,咨询数据输入与优化方案
问题分析与解决方案
首先,咱们得先揪出最核心的问题——输入形状搞反了,这大概率是模型性能拉胯的主要原因!
1. LSTM输入形状的正确姿势
Keras里的LSTM层默认期望的输入格式是 (样本数, 时间步数, 特征数),也就是(samples, timesteps, features)。
你现在的数据集形状是(1000,5,500),相当于把特征数(5)当成了时间步,时间步数(500)当成了特征,完全搞反了!每个信号文件是500个时间步,每个时间步有5个特征,所以正确的输入形状应该是(1000,500,5)。
你可以用下面的代码调整形状:
# 把特征和时间步维度互换 X_train = X_train.swapaxes(1, 2) X_test = X_test.swapaxes(1, 2) # 现在input_shape应该是(500,5) input_shape=(X_train.shape[1], X_train.shape[2])
2. 损失函数与输出层的错误配置
你做的是二分类任务(输出True/False),但现在的配置完全不对:
- 损失函数用了
mae(平均绝对误差),这是回归任务的损失,二分类应该用binary_crossentropy - 输出层没有加激活函数,二分类需要用
sigmoid激活,让输出落在0-1之间,代表样本属于正类的概率 - 评估指标应该用准确率(accuracy),而不是MAE得分
修改后的模型代码:
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense input_shape=(X_train.shape[1], X_train.shape[2]) # 现在是(500,5) model = Sequential() model.add(LSTM(20, return_sequences=True, input_shape=input_shape)) model.add(LSTM(20)) model.add(Dense(1, activation='sigmoid')) # 加sigmoid激活 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 换损失和指标
3. 其他可能导致性能差的原因
数据未归一化
LSTM对输入数据的尺度非常敏感,时间序列特征的数值范围差异大(比如你数据里有2500这种大值,还有1.2这种小值),会严重影响模型收敛。你需要对每个特征做标准化/归一化:
from sklearn.preprocessing import StandardScaler # 注意要按特征维度(最后一维)做归一化 scaler = StandardScaler() # 先把X_train形状改成(1000*500,5),归一化后再改回(1000,500,5) X_train_reshaped = X_train.reshape(-1, X_train.shape[-1]) X_train_scaled = scaler.fit_transform(X_train_reshaped).reshape(X_train.shape) # 测试集用训练集的scaler X_test_reshaped = X_test.reshape(-1, X_test.shape[-1]) X_test_scaled = scaler.transform(X_test_reshaped).reshape(X_test.shape)
类别不平衡
检查你的y_train和y_test中True和False的比例,如果某一类占比极低(比如90%都是False),模型会倾向于预测多数类,导致看似得分低(比如0.19可能是正类的召回率)。这种情况可以:
- 在
model.fit()里加class_weight参数,给少数类更高的权重 - 用过采样(SMOTE)或欠采样平衡数据集
模型容量不足或过拟合
如果调整形状和损失后还是不行,可以尝试:
- 增加LSTM单元数(比如改成64、128)
- 加Dropout层防止过拟合:
model.add(Dropout(0.2)) - 调整训练轮数(
epochs)和批次大小(batch_size)
总结步骤
- 调整输入形状为
(样本数, 500, 5) - 更换损失函数为
binary_crossentropy,输出层加sigmoid激活 - 对输入数据做归一化处理
- 检查类别平衡问题,必要时调整样本权重或平衡数据集
- 微调模型结构和训练参数
内容的提问来源于stack exchange,提问作者user8530765
相关产品推荐
相关产品推荐

