TensorFlow模型训练报Shapes(None,22)与(None,10)不兼容如何修复
报错根因
- 输出层维度与标签维度不匹配:模型最后一层设置为
Dense(10, activation=tf.nn.softmax),对应输出10维分类结果,但传入的标签y最后一维长度为22,计算交叉熵损失时维度无法对齐,直接触发形状不兼容报错。 - 标签格式不符合损失函数要求:代码中导入了
to_categorical但未使用,categorical_crossentropy损失要求输入独热编码格式的标签,原始标签无法直接传入。 - 数据处理逻辑错误:将表格数据reshape为
(3,1066,22)的写法完全不符合建模逻辑,第一维设为3代表整个数据集仅3个样本;后续用re_df[:, 3]取特征、re_df[:,-1]取标签的索引规则错误,无法得到“单样本对应特征+标签”的正确结构。 - 依赖缺失:代码全程调用
tf.keras相关接口,但未导入TensorFlow库,运行时会触发tf未定义的错误。
修复步骤
- 补全TensorFlow导入语句
- 修正数据reshape、特征与标签切分逻辑:reshape时第一维设为
-1让numpy自动计算总样本量,单独拆分出特征列和标签列,不要混同索引 - 按实际分类类别数修改输出层神经元数量:从标签维度判断任务共22个类别,最后一层Dense的输出维度改为22
- 对标签做独热编码,适配
categorical_crossentropy的输入要求;如果不想做独热编码,也可以直接将损失函数替换为sparse_categorical_crossentropy,直接传入整数格式标签即可
修复后可运行代码
# Loading required packages import time import sympy import numpy as np import seaborn as sns import collections import pandas as pd import tensorflow as tf from sklearn.datasets import fetch_openml from sklearn.model_selection import train_test_split from tensorflow.keras.utils import to_categorical %matplotlib inline import matplotlib.pyplot as plt # 读取并清洗数据 df = pd.read_csv('/home/Table.csv', dtype=np.float32) df = df.dropna() # 拆分标签与特征,将label替换为你表格里实际的标签列名 y = df['label'].values X = df.drop(['id', 'label'], axis=1).values # 如果特征需要调整维度可自行reshape,一维特征可省略这步 # X = X.reshape(-1, 单样本特征维度) # 标签做独热编码,num_classes设为实际类别总数22 y = to_categorical(y, num_classes=22) # 拆分训练测试集 x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 搭建模型 model = tf.keras.models.Sequential() # Flatten层指定输入维度,和特征维度对齐 model.add(tf.keras.layers.Flatten(input_shape=(x_train.shape[1],))) model.add(tf.keras.layers.Dense(40, activation=tf.nn.relu)) model.add(tf.keras.layers.Dense(20, activation=tf.nn.relu)) # 输出层维度和类别数对齐,设为22 model.add(tf.keras.layers.Dense(22, activation=tf.nn.softmax)) # 编译模型 model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"]) # 启动训练 history = model.fit(x=x_train, y=y_train, epochs=5, validation_split=0.3)
提示:如果你的标签本身就是0-21的连续整数,不想做独热编码,可以直接把编译阶段的loss参数改为
sparse_categorical_crossentropy,跳过to_categorical处理步骤即可。
内容的提问来源于stack exchange,提问作者Gillian
相关产品推荐
相关产品推荐

