NASA涡轮风扇数据集LSTM模型训练报错:数据基数不匹配求助
问题核心与解决方案
直接错误原因
你在model.fit()里传参错误:第二个参数应该是训练集标签y_train,但你传了测试集X_test,导致训练数据(23608样本)和标签(10119样本)的数量不匹配,触发了数据基数错误。
除此之外,你的数据集预处理和模型结构还存在几个关键问题,下面是完整修正方案:
分步修正方案
1. 修正数据集预处理逻辑
NASA涡轮风扇数据集是时序回归任务(预测剩余使用寿命RUL),不是图像数据,所以:
- 移除
/255.0的操作,改用适合时序数据的标准化方法 - 不要拼接训练集和测试集后拆分,保留原始划分,避免数据泄露
- 用训练集的统计量来归一化测试集
from sklearn.preprocessing import StandardScaler # 初始化标准化器,仅用训练集计算均值和标准差 scaler = StandardScaler() train_scaled = scaler.fit_transform(train1) test_scaled = scaler.transform(test1)
2. 转换为LSTM要求的三维输入格式
LSTM需要输入格式为(样本数, 时间步长, 特征数),你当前的数据维度是(特征数, 样本数),需要重构数据:
def create_lstm_samples(data, labels, time_steps=30): """ 将时序数据转换为LSTM样本:每个样本取发动机最后N个时间步的传感器数据 参数: data: 按发动机分组的时序数据列表 labels: 每个发动机对应的RUL标签 time_steps: 每个样本包含的时间步数 """ X, y = [], [] for engine_seq, rul in zip(data, labels): if len(engine_seq) >= time_steps: # 取最后time_steps个时间步作为输入 X.append(engine_seq[-time_steps:]) y.append(rul) return np.array(X), np.array(y) # 注意:需根据你的数据集实际结构调整data和labels的传入方式 X_train, y_train = create_lstm_samples(train_scaled, y_train) X_test, y_test = create_lstm_samples(test_scaled, y_test)
3. 修正模型结构与训练参数
- 调整LSTM的输入形状为
(时间步长, 特征数),不需要指定样本数 - 最后一层LSTM关闭
return_sequences,因为后续接全连接层 - 回归任务移除
sigmoid激活和accuracy指标,用MSE作为损失函数
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dropout, Dense model = Sequential() # input_shape=(时间步长, 特征数) model.add(LSTM(units=100, activation='relu', return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2]))) model.add(Dropout(0.5)) # 最后一层LSTM不需要返回序列 model.add(LSTM(units=50, activation='relu', return_sequences=False)) model.add(Dropout(0.5)) # 回归任务用线性激活(默认) model.add(Dense(units=1)) # 回归任务编译配置 model.compile(loss='mse', optimizer='adam') # 正确训练:传入训练集特征和标签,可选加入验证集 history = model.fit(X_train, y_train, epochs=10, batch_size=200, verbose=1, validation_data=(X_test, y_test)) # 评估模型 test_loss = model.evaluate(X_test, y_test, verbose=0) print(f"测试集MSE: {test_loss}")
关键注意点
- 确保你的数据集已经按发动机分组,每个发动机对应一段连续的时序传感器数据和一个RUL标签
- 时间步长(time_steps)可以根据任务调整,比如20、30或50,需要验证效果
- 不要在训练前泄露测试集数据的统计信息,所有归一化操作都必须基于训练集计算的参数
内容的提问来源于stack exchange,提问作者B OZTURK
相关产品推荐
相关产品推荐

