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

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)

关键修改说明

  1. 补充层导入:添加from tensorflow.keras import layers,确保所有层类能被正确调用。
  2. 特征压缩:加入GlobalAveragePooling2D()层,将空间特征图转换为一维向量,让Dense层输出每个样本的6类概率(形状为(None,6)),符合分类任务要求。你也可以用Flatten()层替代,但全局池化更能保留空间特征的全局信息,且参数更少。
  3. 损失函数替换:将CategoricalCrossentropy改为SparseCategoricalCrossentropy,适配整数类型的标签,无需额外对标签做one-hot编码。
  4. 输入形状优化:将输入形状改为(512,384,3),与数据集的图像尺寸一致,避免不必要的动态形状处理。

内容的提问来源于stack exchange,提问作者Allan Juan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:15:28