You need to enable JavaScript to run this app. CNN处理11维特征二分类数据集拟合时出现负维度ValueError报错
优惠活动
大模型
产品
解决方案
定价
更多

CNN处理11维特征二分类数据集拟合时出现负维度ValueError报错

报错原因

你触发错误的核心原因是输入数据形状和2D卷积核的尺寸不匹配:

  • 你的数据集只有11个一维特征,增加维度后输入到CNN的形状为(批量大小, 11, 1, 1),对应2D卷积要求的(批量, 高度, 宽度, 通道数)格式,这里宽度维度只有1
  • 第一层2D卷积使用了(3,3)的卷积核,默认是不填充的VALID模式,在宽度维度计算输出尺寸时结果为负数,直接触发报错

此外你的代码还有两处和二分类任务不匹配的逻辑错误:

  • 标签取值只有0和1属于二分类任务,你当前输出层用了10个神经元的softmax激活,是为10分类任务设计的,完全不匹配
  • 一维特征数据不需要用2D卷积,用1D卷积适配性更高,训练效率也更好
修复方案

方案1:改用1D卷积(推荐)

这是最适配你的数据结构的方案,修改后的完整代码如下:

import numpy as np
from sklearn.model_selection import train_test_split
import tensorflow.keras as keras
import pandas as pd

DATA_PATH = "testt.csv"


def load_data(data_path):
    data = pd.read_csv(DATA_PATH)
    y = np.array(data["Label"])
    X = np.array(data.drop(labels = ["Label"],axis = 1) )
    return X, y


def prepare_datasets(test_size, validation_size):
    X, y = load_data(DATA_PATH)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size)
    X_train, X_validation, y_train, y_validation = train_test_split(X_train, y_train, test_size=validation_size)
    # 加通道轴适配1D卷积
    X_train = X_train[..., np.newaxis]
    X_validation = X_validation[..., np.newaxis]
    X_test = X_test[..., np.newaxis]
    return X_train, X_validation, X_test, y_train, y_validation, y_test


def build_model(input_shape):
    model = keras.Sequential()
    # 1st conv层 改用Conv1D
    model.add(keras.layers.Conv1D(32, 3, activation='relu', input_shape=input_shape))
    model.add(keras.layers.MaxPooling1D(2, strides=2, padding='same'))
    model.add(keras.layers.BatchNormalization())
    # 2nd conv层
    model.add(keras.layers.Conv1D(32, 3, activation='relu'))
    model.add(keras.layers.MaxPooling1D(2, strides=2, padding='same'))
    model.add(keras.layers.BatchNormalization())
    # 3rd conv层
    model.add(keras.layers.Conv1D(32, 2, activation='relu'))
    model.add(keras.layers.MaxPooling1D(2, strides=2, padding='same'))
    model.add(keras.layers.BatchNormalization())
    # 全连接层
    model.add(keras.layers.Flatten())
    model.add(keras.layers.Dense(64, activation='relu'))
    model.add(keras.layers.Dropout(0.3))
    # 输出层适配二分类
    model.add(keras.layers.Dense(1, activation='sigmoid'))
    return model


if __name__ == "__main__":
    X_train, X_validation, X_test, y_train, y_validation, y_test = prepare_datasets(0.25, 0.2)
    # 适配1D卷积的输入形状
    input_shape = (X_train.shape[1], 1)
    model = build_model(input_shape)
    # 损失函数换成二分类交叉熵
    optimiser = keras.optimizers.Adam(learning_rate=0.0001)
    model.compile(optimizer=optimiser,
                  loss='binary_crossentropy',
                  metrics=['accuracy'])
    model.summary()
    history = model.fit(X_train, y_train, validation_data=(X_validation, y_validation), batch_size=32, epochs=30)

方案2:保留2D卷积的修改方法

如果你一定要用2D卷积结构,只需要修改卷积核尺寸、填充规则和输出层逻辑即可:

  1. 把第一层Conv2D的参数改为Conv2D(32, (3,1), activation='relu', input_shape=input_shape, padding='same'),后续卷积层的第二个核尺寸也都改成1
  2. 输出层改为1个神经元用sigmoid激活,损失函数换成binary_crossentropy

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 12:06:08