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

基于DNN的UCI葡萄酒分类任务中model.fit执行报错求助

UCI葡萄酒分类DNN训练报错解决

在使用深度神经网络完成UCI葡萄酒分类任务时,导入CSV数据集并重命名列得到data2后,执行model.fit()出现形状不兼容错误(ValueError: Shapes (None, 1) and (None, 3) are incompatible)。

核心问题分析

1. 数据集处理逻辑完全错误

你错误地将原数据的第一行数值当作列名,给新建的data2赋值列数据,导致data2所有行都是重复的第一行数据,完全没有用到完整数据集。正确做法是直接给原数据集指定列名,而非新建空DataFrame后错误赋值。

2. 模型激活函数设计错误

  • 隐藏层使用softmax不符合DNN常规设计,隐藏层应使用relu这类非线性激活函数
  • 多分类任务的输出层应使用softmax激活函数,而非relu

3. 损失函数与标签格式不匹配

使用categorical_crossentropy损失函数时,标签需要是独热编码格式,但当前y是一维整数标签,要么改用sparse_categorical_crossentropy,要么对y做独热编码。

4. 细节错误

  • 变量名拼写错误:定义S_scalr后写成S_scalar,会触发未定义错误
  • Sequential模型未导入:直接使用Sequential()但未从tensorflow.keras.models导入

修正后的完整代码

import pandas as pd
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 1. 正确导入并处理数据集
col = ['cultivars','Alcohol','Malic acid','Ash','Alcalinity of ash','Magnesium','Total phenols','Flavanoids','Nonflavanoid phenols','Proanthocyanins','Color intensity','Hue','OD280/OD315 of diluted wines','Proline']
# 原数据集无表头,直接指定列名
data = pd.read_csv("/content/drive/MyDrive/Datasets/wine.csv", header=None, names=col)

# 2. 划分特征与标签
x = data.drop('cultivars', axis=1)
y = data['cultivars']

# 3. 数据标准化
scaler = StandardScaler()
x = scaler.fit_transform(x)

# 4. 划分训练集与测试集(按70%比例划分更合理)
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=50)

# 5. 正确定义模型结构
model = Sequential()
# 隐藏层使用relu激活函数
model.add(tf.keras.layers.Dense(30, activation='relu', name='hidden1', input_shape=(13,)))
# 多分类输出层使用softmax激活函数
model.add(tf.keras.layers.Dense(3, activation='softmax', name='output'))

# 6. 编译模型:用sparse_categorical_crossentropy适配整数标签
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.01),
              loss=tf.keras.losses.sparse_categorical_crossentropy,
              metrics=['acc'])

# 7. 启动训练
model.fit(x_train, y_train, epochs=20, validation_split=0.1)

额外说明

  • 若坚持使用categorical_crossentropy,需要对标签做独热编码,可添加代码:
    # 葡萄酒标签是1/2/3,减1转为0/1/2适配独热编码
    y = tf.keras.utils.to_categorical(y - 1)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:38:13