理解deconv层数学

时间:2016-11-10 10:43:41

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

我需要帮助。试图了解deconv层的数学运算方式。我们来谈谈这一层:

layer {
  name: "decon"
  type: "Deconvolution"
  bottom: "conv2"
  top: "decon"
  convolution_param {
    num_output: 1
    kernel_size: 4
    stride: 2
    pad: 1
  }
}

所以基本上这个层应该将图像“升级”2倍。如果我查看学习的权重,我会看到,例如这样:

-0,0629104823 -0,1560362280 -0,1512266700 -0,0636162385
-0,0635886043 +0,2607241870 +0,2634004350 -0,0603787377
-0,0718072355 +0,3858278100 +0,3168329000 -0,0817491412
-0,0811873227 -0,0312164668 -0,0321144797 -0,0388795212

到目前为止,这么好。现在我试图了解如何应用这些权重来实际实现放大效果。我需要在自己的代码中执行此操作,因为我想使用简单的像素着色器。

查看Caffe代码,“DeconvolutionLayer :: Forward_cpu”内部调用“back_cpu_gemm”,后者为“gemm”,后跟“col2im”。我对这一切是如何工作的理解是这样的:gemm获取输入图像,并将每个像素与上面列出的16个权重中的每一个相乘。所以基本上gemm产生16个输出“图像”。然后col2im将这16个“图像”相加以产生最终输出图像。但是由于2的步幅,它在输出图像上延伸了16个gemm图像,使得每个输出像素仅由4个gemm像素组成。到目前为止听起来对你来说听起来不错吗?

我的理解是,通过使用来自4x4 deconv权重矩阵的4个权重,从最近的4个低分辨率像素计算每个输出像素。如果你看下面的图片:

https://i.stack.imgur.com/X6iXE.png

每个输出像素使用黄色,粉红色,灰色或白色权重,但不使用其他权重。我理解正确吗?如果是这样,我有一个很大的理解问题,因为为了使整个概念正常工作,例如黄色权重应该与粉红色权重等相加。但它们!结果,我的像素着色器产生图像,其中4个像素中的1个比其他像素更暗,或者每隔一行更暗,或类似的东西(取决于我正在使用的训练模型)。显然,当通过Caffe运行模型时,不会出现这样的伪影。所以我必须在某个地方产生误解。但是我找不到它......: - (

P.S:只是为了完成信息:在deconv层前面有一个转换层,其中“num_output”是例如因此,deconv层实际上具有例如64.当然,64个4x4权重,加上一个偏差。

1 个答案:

答案 0 :(得分:0)

经过大量调试后,我发现我对deconv层的理解完全没问题。我通过简单地将偏置浮点数除以255.0来修复所有工件。这是必要的,因为像素着色器在0-1范围内运行,而Caffe偏置常数似乎以0-255像素值为目标。

现在一切都很好。

我仍然不明白为什么4个重量对不能达到相同的值以及它们如何起作用。但我知道什么。毕竟它确实有效。我想有些事情对我来说永远是个谜。