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

基于Inception模型的多类别图像分类标签与数据集设计问询

多类别共存图像的分类标签设计与实践

首先明确说:你提到的[0.5,0.5,0,...]并不适合作为真实标注标签,这是模型输出的概率值范畴,而非ground truth的正确表达方式。针对包含多个类别(比如同时有米饭和鸡肉)的图像,我们需要用**多标签分类(Multi-label Classification)**的思路来设计标签,下面一步步给你拆解:

一、为什么不能用[0.5,0.5,...]作为真实标签?

真实标签是对图像内容的客观标注:要么存在某类,要么不存在。0.5这种概率值会让模型混淆——它无法区分“两个类别都存在”和“不确定类别”这两种完全不同的情况。我们需要给模型明确的信号:哪些类别是确实出现在图像里的。

二、合理的标签设计方案

针对你的米饭+鸡肉共存的场景,正确的标签设计应该是二元向量:

  • 假设你的分类任务有2个核心类别(索引0=米饭,1=鸡肉),其他类别为0(不存在):
    • 仅含米饭的图像:[1, 0]
    • 仅含鸡肉的图像:[0, 1]
    • 同时含米饭和鸡肉的图像:[1, 1]
    • 都不含的图像(如果有的话):[0, 0]

这种设计的本质是把每个类别当成独立的二分类任务:模型需要判断每个类别是否存在于图像中,而非从多个类别里选一个。

三、配套的模型与损失函数调整

光改标签还不够,模型的输出层和损失函数也要对应调整:

  • 输出层激活函数:用sigmoid替代softmax。因为sigmoid会为每个类别输出0-1的概率(表示该类存在的可能性),而softmax会强制所有类别概率和为1,这不符合多标签的独立判断逻辑。
  • 损失函数:用二元交叉熵(Binary Cross Entropy),对每个类别的预测结果单独计算损失后求和,这样模型能同时优化多个类别的判断。

四、相关实践案例

这种多标签分类的思路在行业内非常常见:

  • 比如COCO数据集的图像分类任务,大量图像包含多个物体,标注时就是用二元向量标记所有存在的物体类别,模型训练时采用上述的sigmoid+二元交叉熵方案。
  • 谷歌在多标签场景(比如场景分类、细粒度物体分类)中也广泛使用这种方式,比如他们的一些图像理解模型会同时识别图像中的多个元素,标签就是多维度的二元值。

五、你的测试数据集代码修改建议

你当前的代码是把每个图像对应到单个类别(keycnt),这是单标签分类的处理方式,不适合多类别共存的场景。需要调整标签生成逻辑,假设你的json_data_test里每个imagedata包含该图像的类别列表(比如imagedata["labels"]存储[0,1]这样的类别索引),修改后的代码如下:

keycnt = 0 
imagcnt = 0 
TestNumber_byclass = np.zeros([keycount], np.int32) 
# 定义总类别数,这里是2(米饭、鸡肉)
num_classes = 2

for key in TestKeys: 
    TestNumber_byclass[keycnt] = len(json_data_test[key]) 
    for imagedata in json_data_test[key]: 
        imgdata = tf_resize_images(imagdir + imagedata + '.jpg') 
        imgdata = np.array(imgdata, dtype = np.uint8) 
        
        # 生成多标签的二元向量
        label = np.zeros(num_classes, dtype=np.float32)
        # 遍历当前图像包含的所有类别,设置对应位置为1
        for cls_idx in imagedata["labels"]:
            label[cls_idx] = 1.0
        
        h5f = h5py.File(h5filedir_test + str(imagcnt) + ".h5", "w") 
        h5f.create_dataset('image', data=imgdata) 
        h5f.create_dataset('label', data=label)  # 现在存储的是二元标签向量
        h5f.create_dataset('name' , data=key) 
        h5f.close() 
        imagcnt += 1 
    keycnt +=1 
    message = '\r[%d/%d] progress...' % (keycnt,keycount) 
    sys.stdout.write(message) 
    sys.stdout.flush()

这样处理后,你的数据集就能正确支持多标签分类任务了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:15:42