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

如何让数组样本数一致?Keras-CNN糖尿病预测维度报错求助

解决糖尿病预测CNN模型中的数据基数不匹配错误

问题根源

你遇到的ValueError核心原因是输入数据X的样本数与标签y的样本数完全不匹配:

  • 原始糖尿病数据集(如Pima Indians数据集)包含768个样本,因此标签y的长度是768
  • 你错误地将X重塑为(8, 768, 1),这导致X仅被识别为8个样本,每个样本有768个特征,和y的768个样本数量无法对应

除此之外,代码还有两处关键问题需要修正:

  • 针对二分类任务(Outcome为0/1),输出层和损失函数的选择不符合任务需求
  • 预测时的输入格式不满足模型的要求

分步解决方案

1. 正确重塑输入数据

糖尿病数据集是表格型数据,每个样本有8个特征。要适配Conv2D的输入格式,需要将每个样本转换为伪2D结构,正确形状应为(样本数, 特征维度1, 特征维度2, 通道数)。

将X的重塑代码改为:

X = X.values.reshape(-1, 8, 1, 1)  # -1会自动计算样本数(768),最终形状为(768, 8, 1, 1)

同时同步修改Conv2D层的input_shape参数,确保与输入数据的单样本形状一致:

model.add(Conv2D(32, kernel_size=(2, 1), activation="relu", input_shape=(8, 1, 1)))

2. 修正输出层与损失函数

因为是二分类任务:

  • 输出层应使用Dense(1, activation='sigmoid'),输出0-1之间的概率值,直接对应是否患病的概率
  • 损失函数改用binary_crossentropy,适配二分类场景

3. 修正预测输入格式

model.predict要求输入与训练数据形状一致的数组,不能直接传入零散数值。需要将预测数据整理成数组后重塑:

import numpy as np
# 构造预测样本数组
test_sample = [[10, 139, 80, 0, 0, 27.1, 1.441, 57]]
# 重塑为与训练数据相同的形状
test_sample = np.array(test_sample).reshape(-1, 8, 1, 1)
# 执行预测
prediction = model.predict(test_sample)

修改后的完整代码

import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten

# 读取数据集
data = pd.read_csv("diabetes.csv")

# 分离输入特征与标签
X = data.drop(columns=['Outcome'])
y = data['Outcome']

# 正确重塑输入数据以适配Conv2D
X = X.values.reshape(-1, 8, 1, 1)

# 构建模型
model = Sequential()
# 卷积层:输入形状匹配单样本结构
model.add(Conv2D(32, kernel_size=(2, 1), activation="relu", input_shape=(8, 1, 1)))
model.add(Flatten())
model.add(Dense(64, activation="relu"))
# 二分类输出层
model.add(Dense(1, activation="sigmoid"))

# 编译模型,使用二分类专用损失函数
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])

# 训练模型,建议指定训练轮次和批量大小
model.fit(X, y, epochs=10, batch_size=16)

# 执行预测
test_sample = np.array([[10, 139, 80, 0, 0, 27.1, 1.441, 57]]).reshape(-1, 8, 1, 1)
prediction = model.predict(test_sample)
print(f"患病概率:{prediction[0][0]:.4f},预测结果:{'糖尿病' if prediction[0][0]>0.5 else '非糖尿病'}")

额外说明

表格型数据更适合用全连接神经网络(DNN)处理,CNN擅长的是带有空间结构的数据(如图像)。如果想简化模型,可以直接去掉Conv2D和Flatten层,此时无需重塑X,直接使用X.values作为输入即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:10:36