【问题标题】:Caffe predicts same class regardless of image无论图像如何,Caffe 都预测相同的类别
【发布时间】:2015-11-21 20:44:59
【问题描述】:

我modified the MNIST example,当我用我的 3 个图像类训练它时,它返回的准确率为 91%。但是,当我使用deploy prototxt 文件和labels file 修改C++ example 并尝试在某些图像上对其进行测试时,无论我使用什么图像,它都会以1.0 的概率返回第二类(1 个圆圈)的预测给它 - 即使它是在训练集中使用的图像。我已经尝试了十几个图像,它始终只预测一个类。

为了澄清事情,在我修改的 C++ 示例中,我确实缩放了要预测的图像,就像在训练阶段缩放图像一样:

img.convertTo(img, CV_32FC1);
img = img * 0.00390625;

如果这是正确的做法,那么我会怀疑我是否在我的 deploy_arch.prototxt 文件中计算概率的输出层做错了什么。

【问题讨论】:

    标签: machine-learning computer-vision neural-network deep-learning caffe


    【解决方案1】:

    我认为您忘记在分类时缩放输入图像,如 train_test.prototxt 文件的第 11 行所示。您可能应该在 C++ 代码中的某处乘以该因子,或者使用 Caffe 层来缩放输入(为此查看 ELTWISE 或 POWER 层)。

    编辑:

    在 cmets 中进行对话后发现,在分类.cpp 文件中错误地减去了图像均值,而在原始训练/测试管道中没有减去它。

    【讨论】:

    • 感谢您查看,在我修改的 C++ 示例中,我确实在第 248 行包含了这些代码行来尝试扩展它,这看起来正确吗? img.convertTo(img, CV_32FC1); img = img * 0.00390625;如果这是正确的做法,那么我会怀疑我在 deploy_arch.prototxt 文件中计算概率的输出层是否做错了。
    • 其实我发现了另一个错误(我认为)。在 Argmax(第 89 行)中,您正在执行 partial_sort,但按照 升序 顺序排序,因此您得到的类是 最低 概率类而不是最高概率.
    • 划掉最后一条评论。我看到你有一个不同的 PairCompare 类。
    • 嗯。我知道了。您可以尝试在 Preprocess 之前输出 cv::Mat 以验证它确实在正确的范围内(理想情况下应该是 [0,1])吗?
    • 啊,我明白了。我认为这是因为代码从 mean.binaryproto 文件中减去平均值。您不应该这样做,因为您在原始 train_test.prototxt 中没有任何平均减法。尝试将第 219 行更改为 cv::split(sample_resized, *input_channels);,看看是否能解决问题。
    【解决方案2】:

    您的火车班次均衡吗? 您可能会根据一个主要类别的预测进入堆叠网络。 为了找到问题,我建议在训练期间输出火车预测,与来自不同类的相同火车图像的前向示例的预测进行比较。

    【讨论】:

    • 我的三个班级正在使用 7671(圆形)、7278(矩形)、2113(空白)图像进行训练。我可以理解空白标签图像是否有问题,但圆形和矩形在训练文件的数量方面非常相似。我应该在我的训练/测试 prototxt 文件 (github.com/jackbrucesimpson/caffe_tests/blob/master/…) 中添加什么以使其输出概率?
    猜你喜欢
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2014-12-13
    • 2010-11-03
    相关资源
    最近更新 更多