2

我为多标签分类构建了一个 CNN,即预测每个图像的多个标签。

我注意到 ImageNet 和许多其他数据集实际上每个标签都包含一组示例。他们构造数据的方式是,给定一个标签,有一个该标签的示例列表。即:标签 -> 图像列表。此外,我正在使用的 Keras 支持每个标签的文件夹的数据结构,并且在每个文件夹中都有一个图像列表作为标签的示例。

我担心的问题是许多图像实际上可能有多个标签。例如,如果我对一般对象进行分类,名为“汽车”的单个文件夹将包含汽车图像,但某些汽车图像中也会包含人(并且可能会妨碍“人”类的结果)。

我的第一个问题:1)这(即地面实况中每个图像的单个标签)会降低网络的潜在准确性吗?

如果是这种情况,我想改为创建以下形式的数据集: image1,{list of its labels} image2,{list of its labels} 等

2)这样的结构会产生更好的结果吗?

3)关于这方面的一篇好的学术论文是什么?

4

2 回答 2

1

这取决于您如何衡量准确性。具体来说,这取决于您使用的成本函数。假设您使用的是Softmax 输出层,您将获得类概率作为输出,即输出节点 c 将给出图像显示 c 类型对象的概率,使得所有概率加起来为 1。因此,您可以使用交叉熵成本函数对其进行训练,在这种情况下,您将只使用每个图像的一个“正确”标签,并隐式训练您的网络以最大化正确标签的预测概率。或者,您可以构建一个成本函数,使多个或所有标签的预测概率最大化。当您使用该模型预测单个最合适的标签时,第二种方法可能会导致性能略有下降,反之亦然。

人们在实践中所做的是第一种方法,即在一个最合适的标签上进行训练。由于您的网络仍然输出每个类别的概率,您可以检查“错误”分类的图像并检查您的网络的预测是否至少在有效标签中。这是开始的标准论文。还可以查看年度ImageNet 竞赛的网站。

于 2018-01-29T03:13:46.547 回答
0

您描述的问题是一个众所周知的多分类问题。而不是从预定义的集合中分配标签 - 如果要将其分配给给定的图像,您将分别为每个标签做出决定。

keras设置的情况下 - 您可以nb_of_classes使用sigmoid激活构建一个长度向量(使用 then 训练模型binary_crossentopy)或为每个类设置多个输出(如果每个标签有多个决策需要做出 - 例如预测一个类和一些其他值,则建议使用) .

要回答您的问题:

  1. 根据我的经验(并且知道通常的损失函数是如何工作的),如果你只为一个类设置训练——在理想情况下,这将导致分配 50%-50%(如果有两个基本事实类)、33%- 33%-33%(在三个基本事实类的情况下)等。如您所见 - 这可能会产生问题,例如设置分类阈值。我个人会选择sigmoid每个类都有单独输出的策略——记住——拥有关于图像的多条信息通常会带来更好的模型性能。

  2. 正如我之前提到的 - 提供多类可能会有所帮助,因为您正在提供例如隐式类相关性并在分配多类的情况下解决类冲突。

  3. 在这里,您有一篇关于您的案例的好论文。

于 2018-01-29T09:04:14.220 回答