DeConvNet 中的 unpooling 和 deconvolution 是如何工作的

Posted

技术标签:

【中文标题】DeConvNet 中的 unpooling 和 deconvolution 是如何工作的【英文标题】:How does the unpooling and deconvolution work in DeConvNet 【发布时间】:2016-05-05 02:28:33 【问题描述】:

我一直试图了解去卷积和反卷积在 DeConvNets 中是如何工作的。

解池

在解池阶段,激活被恢复到最大激活选择的位置,这是有道理的,但是剩余的激活呢?那些剩余的激活是否也需要恢复或以某种方式进行插值,或者只是在未池化的地图中填充为零。

去卷积

在卷积部分(即卷积层、Relu、池化)之后,通常会有多个特征图输出,它们将被视为连续层的输入通道(反卷积..)。如何将这些特征图组合在一起以实现与原始输入具有相同分辨率的激活图?

【问题讨论】:

【参考方案1】:

1 取消池化。

在original paper on unpooling 中,剩余的激活被归零。

2 反卷积。

反卷积层只是其对应的卷积层的转置。例如。如果卷积层的形状是[height, width, previous_layer_fms, next_layer_fms],那么反卷积层的形状将是[height, width, next_layer_fms, previous_layer_fms]。 conv 和 deconv 层的权重是共享的! (例如见this paper)

【讨论】:

任何对此感兴趣的人都应该看看this post(以减少不同名称的混淆) 将剩余激活值保持为零通常会导致生成的图像出现棋盘格图案。有一篇关于这个的有趣文章,这里有一个潜在的解决方案:distill.pub/2016/deconv-checkerboard【参考方案2】:

解池

正如 etoropov 所写,您可以在 Zeiler 和 Ferguson 的 Visualizing and Understanding Convolutional Networks 中阅读关于取消池化的内容:

Unpooling:在convnet中,最大池化操作 是不可逆的,但是我们可以得到一个近似值 通过记录的位置反演 一组开关中每个池化区域内的最大值 变量。在 deconvnet 中,unpooling 操作 使用这些开关从 将上面的层放到适当的位置,保留 刺激的结构。见图 1(底部) 过程说明。

去卷积

反卷积的工作原理如下:

您在每个像素周围添加填充 您应用卷积

例如,在下图中,原始蓝色图像用零(白色)填充,应用灰色卷积滤波器得到绿色输出。

来源:What are deconvolutional layers?

【讨论】:

我了解反卷积。当我在反卷积之前使用平均池而不是最大池时会发生什么?它喜欢Input->Conv(stride=1,3x3)->Pooling(stride=2,AVE)->Deconv(kernel=2,stride=2)。在我的测试中,当我使用 AVE 池化时,错误率会增加 听起来不错,但如果一开始就没有池化操作(也没有卷积操作)怎么办?就像从噪声向量到图像输出一样,这里只有转置卷积操作。对此有何想法? 如果没有pooling,就不能做unpooling。转置卷积(又名反卷积)并不关心你之前是否有卷积。

以上是关于DeConvNet 中的 unpooling 和 deconvolution 是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch 的 Pooling 和 UnPooling函数中的 indices 参数:nn.MaxPool2d/nn.MaxUnpool2dF.max_pool2d/F.max_unpool2d

Unpooled 类

语义分割(semantic segmentation) 常用神经网络介绍对比-FCN SegNet U-net DeconvNet,语义分割,简单来说就是给定一张图片,对图片中的每一个像素点进行分类;

数据源类型 pooled 和 unpooled 有啥区别?

Netty - 是不是需要释放 Unpooled.unreleasesableBuffer 的内存

上池化(unpooling),上采样(unsampling)和反卷积(deconvolution)的区别