基于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
相关产品推荐
相关产品推荐

