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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:35:19