python - 将单标签分类器转换为多标签分类器
问题描述
嗨,大家好 !
继续我的问题:我有一个简单的图像分类器 (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。
解决方案
是二分类问题吗?Sigmoid仅适用于二元分类问题。
Softmax和Sigmoid理论上是相同的,但实际上 softmax 最多可以提高 1% 的精度。由于您的结果已从 95% 下降,这表明您向网络提供标签的方式存在其他问题,或者可能是网络本身的问题。
验证标签格式是否正确或网络存在任何固有问题。此外,使用 sigmoid 验证必须有一个输出,否则输出的数量就是类的数量。
推荐阅读
- sql - 如何聚合序列中具有相同值的行数?
- python - 给定一个字符串,我如何检查它是否是一个浮点数?
- ubuntu - 在 Linux -Ubuntu 服务器上启动 katalon Studio
- php - 将图像上传到数据库时出现未定义的索引错误
- python - 需要编辑具有root权限的文件
- c# - 如何在 Win-forms C# 中禁用数据网格的滚动
- react-redux - 使用 async/await 代替 (.then)
- javascript - 如何使用 React Native 本地化更改语言?
- react-native - 在 Postman 上将图像上传到 S3 有效,但是当我使用 React Native Image Picker 时它不起作用
- javascript - ng-init 最初没有获取范围值