在CNN网络中卷积池之后会跟上一个池化层,池化层的作用是提取局部均值与最大值,根据计算出来的值不一样就分为均值池化层与最大值池化层,一般常见的多为最大值池化层
设
al−1=σ(zl−1)
前向传播
maxpool
前向传播会记录每次pool的核移动stride后所在区域里的最大值,和最大值所在坐标
这里以pool的核的大小为3x3,stride=1为例,则pool后的值的输出和最大值所在坐标如下图:
设pool层输出为
al
alij=max(al−1mn),i≤m,n≤i+2其中m,n为al−1ij对应的pool核覆盖的区域,如下左图a00对应区域为红框所标记的区域
avg pool
这里pool核的大小为3x3,stride=1
反向传播
maxpool
由于pool层没有参数,所以没必要求梯度,主要将相关的梯度传下即可:
δl−1k,v=∂C∂zl−1k,v=∑iji=3,j=3∂C∂alij∂alij∂al−1k,val−1k,v∂zl−1k,v
而由于
alij=max(al−1mn)=al−1imax,jmax,imax,jmax代表alij对应的pool核区域最大的那个元素的索引
所以:
δl−1k,v=∑iji=3,j=3{[(k=imax,v=jmax)?(∂C∂alij∂alij∂zl−1imax,jmax):0]al−1k,v∂zl−1k,v}=∑iji=3,j=3{(k=imax,v=jmax)?∂C∂alij:0]σ′(zl−1k,v)}
为方便书写,这里直接用了三目运算符了:D
为了统一敏感度图公式,如果设
ali,j=zli,j=alimax,jmax
那么池化层的敏感度图
δl=∂C∂zl=∂C∂al
设一直pool层敏感度图如下:
那么pool上一层敏感度图为:
其中:
p10=(δ00+δ01+δ10+δ20+δ21)σ′(zl−110)p02=δ02+δ03σ′(zl−102)p22=δ11+δ12+δ13+δ22+δ23+δ31+δ32+δ33σ′(zl−122)p30=δ30σ′(zl−130)
avg pool
同样设
ali,j=zli,j=alimax,jmax
敏感度图:
δl=∂C∂zl=∂C∂al
设当前pool层敏感度图为:
所以上一层的敏感度图:
δl−1k,v=∑iji=2,j=2∂C∂alij∂alij∂al−1k,v∂al−1k,v∂zl−1k,v
即:
...δl−100=19δl00σ′(zl−100)δl−101=19δl00σ′(zl−101)+19δ01σ′(zl−101)δl−133=19δl33σ′(zl−133)
自己推到过,才发现网上所述略有误差