神经网络之卷积理解

卷积看了也使用了不少时间了,最近在知乎上如何理解深度学习中的deconvolution networks看到一个关于卷积的,感觉不错,因此有把那篇讲卷积的文章A guide to convolution arithmetic for deep learning看了一遍。

首先是卷积和反卷积的输入和输出形状(shape)大小,受到padding、strides和核的大小的影响。其计算如下:

操作卷积反卷积
non padding,no strideso = (i - k) + 1o’ = i’ + (k - 1)
arbitrary padding, no strdieso = (i - k) + 2p + 1o’ = i’ + (k - 1) - 2p
half padding, no strideso = io’ = i’
full padding, no strideso = i + (k - 1)o’ = i’ - (k - 1)
non padding, non-unit strideso = iks+1 ⌊ i − k s ⌋ + 1 o’ = s(i’ - 1) + k
arbitrary padidng, non-unit strideso = i+2pks+1 ⌊ i + 2 p − k s ⌋ + 1 o=s(i1)+k2pstrideso=s(i1)+a+k2pstrides o ′ = s ( i ′ − 1 ) + k − 2 p 能 被 s t r i d e s 整 除 o ′ = s ( i ′ − 1 ) + a + k − 2 p 不 能 被 s t r i d e s 整 除

注1:其中o表示卷积操作输出结果,i表示卷积输入大小,k表示卷积核大小,p表示padding大小,s表示strides大小,o’, i’, k’, p’, s’则表示相应的反卷积操作大小. a 表示如果在卷积时移动步长(strides)不为1,且不能被strides整除,则其反卷积操作需要在输入i’的上边和右边补0,其大小为a,a = (i + 2k - p).
注2:求网络感受野时,根据输出feature的一个pix反推(类似反卷积计算)原图大小,不用考虑padding的影响。

卷积操作

关于在数学上的卷积公式就不多说了,全是一堆公式,在图像中卷积的应用而且有点不一样,直接上一个ufldl的神图,初始接触卷积就是看的这个教程。
1

就是通过一个卷积核在图片像素中移动进行计算,同时,这种平移计算卷积的操作也可以看成矩阵操作,对于上面一个输入为5x5的输入,核为3x3的卷积来说(无padding且1 strides),把输入、卷积核和输出都展开为向量形式

  • 输入为25维的列向量 x x
    x=[11100...01100]
  • 核扩充为9x25维的矩阵 C C
    C=[w0,0w0,1w0,2w0,300...0w0,0w0,1w0,2w0,30......000000...]=[101000......000000...]
  • 输出为4维的行向量 y=Cx y = C x
    x=[434243234] x = [ 4 3 4 2 4 3 2 3 4 ]
前向传播

通过上述的矩阵表示,则前向传播可以表示为:

y=Cx y = C x

反向传播

神经网络的反向传播是通过链式求导计算的,后一层的误差乘以导数得到前一层的误差。则每层的梯度为: Lyyx ∂ L ∂ y ⋅ ∂ y ∂ x
则对于单个 xj x j 有:

Lxj=iLyiyixj=iLyiCi,j=LyC,j=CT,jLy ∂ L ∂ x j = ∑ i ∂ L ∂ y i ⋅ ∂ y i ∂ x j = ∑ i ∂ L ∂ y i ⋅ C i , j = ∂ L ∂ y ⋅ C ∗ , j = C ∗ , j T ⋅ ∂ L ∂ y

则对于 x x 有:
Lx=[Lx1Lx2...Lxn]= [C,1TLyC,2TLy...C,nTLy]=CTLy

反卷积操作(transposed convolution)

反卷积,其实就是卷积转置(transposed convolution),也称为微步卷积(fractionally strided convolutions),因为在反卷积中可能出现移动小于一步的情况,下面会介绍。

根据上面矩阵表示卷积的前向和反向传播的过程,其反卷积的操作就非常简单了,只需要对C进行转置就好了, C=CT C ′ = C T .
即:

x=CTy x = C T y

Lx=CLy ∂ L ∂ x = C ⋅ ∂ L ∂ y

因此,在反卷积中不需要改变核的大小。

不使用padding和strides

卷积操作

这种类型是最简单的

1

输出大小为: o=(ik)+1 o = ( i − k ) + 1

解释: 只看一次重做到右的滑动,一共滑动 ik i − k 次,在加上本身初始所在的位置,所以输出为 (ik)+1 ( i − k ) + 1

反卷积操作

为了使得到的输出结果比输出结果的shape大,需要改变其padidng的值。

  • k’ = k
  • s’ = s
  • p’ = k-1

解释: k k s在反卷积中不改变,卷积操作使得输出减小了 k1 k − 1 , 则反卷积操作需要使输出还原到原大小,即输出增加 k1 k − 1 , 得: i+(k1)=(i+2pk)+1 i ′ + ( k − 1 ) = ( i ′ + 2 p ′ − k ′ ) + 1 –> p=k1 p ′ = k − 1 .

