Keras图像分类模型训练报错:Shapes (None,)与(None,150,150,6)不兼容
解决Keras图像分类模型训练中的错误
核心问题分析
- Dense层误用:你的Dense层直接作用于
(150,150,3)的空间特征图,输出形状为(None,150,150,6),不符合图像分类任务中「单样本对应一组类别概率」的要求(正确输出应为(None,6))。必须先将空间维度的特征压缩为一维向量,才能接入分类用的Dense层。 - 损失函数与标签不匹配:数据集标签是整数类型(
shape=(64,)),但你使用了CategoricalCrossentropy——该损失函数要求输入one-hot编码的标签。针对整数标签,应使用SparseCategoricalCrossentropy。 - 缺失层导入:代码中使用了
CenterCrop、Rescaling等层,但未正确导入tensorflow.keras.layers模块,会导致运行时报错。
修正后的完整代码
import numpy as np import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers # 补充导入layers模块 FOLDER_PATH = 'dataset' dataset = keras.utils.image_dataset_from_directory( FOLDER_PATH, batch_size=64, image_size=(512, 384) ) # 输入形状匹配数据集的图像尺寸(也可保留(None,None,3),固定尺寸更直观) inputs = keras.Input(shape=(512, 384, 3)) x = layers.CenterCrop(height=150, width=150)(inputs) x = layers.Rescaling(scale=1.0 / 255)(x) # 新增全局平均池化层,将(150,150,3)压缩为一维特征向量 x = layers.GlobalAveragePooling2D()(x) outputs = layers.Dense(6, activation="softmax")(x) model = keras.Model(inputs=inputs, outputs=outputs) model.compile( optimizer=keras.optimizers.SGD(learning_rate=0.01), # 使用SparseCategoricalCrossentropy适配整数标签 loss=keras.losses.SparseCategoricalCrossentropy() ) model.fit(dataset, epochs=3)
关键修改说明
- 补充层导入:添加
from tensorflow.keras import layers,确保所有层类能被正确调用。 - 特征压缩:加入
GlobalAveragePooling2D()层,将空间特征图转换为一维向量,让Dense层输出每个样本的6类概率(形状为(None,6)),符合分类任务要求。你也可以用Flatten()层替代,但全局池化更能保留空间特征的全局信息,且参数更少。 - 损失函数替换:将
CategoricalCrossentropy改为SparseCategoricalCrossentropy,适配整数类型的标签,无需额外对标签做one-hot编码。 - 输入形状优化:将输入形状改为
(512,384,3),与数据集的图像尺寸一致,避免不必要的动态形状处理。
内容的提问来源于stack exchange,提问作者Allan Juan
相关产品推荐
相关产品推荐

