1. 程式人生 > >CNN中pooling層的反向傳播

CNN中pooling層的反向傳播

  CNN中的pooling層一般有max pooling和average pooling兩種。雖然pooling層沒有引數,但為了使用鏈式法則逐層向前進行梯度的傳播,也是需要對pooling層進行求導計算的。

  假設P_prev經過pooling層之後得到P,pooling的步長為stride_h和stride_w, pooling的視窗大小為f_h * f_w。需要通過dP求解dP_prev。假設h,w,c分別表示dP上某個點的高、寬和通道數,對dP_prev進行求解。

  對於max_pooling,只有視窗內的最大值對後層影響,也會影響最終的loss。故反向傳播時,也只獲取視窗內最大值的梯度,而視窗其它位置的梯度為0。可以用偽碼錶示如下:

dP_prev[h*stride_h: h*stride_h + f_h, w*stride_w: w*stride_w+f_w, c] = dP[h,w,c] * (P_prev[h*stride_h: h*stride_h + f_h, w*stride_w: w*stride_w+f_w, c] == max(P_prev[h*stride_h: h*stride_h + f_h, w*stride_w: w*stride_w+f_w, c]))

  對於averag pooling,視窗內的所有值對於後層和loss的影響一樣,故反向傳播時,一個視窗內的所有位置的梯度等於將dP[h,w,c]平分到各個位置上。可以用偽碼錶示如下:

dP_prev[h*stride_h: h*stride_h + f_h, w*stride_w: w*stride_w+f_w, c] = dP[h,w,c] * 1/(f_h*f_w) * np.ones(f_h,f_w)