深度学习入门求助:Logits与Labels不可广播错误排查
Hey there! Let's break down what's going wrong here and fix your training issues step by step.
1. 核心错误:输出层与类别数量不匹配
你遇到的 logits and labels must be broadcastable 报错,根源是模型输出层的神经元数量和你的数据集类别数完全不匹配。从错误信息 labels_size=[214,173] 能看出,你的动漫插画数据集有173个类别,但你的模型最后一层只定义了2个神经元:
x = Dense(2, activation='softmax')(x)
这就导致模型输出的预测结果(logits)维度是 [batch_size, 2],而真实标签的维度是 [batch_size, 173],二者无法对应计算损失函数,直接触发了广播不兼容的错误。
修复方法:把输出层的神经元数量改成和你数据集类别数一致的173:
x = Dense(173, activation='softmax')(x)
2. 预训练模型的冗余参数优化
你初始化InceptionV3时加了 classes=173 参数,但因为设置了 include_top=False,这个参数其实是无效的——include_top=False 会直接去掉预训练模型的顶层分类层,所以 classes 在这里不会起任何作用。可以删掉这个参数,让代码更简洁:
pre_trained_model = InceptionV3(input_shape=(75, 75, 3), include_top=False, weights='imagenet')
3. 恢复验证集的监控作用
你注释掉了 validation_generator 的代码,建议把它恢复并在训练时加入验证数据——这能帮你实时监控模型的泛化能力,避免过拟合:
validation_generator = train_datagen.flow_from_directory( train_dir, # 用训练目录配合subset='validation'即可,无需单独的验证目录 target_size=(75,75), batch_size=37, class_mode='categorical', subset='validation')
然后在 fit 函数中恢复验证数据的传入:
history_TL = model_TL.fit( train_generator, steps_per_epoch=10, epochs=60, verbose=2, validation_data=validation_generator)
4. 输入尺寸的小建议
InceptionV3的默认输入尺寸是299x299,你现在用的是75x75。虽然TensorFlow支持自定义输入尺寸,但过小的尺寸可能会削弱预训练模型的特征提取能力——毕竟模型的卷积核是针对更大尺寸的图像设计的。如果你的硬件性能允许,建议把 target_size 改成 (299,299),可能会明显提升模型的训练效果。
5. 训练参数的合理性检查
steps_per_epoch=10 这个数值需要确保等于训练样本总数 // batch_size。比如如果你的训练集有2140个样本,batch_size是214,那10是合理的;如果样本数不是这个比例,建议计算准确的 steps_per_epoch,否则训练时可能会提前结束或者重复训练部分数据。
最后验证
修改完输出层后,再运行 model.summary(),确认最后一层的输出维度是 (None, 173),这样就能和你的标签维度完美匹配了。
内容的提问来源于stack exchange,提问作者NSaibot

