【问题标题】:Testing a regression network in caffe在 caffe 中测试回归网络
【发布时间】:2017-02-06 23:42:06
【问题描述】:

我正在尝试使用 Alexnet 计算图像中的对象。

我目前的图像每张图像包含 1、2、3 或 4 个对象。对于初次检查,我每班有 10 张图片。例如在训练集中我有:

image  label
image1  1
image2  1
image3  1
...
image39 4
image40 4

我使用 imagenet create 脚本为这个数据集创建了一个 lmdb 文件。这成功地将我的一组图像转换为 lmdb。 例如,Alexnet 通过引入 EucledeanLosslayer 而不是 Softmax 层,将其转换为用于学习图像中对象数量的回归模型。正如许多人所建议的那样。网络的其余部分是相同的。

但是,尽管执行了上述所有操作,但当我运行模型时,我在测试阶段仅收到零作为输出(如下所示)。它没有学到任何东西。但是,每次迭代中训练损失不断减小。

我不明白我犯了什么错误。谁能指导我为什么预测值总是0?以及如何检查测试阶段的回归值,以便检查有多少样本是正确的以及我的每张图像的值是多少?

测试数据集的预测标签和实际标签如下:

I0928 17:52:45.585160 18302 solver.cpp:243] Iteration 1880, loss = 0.60498
I0928 17:52:45.585212 18302 solver.cpp:259]     Train net output #0: loss = 0.60498 (* 1 = 0.60498 loss)
I0928 17:52:45.585225 18302 solver.cpp:592] Iteration 1880, lr = 1e-06
I0928 17:52:48.397922 18302 solver.cpp:347] Iteration 1900, Testing net (#0)
I0928 17:52:48.499543 18302 accuracy_layer.cpp:88] Predicted_Value: 0 Actual Label: 1
I0928 17:52:48.499641 18302 accuracy_layer.cpp:88] Predicted_Value: 0 Actual Label: 2
I0928 17:52:48.499660 18302 accuracy_layer.cpp:88] Predicted_Value: 0 Actual Label: 3
I0928 17:52:48.499681 18302 accuracy_layer.cpp:88] Predicted_Value: 0 Actual Label: 4
...

注意:我还创建了 hdf5 格式文件,以便具有浮动标签,即 1.0、2.0、3.0 和 4.0。但是,当我将数据层更改为 HDF5 类型时,我无法像在具有 lmdb 层的 alexnet 中那样裁剪图像以进行数据增强,以及标准化。我将“https://github.com/nikogamulin/caffe-utils/blob/master/hdf5/demo.m”上给出的脚本用于 hdf5 数据,并按照他的步骤在我的模型中使用它。

我已经更新了最后一层:

layer {
   name: "fc8reg"
   type: "InnerProduct"
   bottom: "fc7"
   top: "fc8reg"
   param {
    lr_mult: 1
    decay_mult: 1
   }
   param {
     lr_mult: 2
     decay_mult: 0
   }
   inner_product_param {
   num_output: 1
   weight_filler {
       type: "gaussian"
       std: 0.01
   }
   bias_filler {
       type: "constant"
       value: 0
   }
   }
 }
 layer {
   name: "accuracy"
   type: "Accuracy"
   bottom: "fc8reg"
   bottom: "label"
   top: "accuracy"
   include {
     phase: TEST
   }
 }
 layer {
   name: "loss"
   type: "EuclideanLoss"
   bottom: "fc8reg"
   bottom: "label"
   top: "loss"
 }

【问题讨论】:

  • 您是否对 alexnet 进行了任何更改?
  • @AHA 我添加了一个 euclideonloss 层用于回归目的。并移除了 softmax 层。
  • 而且最后的输出也只有 1,因为我对每张图片都有一个值。
  • 请发布您网络的最后一层。看起来有些不对劲。
  • @AHA 你现在可以检查一下,我已经通过添加最后一个全连接层和损失层来更新问题。感谢您的快速回复。

标签: machine-learning neural-network regression caffe conv-neural-network


【解决方案1】:

在不判断您的网络是否发散的情况下,您所犯的明显错误是您不应该使用Accuracy 层来测试回归网络。它仅用于测试由SoftmaxWithLoss 层训练的分类网络。

实际上,给定一个网络的图像,网络中的Accuracy层总是会对其输入数组(这里是bottom: "fc8reg")进行排序,并选择数组中最大值的索引作为预测标签默认情况下。

由于fc8reg 层中的num_output == 1accuracy 层将始终预测输入图像的索引 0 作为其预测标签,如您所见。

最后,您可以使用EuclideanLoss 层来测试您的回归网络。这个similar problem也可能会给你一些提示。


如果你要打印和计算训练后的回归值,并统计回归网络的准确率,你可以像this一样简单地写一个RegressionAccuracy层。

或者,如果您的目标标签只有 4 个离散值 {1,2,3,4},您仍然可以为您的任务训练分类网络。

【讨论】:

  • 我同意回归不需要准确层。我只是用它来预测网络的输出。我也检查了您提到的类似问题。但是,现在我的问题是,如何在测试阶段检查回归值,以便检查有多少样本是正确的以及我的每张图像的值是多少?
  • @khan 我已经为你的新问题更新了我的答案。
  • 让我再检查一下,因为我收到一个错误。可能是这个。
  • 现在可以了,但是有两点。首先,如果我在 trianing 中使用单独的 euclideanloss 层并在测试中使用该层,它会给出错误。其次,如果我只将这一层用于训练和测试,而不是在训练中,预测值甚至是浮动的。但在测试中,预测值始终为 0。您认为它尚未正确训练还是我们必须在这个新层中更改一些变量。
【解决方案2】:

在我看来,一切都是正确的,但您的网络没有融合,这并不罕见。您的网络实际上正在收敛到零输出! 也许您的大多数样本的标签都为 0。

别忘了只在 TRAIN 期间包含损失层;否则,它也会学习测试数据。

【讨论】:

  • AFAIK,在 TEST 阶段没有反向传播,所以 TEST 阶段有损失层应该没有问题:它只会报告测试损失,但不会更新权重(=不学习测试数据)。
猜你喜欢
  • 2020-03-08
  • 2018-05-29
  • 2017-02-16
  • 2017-01-17
  • 2017-09-01
  • 2017-09-07
  • 2019-01-27
  • 2018-12-02
  • 1970-01-01
相关资源
最近更新 更多