将单标签分类器转换为多标签分类器

Posted

技术标签:

【中文标题】将单标签分类器转换为多标签分类器【英文标题】:Convert mono-label Classifier into multi-label classifier 【发布时间】:2018-12-26 18:02:15 【问题描述】:

大家好!

继续我的问题:我有一个简单的图像分类器 (2conv + 2fc),它在我的数据集 (95% acc) 上做得很好。但是,我被要求将其设为一个多标签分类器,这是通过更改来完成的:

self.cost  = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(
            labels=self.labels,
            logits=self.out) )

进入:

self.cost  = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits (
                labels=self.labels,
                logits=self.out) )

在相同的学习率下,我(我认为是)过度拟合导致所有输入的测试输出为 0(这真的很奇怪)。而且由于学习率较低,我在测试和训练中的准确度都非常差。

我的方法错了吗?或者我应该改变一些超参数? 谢谢!

编辑

经过一些测试,我可以更详细地说明我的问题。

我对两个分类器使用不同的精度公式,用于多类分类:

tf.equal(tf.argmax(self.net.labels, 1), tf.argmax(self.net.out, 1))

用于多标签分类:

correct_prediction = tf.equal(tf.round(self.net.output), tf.round(self.net.labels))
correct_prediction = tf.equal(tf.argmax(self.net.labels, 1), tf.argmax(self.net.out, 1))
self.accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

当我对两个模型都使用第一个公式时,它们都给了我很好的结果。

但是,带有多标签分类器的第二个公式给出了糟糕的结果。这是因为第二个模型学习最大化最有可能的输出,但最大输出的值太低,总是低于0.5。

【问题讨论】:

【参考方案1】:

是二分类问题吗? Sigmoid 只适用于二分类问题。

SoftmaxSigmoid 理论上是相同的,但实际上 softmax 的准确率最高可提高 1%。由于您的结果已从 95% 下降,这表明您向网络提供标签的方式存在其他问题,或者可能是网络本身的问题。

验证标签格式是否正确或网络存在任何固有问题。此外,使用 sigmoid 验证必须有 一个 输出,否则输出的数量就是类的数量。

【讨论】:

感谢您的回复。我编辑帖子。我希望这能让你更好地理解这个问题。顺便说一句,我的标签很好 你有几节课?多标签是什么意思? 我现在正在测试 10 个类。多标签意味着我的输出是非排他性的。对于给定的示例,输出可能同时是第 n°1 类和第 n°5 类。

以上是关于将单标签分类器转换为多标签分类器的主要内容,如果未能解决你的问题,请参考以下文章

将二进制分类转换为多标签?

转换为多标签分类

为多标签分类评估 DNNClassifier

Sklearn多分类 手写数字多分类 混淆矩阵 F1 多标签分类器 多输出分类器

为多类多标签分类构建混淆矩阵

为多标签分类生成 sklearn 指标的问题