TensorFlow实现EfficientNet时是否存在数据标签标注错误问题?
问题排查与解决方案
1 优先确认标签是否正确
- 首先取消样本可视化代码的注释,运行后检查输出的9张图的标签是否和实际类别匹配,确认
image_dataset_from_directory读取的标签逻辑没有问题 - 检查代码中打印类信息的输出,确认
num_classes的值为3,class_names对应你设置的三个类别。如果num_classes为1,说明你的训练集目录结构错误:image_dataset_from_directory是从train_dir下的直接子文件夹读取类别,如果你把三个类别的文件夹放在了train_dir下的另一个子文件夹中,会被识别为只有1个类别 - 统计训练集全量标签分布,运行如下代码确认三类样本数符合你预期的12000、8000、12000:
import numpy as np labels = [] for _, batch_label in train_ds: labels.extend(batch_label.numpy()) print(np.unique(labels, return_counts=True))
如果输出只有一类标签,说明你的数据集目录结构配置错误,所有样本都被识别为了同一个类别。
2 独热编码逻辑验证
你提供的独热编码代码本身没有逻辑问题,可运行如下代码确认转换后的标签格式正确:
for imgs, onehot_labels in train_ds.take(1): print(onehot_labels[:10])
正常输出应该包含[1,0,0]、[0,1,0]、[0,0,1]三种格式的标签,如果只有同一种格式的独热码,说明上游标签读取环节已经出错。
3 其他可能问题排查
- 你在
image_dataset_from_directory中已经指定了image_size参数,后续额外的resize操作是多余的,可删除避免不必要的性能损耗,但该操作不会导致标签错误 - 检查你定义的
img_augmentation逻辑是否存在问题,比如是否将所有输入图像处理为了完全相同的内容,导致模型只能学到单一输出 - 如果标签确认完全正确,可先解冻部分EfficientNet的顶层参数参与训练,避免仅训练顶层时拟合能力不足或出现走捷径的情况
内容的提问来源于stack exchange,提问作者MontyP
相关产品推荐
相关产品推荐

