You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

总结步骤

  1. 调整输入形状为(样本数, 500, 5)
  2. 更换损失函数为binary_crossentropy,输出层加sigmoid激活
  3. 对输入数据做归一化处理
  4. 检查类别平衡问题,必要时调整样本权重或平衡数据集
  5. 微调模型结构和训练参数

内容的提问来源于stack exchange,提问作者user8530765

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:22:23