Keras多分类CNN报错:目标形状不匹配,求修复方案
修复CNN多分类任务中的形状不匹配错误
这个错误我之前也碰到过,核心问题非常明确:你的模型最后一层定义的输出类别数(由classes_num变量指定)和数据集实际包含的类别数量不匹配。模型期望每个样本的标签是3维的one-hot向量(对应3个类别),但你的数据生成器实际输出的是9维的one-hot向量——这说明你的数据集里一共有9个类别。
下面是具体的修复步骤:
1. 先确认数据集的真实类别数
不用手动去数文件夹里的类别,flow_from_directory方法会自动帮你统计,你可以在创建完train_generator后添加一行代码查看:
train_generator = train_datagen.flow_from_directory( train_data_path, target_size=(img_height, img_width), batch_size=batch_size, class_mode='categorical' ) # 打印真实类别数 print("数据集实际类别数量:", train_generator.num_classes)
运行后你会看到输出是9,这就是问题的核心所在。
2. 修正模型的输出层
把模型最后一层Dense层的units参数改成数据集的真实类别数,推荐直接用生成器的num_classes属性,避免手动设置出错:
# 替换原来的 classes_num 为 train_generator.num_classes model.add(Dense(train_generator.num_classes, activation='softmax'))
如果你想保留classes_num变量,也可以先赋值再使用:
classes_num = train_generator.num_classes model.add(Dense(classes_num, activation='softmax'))
3. 验证其他参数的一致性
- 你已经设置了
class_mode='categorical',对应的损失函数categorical_crossentropy是完全正确的,这部分不需要修改; - 另外,训练时的
samples_per_epoch和validation_steps也建议用生成器的属性自动计算,避免手动设置的数值和实际数据量不匹配:samples_per_epoch = train_generator.samples // train_generator.batch_size validation_steps = validation_generator.samples // validation_generator.batch_size
额外提醒
如果之前你是手动把classes_num设为3,那就是这里和数据集的9个类别冲突了。以后处理这类任务时,尽量用生成器的自动统计功能来获取类别数,能减少很多手动配置的错误。
内容的提问来源于stack exchange,提问作者Thanh Nguyen
相关产品推荐
相关产品推荐

