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)

你可能感兴趣的:(deeplearning)