CNN卷积层和pooling层的前向传播和反向传播

本文只包含CNN的前向传播和反向传播,主要是卷积层和pool层的前向传播和反向传播,一些卷积网络的基础知识不涉及

符号表示

如果l层是卷积层:

p[l]: padding
s[l]: stride
nc[l] : number of filters

fliter size:k1[l]×k2[l]×nc[l1]
==Weight: W[l] size is k1[l]×k2[l]×ncl1×ncl
==bais==: b[l] size is nc[l]
==liner==: z[l],size is nh[l]×nw[l]×nc[l]
==Activations==: a[l] size is nh[l]×nw[l]×nc[l]

==input==: a[l1] size is nh[l1]×nw[l1]×nc[l1]
==output==: a[l] size is nh[l]×nw[l]×nc[l]

nh[l]nh[l1]两者满足:

nh[l](s[l]1)+f1[l]nh[l1]+2p

nh[l]=nh[l1]+2pk1[l]s+1

符号x表示向下取整,nw[l]nw[l1]两者关系同上

CNN卷积层和pooling层的前向传播和反向传播

Cross-correlation与Convolution

很多文章或者博客中把Cross-correlation(互相关)和Convolution(卷积)都叫卷积,把互相关叫做翻转的卷积,在我个人的理解里面两者是有区别的,本文将其用==两种表达式分开表示==,不引入翻转180度。

Cross-correlation

对于大小为h×w图像I和 大小为(k1×k2)kernel K,定义其Cross-correlation:

(IK)ij=m=0k11n=0k2I(i+m,j+n)K(m,n)

其中

0ihk1+1

0jwk2+1

注意这里的使用的符号和i的范围,不考虑padding的话Cross-correlation会产生一个较小的矩阵

CNN卷积层和pooling层的前向传播和反向传播

Convolution

首先回顾一下连续函数的卷积和一维数列的卷积分别如下,卷积满足交换律:

h(t)=f(τ)g(tτ)dτ

c(i)=i=a(i)b(ni)di

对于大小为h×w图像I和大小为(k1×k2)kernel K,convolution为 :

(IK)ij=(KI)ij=m=0k11n=0k21I(im,jn)k(m,n)

0ih+k110jw+k21

注意:这里的Convolution和前面的cross-correlation是不同的:
1. i,j范围变大了,卷积产生的矩阵size变大了
2. 这里出现了很多I(x,y),这些负数索引可以理解成padding
3. 这里的卷积核会翻转180度
具体过程如下图所示

CNN卷积层和pooling层的前向传播和反向传播

CNN卷积层和pooling层的前向传播和反向传播

如果把卷积的padding项扔掉那么就变成下图这样,此时Convolution和Cross-correlation相隔的就是一个180度的翻转,如下图所示

CNN卷积层和pooling层的前向传播和反向传播

卷积核旋转180度
参考自卷积核翻转方法
翻转卷积核有三种方法,具体步骤移步卷积核翻转方法
1. 围绕卷积核中心旋转180度 (奇数行列好使)

  1. 沿着两条对角线翻转两次

  2. 同时翻转行和列 (偶数行列好使)

前向传播

卷积层

前向传播:计算z[l]a[l]

输入a[l1] size is nh[l1]×nw[l1]×nc[l1]

输出a[l]

为了方便后续的反向传播的方便,只讨论l层的参数,把部分上标[l]去掉,同时另nc[l]=nc[l1]=1,前向传播公式如下:

zl(i,j)=m=0k11n=0k21ai+m,j+nl1×wm,n+bal=g(zl)

虑通道和padding的前向传播


pooling层

pooling层进行下采样,maxpool可以表示为:

al(i,j)=max0mk11,0nk21(al1(i*k1+m,j*k2+n))

avepool可以表示为:

al(i,j)=1k1×k2m=0k11n=0k21al1(i*k1+m,j*k2+n)

CNN卷积层和pooling层的前向传播和反向传播

反向传播

卷积层的反向传播

1. 已知EzlEwl

CNN卷积层和pooling层的前向传播和反向传播

由上图可知W对每一个元素都有贡献,(偷来的图,用的符号不一致),使用链式法则有:

Ewm,nl=i=0nhl1j=0nwl1Ezi,jlzi,jlwm,nl

zi,jlwm,nl=(m=0k11n=0k21ai+m,j+nl1×wm,n+b)wm,nl=ai+m,j+nl1

δi,jl=Ezi,jl,有:

Ewm,nl=i=0nhl1j=0nwl1ai+m,j+nl1δi,jlEwl=alδl

2. 根据EzlEzl1

CNN卷积层和pooling层的前向传播和反向传播

上图是偷来的图,把那边的Xl,当成zl理解,与zi,jl1
有关的ai,jl1,索引是从(ik1+1,jk2+1)(i,j)(出现负值或者是越界当成是padding),根据链式法则:

Ezi,jl1=m=0k11n=0k2+1Ezim,jnlzim,jnlzi,jl1

zim,jnlzi,jl1展开有:

zim,jnlzi,jl1=s=0k11t=0k2+1zim+s,jn+tl1ws,tlzi,jl1=wm,nl

从而可以得到:

Ezi,jl1=m=0k11n=0k2+1Ezim,jnlwm,nl=m=0k11n=0k2+1δim,jnlwm,nl=δlWl

这里的代表是卷积操作

pooling层的反向传播

pooling层的反向传播比较简,没有要训练的参数

CNN卷积层和pooling层的前向传播和反向传播

maxpool,最大的那个为1其他的均为0:

Eai,jl1=1if(i,j)=arg(maxik1k1iik11,jk2k2jjk21(ai,jl1))Eai,jl1=0else

avepool,每个都是

Eai,jl1=1k1×k2

考虑多个通道

zc[l][l]表示z[l]的第c[l]个channel:

zc[l][l](i,j)=c[l1]=0ncl11(ac[l1][l1]Wc[l1],c[l][l])+bc[l][l]=c[l1]=0ncl11(m=0f[l]1n=0f[l]1ac[l1][l1](i+m,j+n)×Wc[l1],c[l][l](m,n))+bcl[l]

其中,Wc[l1],c[l][l]f[l]×f[l]的卷积核Wc[l1],c[l][l]=W[l](:,:,c[l1],c[l])

ac[l][l]=g(zc[l][l])

g(x)为**函数


考虑padding和stride情况下:

zc[l][l](i,j)=c[l1]=0ncl11(m=0f[l]1n=0f[l]1a[l1](is+mp,js+np,c[l1])×W[l](m,n,c[l1],c[l]))+bcl[l]

ac[l][l]=g(zc[l][l])

a[l]索引越界部分表示padding,其值为0