You need to enable JavaScript to run this app. CNN训练Dense层调用y_train.shape[1]报IndexError错误解决方案问询
优惠活动
大模型
产品
解决方案
定价
更多

CNN训练Dense层调用y_train.shape[1]报IndexError错误解决方案问询

错误产生原因

核心报错触发原因非常直接:你当前的y_train是一维数组,形状为(样本数,),元组只有索引0对应的维度值,代码中访问y_train.shape[1]自然触发索引越界。除此之外你的代码还有多处逻辑问题,修复当前报错后也会触发后续报错:

  • Conv1D要求输入形状为(样本数, 特征长度, 通道数),你当前X_train的shape是(89680,25),直接传X_train.shape作为input_shape不符合Conv1D的输入要求
  • 你使用了categorical_crossentropy损失函数,要求标签必须为独热编码格式,当前y_train是原始类别标签的一维数组,格式完全不匹配
  • 你完成了RobustScaler归一化生成了X_train_normalised、X_test_normalised,但后续训练完全没有使用归一化后的数据,仍使用原始特征训练,不符合预处理逻辑
  • 你最后对y_test调用np.argmax,但未做独热编码的y_test是一维数组,调用该方法会报错;同时你调用classification_report时传入的target_names变量没有定义,也会触发报错
  • 你的数据集划分逻辑存在数据泄露风险:先做了训练测试划分,拟合归一化器后又从原始训练集里拆分验证集,没有用归一化后的特征做拆分。
对应解决方法

按照以下步骤修改代码即可解决全部问题:

  1. 预处理阶段先把字符串类型的标签转成整数编码,放在target = dataset.pop('Movement')之后:
le = LabelEncoder()
target = le.fit_transform(target)
  1. 修正数据集划分和归一化逻辑,避免数据泄露:
# 先拆分训练验证集+测试集
X_train_val, X_test, y_train_val, y_test = train_test_split(dataset, target, shuffle=True, random_state=SEED, stratify=target, test_size=0.2)
# 仅用训练验证集拟合归一化器,避免测试集信息泄露
sc = RobustScaler().fit(X_train_val)
X_train_val_normalised = sc.transform(X_train_val)
X_test_normalised = sc.transform(X_test)
# 再拆分训练集和验证集
X_train_normalised, X_val_normalised, y_train, y_val = train_test_split(X_train_val_normalised, y_train_val, test_size=0.25, random_state=SEED, stratify=y_train_val)
  1. 把标签转成独热编码,现在y_train就有第二维度了:
num_classes = len(np.unique(y_train))
y_train = to_categorical(y_train, num_classes=num_classes)
y_val = to_categorical(y_val, num_classes=num_classes)
y_test = to_categorical(y_test, num_classes=num_classes)
  1. 给特征添加通道维度,适配Conv1D输入要求:
X_train_normalised = np.expand_dims(X_train_normalised, axis=-1)
X_val_normalised = np.expand_dims(X_val_normalised, axis=-1)
X_test_normalised = np.expand_dims(X_test_normalised, axis=-1)
  1. 修正模型定义的输入形状:
model.add(Conv1D(filters=64, kernel_size=1, activation='relu', input_shape=(X_train_normalised.shape[1], X_train_normalised.shape[2])))
# 输出层保持原来的写法即可,现在y_train.shape[1]就是类别数
model.add(Dense(y_train.shape[1], activation='softmax'))
  1. 修正训练、评估、预测的输入为归一化后的特征:
history = model.fit(X_train_normalised, y_train, validation_data=(X_val_normalised, y_val), epochs=250, verbose=1)
scores = model.evaluate(X_test_normalised, y_test)
y_pred = model.predict(X_test_normalised)
  1. 修正分类报告的target_names参数:
class_report = classification_report(y_test, y_pred, target_names=le.classes_)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 02:54:01