CNN概念之上采样,反卷积,Unpooling概念解释

前言

本文译自quora上对《What is the difference between Deconvolution, Upsampling, Unpooling, and Convolutional Sparse Coding?》的回答。个人觉得这位老哥的回答很简洁干练。所以转到这里。

Upsampling(上采样)

在FCN、U-net等网络结构中,我们见识到了上采样这个东西。那么,什么是上采样呢?简单来说:上采样指的是任何可以让你的图像变成更高分辨率的技术

最简单的方式是重采样和插值:将输入图片进行rescale到一个想要的尺寸,而且计算每个点的像素点,使用如双线性插值等插值方法对其余点进行插值来完成上采样过程。

Unpooling

Unpooling是在CNN中常用的来表示max pooling的逆操作。这是从2013年纽约大学Matthew D. Zeiler和Rob Fergus发表的《Visualizing and Understanding Convolutional Networks》中产生的idea:

鉴于max pooling不可逆,因此使用近似的方式来反转得到max pooling操作之前的原始情况

简单来说,记住做max pooling的时候的最大item的位置,比如一个3x3的矩阵,max pooling的size为2x2,stride为1,反卷积记住其位置,其余位置至为0就行:

[ 1 2 3 4 5 6 7 8 9 ] > ( m a x p o o l i n g ) [ 5 6 8 9 ] > ( u n p o o l i n g ) [ 0 0 0 0 5 6 0 8 9 ]

Deconvolution(反卷积)

Deconvolution(反卷积)在CNN中常用于表示一种反向卷积 ,但它并不是一个符合严格数学定义的反卷积操作。与Unpooling不同,使用反卷积来对图像进行上采样是可以习得的。通常用来对卷积层的结果进行上采样,使其回到原始图片的分辨率。

反卷积也被称为分数步长卷积(convolution with fractional strides)或者转置卷积(transpose convolution)或者后向卷积(backwards strided convolution)。作者认为应该称之为转置卷积

真正的反卷积如(Deconvolution - Wikipedia)里面所说,但是我不认为有人在实际的CNN中会使用它。

前面提到,反卷积也被称为分数步长卷积或者转置卷积或者后向卷积。在我看来,这些术语不会让人真正的理解到底发生了什么,而实际上这些东西还是挺简单的。

常规的卷积操作(valid模式):滑动步长为S,图片大小为N1xN1,卷积核大小为N2xN2(示意图假设为3x3),卷积后图像大小:(N1-N2)/S+1 x (N1-N2)/S+1如下图:

这里写图片描述
为了要让经过卷积的结果回到卷积前的模样。如图这个2x2的的结果,如何回到4x4呢?其实这种也算一种卷积的操作,只不过进行了padding操作:
这里写图片描述

或者,通常大家会选择更大的stride来增强上采样的效果(因为一般默认stride=1,比较小)
这里写图片描述

上面这种图的地址:https://github.com/vdumoulin/conv_arithmetic,需要注意的是:上采样的kernel的学习与正常的卷积核类似

FCN(U-net)中的low-level和high-level特征的融合

在FCN论文中,作者采用了combine网络的low-level和high-level特征的方式。这是因为:

网络比较深的时候,特征图通常比较小,对这种特征图进行上采样——有很好的语义信息,但分辨率很差。
网络比较浅的时候,特征图通常比较大(接近input image),对这种特征图进行上采样——有很好的细节,但语义信息很差。

因此,对两者进行combine,我们可以在得到很好的细节基础上,也能获得尽可能强的图像语义信息


猜你喜欢

转载自blog.csdn.net/g11d111/article/details/82350563