首页 文章

在caffe中测试回归网络

提问于
浏览
0

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

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

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

我使用imagenet创建脚本为此数据集创建lmdb文件 . 哪个成功将我的图像集转换为lmdb . 作为一个例子,Alexnet被转换为回归模型,通过引入EucledeanLosslayer而不是Softmax Layer来学习图像中的对象数量 . 正如许多人所说 . 网络的其余部分是相同的 .

但是,尽管做了以上所有操作,当我运行模型时,在测试阶段我只收到零作为输出(如下所示) . 它没有学到任何东西 . 然而,训练损失在每次迭代中持续下降 .

我不明白我犯了什么错误 . 任何人都可以指导我为什么预测值总是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"
 }

2 回答

  • 3

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

    实际上,给定网络图像,网络中的 Accuracy 层将始终对其输入数组进行排序(此处为 bottom: "fc8reg" ),并默认选择数组中最大值的索引作为预测标签 .

    fc8reg 层中的 num_output == 1 以来, accuracy 层将始终预测输入图像的索引0作为其预测标签 .

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


    如果要在训练后打印并计算回归值,并计算回归网络的准确度,您只需编写 RegressionAccuracy 层,如this .

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

  • 0

    在我看来,一切都是正确的,但你的网络没有收敛,这不是一个罕见的hapenning . 您的网络实际上正在收敛到零输出!也许你的大多数样品都有0作为标签 .

    另外,不要忘记仅在TRAIN期间包含损失层;否则,它将学习测试数据 .

相关问题