其过程如下所示:

2

输出大小为: o=i+(k1) o ′ = i ′ + ( k − 1 )

解释: o=i+2pk)+1=i+(k1) o ′ = ( i ′ + 2 p ′ − k ′ ) + 1 = i ′ + ( k − 1 )

使用padding和不使用strides

卷积操作

使用padding在输入图像周围填充0,使输出的结果shape大于输入的结果(不是反卷积)。在实际实现卷积操作中没有计算这些0的乘法

3

输出大小为: o=(ik)+2p+1 o = ( i − k ) + 2 p + 1

**解释:**padding在矩阵周围增加了p个单位的0,因此其输入大小增加为 i+2p i + 2 p , 即, o=(i+2pk)+1 o = ( i + 2 p − k ) + 1

反卷积操作

由于在卷积时在输入的四周补0了,所以在反卷积时需要重新计算 p p ′ , p=kp1 p ′ = k − p − 1 .

解释:同理,卷积操作减少了 k2p1 k − 2 p − 1 , 在反卷积中需要增加回来,则, i+(k2p1)=(i+2p;k)+1 i ′ + ( k − 2 p − 1 ) = ( i ′ + 2 p ; − k ′ ) + 1 –> p=kp1 p = k − p − 1 .

4

输出大小为: o=i+(k1)2p o ′ = i ′ + ( k − 1 ) − 2 p

解释: o=i+2pk)+1=i+2(kp1)k+1=i+k12p o ′ = ( i ′ + 2 p ′ − k ′ ) + 1 = i ′ + 2 ( k − p − 1 ) − k + 1 = i ′ + k − 1 − 2 p

注意: p p ′ 的重新计算和 o o ′ 中使用的是 p p

奇数核一半的padding和不使用strides

这种结构比较好玩,就是使输入和输出的大小相同,VGG就是使用这种结构。

卷积操作

核:k=2n+1,,stride: s=1 s = 1 ,padding: p=k/2=n p = ⌊ k / 2 ⌋ = n

5

输出大小为: o=i+2k/2(k1)=i+2n2n=i o = i + 2 ⌊ k / 2 ⌋ − ( k − 1 ) = i + 2 n − 2 n = i

反卷积操作

由于卷积的输入和输出的形状相同,则反卷积操作与卷积操作也相同。
即, k=k,p=p,s=s k ′ = k , p ′ = p , s ′ = s

6

输出大小为: o=i+(k1)2p=i+2n2n=i o ′ = i ′ + ( k − 1 ) − 2 p = i ′ + 2 n − 2 n = i ′

奇数核-1大小的padding和不使用strides

stride: s=1 s = 1 ,padding: p=k1 p = k − 1

卷积操作

输出的结果比输入的大,输出增加了p大小。

7

输出大小为: o=i+2(k1)(k1)=i+(k1) o = i + 2 ( k − 1 ) − ( k − 1 ) = i + ( k − 1 )

反卷积操作

相当于没有使用padding的反卷积操作,就是卷积操作中输出增加了 k1 k − 1 ,则在反卷积中不使用padding,则输出大小减少 k1 k − 1

8

输出大小为: o=i+(k1)2p=i(k1) o ′ = i ′ + ( k − 1 ) − 2 p = i ′ − ( k − 1 )
注意:使用的是 p p

不使用padding和使用strides

即,卷积核一次移动多步。

卷积操作

9

输出大小为:o=iks+1
注意:上式进行了向下取整,也就是遇到奇数无法除尽的时候需要向下取整。这种情况需要额外注意,因为在反卷积中需要在其上面和左边补0, 该图在下一节一起放出

10

反卷积操作

这种情况的反卷积比较好玩,需要在输入数据中插0。这也是微步卷积的由来(fractionally strided convolutions),由于在输入中插入0,导致strides移动<1。

核: k=k k ′ = k ,stride: s=1 s ′ = 1 ,padding: p=k1 p ′ = k − 1
注意 i i ′ 的大小为在输入中插入了s - 1个0

11

输出大小为: o=s(i1)+k o ′ = s ( i ′ − 1 ) + k

使用padding和使用strides

卷积操作

和不使用padding差不多,只不过四周补0了.

12

输出大小为: o=i+2pks o = ⌊ i + 2 p − k s + 1

反卷积操作

对于移动步数刚好整除的
核: k=k k ′ = k ,stride: s=1 s ′ = 1 ,padding: p=kp1 p ′ = k − p − 1

13

输出大小为: o=s(i1)+k2p o ′ = s ( i ′ − 1 ) + k − 2 p

对于无法整除的
这种情况需要在输入矩阵的上边和右边增加a排0,其中 a=(i+2pk) a = ( i + 2 p − k )

14

输出大小为: o=s(i1)+k+a2p o ′ = s ( i ′ − 1 ) + k + a − 2 p

references

图片来自:https://github.com/vdumoulin/conv_arithmetic
文章参考:A guide to convolution arithmetic for deep learning

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值