卷积(Convolution),反卷积(Transposed Convolution),上采样(UpSample, Interpolation)

卷积(Convolution)

  卷积在我的另一篇blog中有介绍,这里不重复说明,只给出根据卷积的输入,计算输出尺寸的公式。

  设输入到卷积层的输入的size为 ( B , C i n , i H , i W , i D ) (B, C_{in}, i_{H}, i_{W}, i_{D}) (B,Cin,iH,iW,iD),分别表示Batch size,Input Channel,Input Height,Input Width,Input Depth,卷积层的卷积核尺寸Kernel_size为 ( k H , k W , k D ) (k_{H}, k_{W}, k_{D}) (kH,kW,kD),填充padding为 ( p H , p W , p D ) (p_{H}, p_{W}, p_{D}) (pH,pW,pD),步长stride为 ( s H , s W , s D ) (s_{H}, s_{W}, s_{D}) (sH,sW,sD)。则输出的size为 ( B , C o u t , o H , o W , o D ) (B, C_{out}, o_{H}, o_{W}, o_{D}) (B,Cout,oH,oW,oD),分别表示Batch size,Output Channel,Output Height,Output Width,Output Depth,则

o H = ⌊ i H + 2 ∗ p H − k H s H ⌋ + 1 o_{H} =\Big\lfloor \frac{i_{H}+2*p_{H}-k_{H}}{s_{H}}\Big\rfloor+1 oH=sHiH+2pHkH+1
o W = ⌊ i W + 2 ∗ p W − k W s W ⌋ + 1 o_{W} =\Big\lfloor \frac{i_{W}+2*p_{W}-k_{W}}{s_{W}}\Big\rfloor+1 oW=sWiW+2pWkW+1
o D = ⌊ i D + 2 ∗ p D − k D s D ⌋ + 1 o_{D} =\Big\lfloor \frac{i_{D}+2*p_{D}-k_{D}}{s_{D}}\Big\rfloor+1 oD=sDiD+2pDkD+1

其中 ⌊ ⋅ ⌋ \Big\lfloor·\Big\rfloor 表示向下取整,可以看出,H、W、D三个维度的计算是相同且独立的,其实这个公式十分好理解,对于H、W、D任何一个维度,输入网格数是 i i i,加上了padding之后,网格数变为 i + 2 p i+2p i+2p,那么 i + 2 p − k i+2p-k i+2pk就是减去一个kernel_size后的网格数,这个时候除以stride在向下取整, ⌊ i + 2 ∗ p − k s ⌋ \Big\lfloor \frac{i+2*p-k}{s}\Big\rfloor si+2pk的含义就是卷积核移动的步数,而卷积核移动的步数在加上1(加上分子减去的那个kernel_size),就是输出的网格数

  一般来说,kernel_size在H、W、D三个维度的值设定成一样的, padding、stride也同样经常设定成一样的。值得一提的是,因为这个向下取整的存在,让我们的反卷积操作变得较为复杂,因为对于不同的输入,输出可能一样,例如i=12,13,14对于k=3,s=3,p=0,其输出都是4,反卷积就需要特殊的设定,来返回成12,13或14。


反卷积(Transposed Convolution)

  在有些应用场景,例如图像分割领域,我们输入图像尺寸(H,W),经过了池化或者步长不为一的卷积层后,图像尺寸会变小为(H’,W’),但我们又想让神经网络输出同原来一样的尺寸,就需要反卷积、上采样等操作返回原来的尺寸。

  反卷积(Transposed Convolution,过去可能也叫Deconvolution,这一叫法逐渐被抛弃),也叫分数步长卷积(fractionally strided convolutions),在正向卷积中,步长一般是正整数,在反卷积的任务中,我们的目标是增大尺寸,步长就变成了分数,例如 1 2 \frac{1}{2} 21步长就对应正向卷积的步长2,在正向卷积中,我们很容易知道,步长stride=2,卷积核就平移两个像素位计算一次卷积,但是stride= 1 2 \frac{1}{2} 21,卷积核如何平移 1 2 \frac{1}{2} 21个像素位呢?

  很巧妙的,我们可以在原来相邻的两个像素位A,B之间加一位0,这样我们从位A平移到位B就需要平移两次,如果我们平移一次,就是stride= 1 2 \frac{1}{2} 21了。因此,对于正向卷积步长stride=n,反卷积就在每两个像素位之间加上n-1个0,这样平移一位就是stride= 1 n \frac{1}{n} n1了。因此分数步长卷积并不是真的步长是分数,而是通过添加若干0,一次只平移一位的方法达到分数步长的目的。

  为了解释反卷积,我们用一种比较直观的方法,利用连接模式(connectivity pattern),输入经过正向卷积层后,输出的每一个像素位,蕴含了输入的哪些像素位的信息(也就是由哪些像素位计算得到),我们认为输出的这个像素位同输入的有计算关系的像素位存在某种连接模式。

One way to understand the logic behind zero padding is to consider the connectivity pattern of the transposed convolution and use it to guide the design of the equivalent convolution.

接下来我们一步一步的看,一步一步的利用连接模式推出反卷积的计算公式。下面各图中,对于正向卷积,绿色图是是输入,蓝色图是输出,对于反卷积,蓝色图是输入,绿色图是输出,一般我们认为正向卷积和反卷积有相同的卷积核尺寸

padding=0, stride=1

  下图展示了,正向卷积参数 ( i n p u t = 4 , k e r n e l _ s i z e = 3 , s t r i d e = 1 , p a d d i n g = 0 ) (input = 4, kernel\_size = 3, stride = 1, padding = 0) (input=4,kernel_size=3,stride=1,padding=0),对应反卷积参数 ( i n p u t ′ = 2 , k e r n e l _ s i z e ′ = k e r n e l _ s i z e , s t r i d e ′ = 1 , p a d d i n g ′ = 2 ) (input' = 2, kernel\_size' = kernel\_size, stride' = 1, padding' = 2) (input=2,kernel_size=kernel_size,stride=1,padding=2),根据连接模式,正向卷积中,绿色图左上角的像素只和蓝色图左上角的像素位有连接关系,在正向卷积和反卷积有相同卷积核尺寸的前提下,在反卷积过程中,会在外围进行 p a d d i n g ′ = k e r n e l _ s i z e − 1 padding'=kernel\_size-1 padding=kernel_size1的填充,你可以验证,这样填充的反卷积,会严格满足各个像素位的连接关系,例如绿色图第一行第二个像素位,与蓝色图第一行两个像素位有连接关系。

因此对于正向卷积 p a d d i n g = 0 , s t r i d

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值