【问题标题】:azure machine learning workbench - High accuracy but very low confidence scoreazure 机器学习工作台 - 准确度高,但置信度分数非常低
【发布时间】:2019-01-07 06:33:18
【问题描述】:

我是机器学习的新手,所以在回答之前请记住这一点。 我在尝试使用 CNTK 和 ResNet 模型在工作台中训练神经网络时遇到了挑战。 我遵循了 azure 提供的本教程 [1]https://docs.microsoft.com/en-us/azure/machine-learning/desktop-workbench/scenario-image-classification-using-cntk

我的第一个数据集是 ImageNet 的一个子集,由 900 张图像组成,有 4 个不同类别的汽车、公共汽车、货车和卡车。之后,我使用了下面链接中提供的数据集的一个子集。 [2]http://podoce.dinf.usherbrooke.ca/challenge/dataset/

我使用了数据集的 9000 张图像,将其平均分为四个不同的类别,与 ImageNet 相同,然后开始训练我的网络。

我使用的分类器是具有以下配置的 DNN 分类器:

 rf_pretrainedModelFilename = "ResNet_50.model" 
 rf_inputResoluton = 224                
 rf_dropoutRate    = 0.5                 
 rf_mbSize         = 10               
 rf_maxEpochs      = 30                
 rf_maxTrainImages = float('inf')        
 rf_lrPerMb        = [0.01] * 10 + [0.001] * 10 + [0.0001] 
 rf_momentumPerMb  = 0.9                 
 rf_l2RegWeight    = 0.0005              
 rf_boFreezeWeights      = False         
 rf_boBalanceTrainingSet = False          images

训练模型后,我得到了 96.80% 的总体准确率,所有类别的准确率 > 92%。一切都很好,但是当我测试其他各种测试图像时,我的置信度得分是最高的 12.9895。我得到一个像这样返回的 JSON 对象: 图片分类为“巴士”,置信度得分为 12.9895。

     {\"score\": \"12.9895\", \"Id2Labels\": \"{0: 'Bus', 1: 'Truck', 2: ' 
  Car', 3: 'Van'}\", \"label\": \"Bus\", \"executionTimeMs\": \"128.749\", 
  \"allScores\": \"[ 12.98949814   3.51014233  -6.96435881  -6.89878178]\"}"
  • 值 12.9895 必须意味着图像是公共汽车的 12.9895% 可能性,对吗?为什么它不作为 0 和 1 之间的值返回?如果我错了,请纠正我,因为我确实对机器学习中用于同一事物的各种术语感到困惑。
  • 为什么会有负值,我以为激活函数会处理负值?
  • 我应该包含更大的数据集还是更好的图像质量来提高我的分数?
  • 对于如何提高我的分数还有其他建议吗?

提到的两个数据集上的得分都较低(来自 ImageNet 和 MIO 的子集)。 衷心感谢您抽出宝贵时间回答这些问题。

【问题讨论】:

    标签: python azure azure-machine-learning-studio cntk


    【解决方案1】:

    评分也称为预测,是在给定一些新输入数据的情况下,基于经过训练的机器学习模型生成值的过程。创建的值或分数可以代表对未来值的预测,但它们也可能代表可能的类别或结果。分数的含义取决于您提供的数据类型以及您创建的模型类型。

    分数不能以 1 和 0 的形式返回,因为根据您提供的数据,有 12.9895% 的概率确定这是一辆公共汽车。因此,您必须编写代码以将值返回为 1 和 0。

    Read Here 更多关于分数的信息。

    对于激活,您必须使用 ReLU 激活函数。整流线性单元 (ReLU) 函数,将负值设置为 0,不理会其他值。

    Here 是实现的一个示例。

    对于公共汽车的图像,您可以尝试放置公共汽车或其他车辆的不同图像,质量越好,您生成的分数越多,但这取决于逻辑。在您的代码中将其定义为公共汽车或卡车。

    你试过this吗?

    【讨论】:

    • 嗨,当您在他们的笔记本服务器中运行 showResults.py 时,您会在同一网络中获得 0 到 1 之间的分数。 [链接]docs.microsoft.com/en-us/azure/machine-learning/… 将其部署到 Web 服务后,分数会更改以允许更高的值。它只是令人困惑。 score 模型似乎只适用于 azure ml studio。关于代码中bus或truck的定义,本教程只介绍Hyperparameter中的配置。
    【解决方案2】:

    我认为对于 allScores 数组的含义存在误解。该数组包含网络最终分类层的原始输出,但它们不代表概率,并且可以取任何实际值,甚至如您所见的负值。要将这些值转换为概率,您需要将 softmax function 应用于数组,这将为您提供以下值:

    [9.99923588e-01, 7.64073070e-05, 2.15832503e-09, 2.30460548e-09]

    Id2Labels 字段告诉您此数组中的第 0 个索引/第一个元素对应于“总线”类。因此,您的模型以 >99.99% 的概率预测该图像是一辆公共汽车。下一个最可能的标签是“卡车”(数组的第二个元素)。

    如果 deploymain.py 被编写为在返回结果之前将 softmax 应用于原始分数会更方便,尽管我认为当前的实现在技术上没有任何问题。

    【讨论】:

    • 嘿对不起,期待已久的答案。我不太确定如何将总线的 12.98949814 分数转换为 9.99923588e-01?我仍然得到其他标签卡车的汽车图像。所以有些事情比添加 softmax 更重要。概率和预测分数有什么区别?感谢您抽出宝贵的时间回答
    • 我想通了。他们甚至在 showResult.py 中使用 softmax 作为默认值。有趣的是他们没有将它用于分数数组,你几乎找不到任何关于这个问题的文档
    猜你喜欢
    • 2017-06-24
    • 2020-10-16
    • 2021-03-28
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多