【问题标题】:caffe: How to interpret EuclideanLoss (pixel-wise regression)caffe:如何解释 EuclideanLoss(逐像素回归)
【发布时间】:2017-04-16 15:21:16
【问题描述】:

我有一个图像作为输入,一个图像作为ground_truth。我的最后一层是EuclideanLoss,其中最后一层convolutionalnum_output = 1,以便计算这两个图像之间的损失。

使用deploy.prototxt 测试网络时,我省略了EuclideanLoss 层,这意味着我的最后一层是Convolutional 层,然后是Relu 层。当我通过 Python 检索这些值时,我该如何解释它们:

pred = net.forward()

output_blob = pred['result']

output_blob 属于 1xheightxwidth,但值不在特定范围内。他们甚至可以是消极的。您如何检索正确的值来创建图像?或者我该如何解释这些值?我必须从输入图像中减去它们还是应该如何处理它们?

【问题讨论】:

  • output_blob 是 ReLU 层的输出,怎么可能是负数?
  • 因此:relu_param{ negative_slope: 0.01 }。 @戴尔
  • 你的目标是什么?你想实现什么?
  • 我有一个输入图像,作为 ground_truth 我有相应的深度图像。 (两者都在 protoxt 中从 [0, 255] 缩放到 [0, 1] @malreddysid
  • --> 深度估计。这个答案够吗? @malreddysid

标签: python deep-learning caffe conv-neural-network


【解决方案1】:

如果您知道您的输出应该是非负的,为什么要使用具有负斜率的 ReLU?我会将其更改为常规的 ReLU 层。 然后,在使用 forward() 之后,你应该得到这样的输出数据:

output_data=output_blob.data[...]

该输出的形状可能类似于 Batch、nchannels、H、W。 您可以使用output_data=np.squeeze (output_data) 将输出作为二维矩阵。

编辑: 解释最后一层值的方法是,它是与给定输入训练期间看到的深度估计最接近(就 L2 距离而言)的图像。

【讨论】:

  • 好的,我有几个 ReLU 层。仅更改最后一个 ReLU 层就足够了吗,还是我必须更改所有这些层?另一个问题是,为什么值为负数是个问题?我的意思是即使我有二维矩阵,我仍然不知道如何解释这些值?
  • 只改变最后一层应该没问题。训练后,当你测试一个没有提供标签(深度)的新输入图像时,最后一层实际上是深度估计,即 2d 矩阵中的每个值都代表相应像素的深度。这就是为什么负深度没有意义。此外,如果你所有的深度估计都应该在 [0,1] 范围内,你可以使用 sigmoid 而不是 ReLU 来确保正确的范围。
  • 好的,是的,我在开始时将值从 [0, 255] 更改,因为这些是从 png 到 [0, 1] 的值,然后我将它们转换为 [0, 255]再次。我会尝试改用Sigmoid 层,然后二维矩阵应该只乘以 255,结果应该是估计的深度值?
  • 您似乎可以帮助解决与此问题相关的进一步问题。因为我能够通过分类而不是回归来实现深度估计(这应该反过来,因为深度估计是一项回归任务)我问了这个问题:question。即使您可能不知道答案,如果您能看一下并告诉我您的想法,我将不胜感激。
  • 好吧,你的 EDIT 基本上说的是我可以使用 2D 矩阵并乘以 256 --> 这样我就可以将图像保存为 png?感谢您查看其他问题!一旦这里的对话让我满意,我将立即接受答案,但我已经给了你一个赞成票!
猜你喜欢
  • 2017-03-25
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2013-10-08
  • 1970-01-01
相关资源
最近更新 更多