我为多标签分类构建了一个CNN,即为每个图像预测多个标签。
我注意到ImageNet和许多其他数据集实际上包含每个标签的一组示例。他们构建数据的方式是给定标签,该标签有一个示例列表。即: 标签 - >图像列表。我正在使用的Keras支持每个标签的文件夹数据结构,并在每个文件夹中包含图像列表作为标签的示例。
我担心的问题是许多图像实际上可能有多个标签。例如,如果我正在对一般对象进行分类,则名为“Cars”的单个文件夹将包含汽车图像,但是汽车的某些图像也会包含人物(并且可能会阻碍“人物”类的结果。) p>
我的第一个问题: 1)这可能(即地面实况中每个图像的单个标签)会降低网络的潜在准确度吗?
如果是这种情况,我想到的是创建表单的数据集: image1,{标签列表} image2,{标签列表} 等
2)这样的结构会产生更好的结果吗?
3)关于这个问题,什么是好的学术论文?答案 0 :(得分:1)
这取决于您如何衡量准确度。具体而言,它取决于您使用的成本函数。假设您正在使用Softmax Output Layer,您将获得类概率作为输出,即输出节点c将给出图像显示类型c的对象的概率,使得所有概率加起来为1。因此,您可以使用Cross Entropy Cost Function训练它,在这种情况下,您将每个图像仅使用一个“正确”标签,并隐式训练您的网络以最大化正确标签的预测概率。或者,您可以构建成本函数,以最大化多个或所有标签的预测概率。当您使用该模型预测单个最合适的标签时,第二种方法可能会导致性能略有下降,反之亦然。
人们在实践中所做的是第一种方法,在一个最合适的标签上进行训练。由于您的网络仍然输出每个类的概率,您可以检查“错误”分类的图像,并检查您的网络预测是否至少在有效标签中。这是标准的paper。另请查看年度ImageNet competetion的网站。
答案 1 :(得分:0)
您描述的问题是众所周知的多分类问题。而不是从预定义的集合中分配标签 - 如果要将每个标签分配给给定的图像,则需要单独决定。
如果设置为keras
,您可以构建一个长度为nb_of_classes
的向量,其中sigmoid
激活(模型使用binary_crossentopy
进行训练)或设置多个输出(建议如果每个标签有多个决策要做 - 比如预测一个类和其他一些值)。
回答你的问题:
根据我的经验(并了解通常的损失函数如何工作)如果你只为一个班级设置培训 - 在理想情况下,这将导致分配50%-50%(如果有两个基本事实)课程),33%-33%-33%(如果有三个基本真相课程),等等。你可能会看到 - 这可能会产生问题,例如设置分类阈值。我个人选择具有单独输出的策略,每个类别sigmoid
- 记住 - 拥有关于图像的多条信息通常会导致更好的模型性能。
正如我前面提到的 - 提供多课程可能有所帮助,例如在分配多个类的情况下,隐式类关联和解决类冲突。
Here你的论文很好。