首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >caffe中的回归网络测试

caffe中的回归网络测试
EN

Stack Overflow用户
提问于 2016-09-28 20:16:55
回答 2查看 1.2K关注 0票数 0

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

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

代码语言:javascript
复制
image  label
image1  1
image2  1
image3  1
...
image39 4
image40 4

我使用imagenet脚本为这个数据集创建一个lmdb文件。成功地将我的一组图像转换为lmdb。以Alexnet为例,通过引入EucledeanLosslayer而不是软最大层,将图像中的对象数转化为一个回归模型。正如许多人所建议的。网络的其他部分是一样的。

然而,尽管这样做,当我运行模型时,在测试阶段只接收到0作为输出(如下所示)。它没有学到任何东西。然而,训练损失在每一次迭代中都持续下降。

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

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

代码语言:javascript
复制
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类型时,我无法像在alexnet中使用lmdb层那样对图像进行裁剪以进行数据增强,也无法进行规范化。我使用了在"https://github.com/nikogamulin/caffe-utils/blob/master/hdf5/demo.m“上给出的脚本来处理hdf5数据,并按照他在我的模型中使用它的步骤。

我已经更新了最后几层内容:

代码语言:javascript
复制
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"
 }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-13 06:09:02

如果不判断您的网络是否有分歧,您所犯的明显错误就是不应该使用Accuracy层来测试回归网络。它只用于测试由SoftmaxWithLoss层训练的分类网络。

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

由于num_output == 1fc8reg层中,accuracy层将始终将输入图像的索引0作为您已经看到的它的预测标签。

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

如果要打印和计算训练后的回归值,并计算回归网络的准确性,可以简单地编写像this这样的this层。

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

票数 3
EN

Stack Overflow用户

发布于 2016-10-13 04:35:41

在我看来,一切都是正确的,但你的网络并没有融合,这不是一个罕见的包袱。你的网络实际上正在收敛到零输出!也许你的大部分样品都有0作为标签。

另外,不要忘了只在火车上包含损耗层,否则,它将学习作为wel的测试数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39756886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档