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

训练口罩识别深度学习模型时出现ValueError的原因咨询

解决口罩识别模型训练的两个问题:弃用警告与形状不匹配错误

Hey there, let's break down your issues and fix them step by step!

1. 先处理Model.fit_generator弃用警告

/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:1940: UserWarning: Model.fit_generator已被弃用,将在未来版本中移除。请使用支持生成器的Model.fit。

这个问题很简单,TensorFlow在新版本里已经把生成器支持整合到Model.fit()里了,你只需要把代码里的model.fit_generator()直接改成model.fit()就行,参数完全不用调整,比如原来的:

model.fit_generator(training_set, validation_data=test_set, epochs=50)

改成:

model.fit(training_set, validation_data=test_set, epochs=50)

2. 核心错误:logits与labels形状不匹配

ValueError: logits和labels必须具有相同的形状 ((None, 2) vs (None, 1))

这个错误是因为你的模型输出(logits)和训练数据的标签形状不匹配,我们分两种常见场景来解决:

场景A:你的标签是单值二分类(0=不戴口罩,1=戴口罩)

如果你的训练数据标签是单个数值(形状为(None,1)),问题出在模型最后一层的输出维度:

  • 把模型最后一层的Dense(2)改成Dense(1, activation='sigmoid')
  • 确保你的损失函数用的是binary_crossentropy(这是二分类单标签的标准损失函数)

场景B:你的标签是One-Hot编码形式(比如[1,0]代表不戴,[0,1]代表戴)

如果你的标签应该是One-Hot编码(形状为(None,2)),问题可能出在数据生成器的配置:

  • 如果你用的是ImageDataGenerator的flow_from_directory方法,检查class_mode参数:把class_mode='binary'改成class_mode='categorical',这样生成器会输出One-Hot编码的标签
  • 模型最后一层保持Dense(2, activation='softmax'),同时把损失函数改成categorical_crossentropy

快速验证方法

你可以先打印一个批次的训练集标签形状,确认自己属于哪种场景:

# 取一个批次的数据查看标签形状
x, y = next(training_set)
print(y.shape)

根据输出的形状对应上面的方案调整即可。

内容的提问来源于stack exchange,提问作者harshit pal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:23:13