1.9卷积神经网络笔记——池化层

1.池化层之最大池化

用到池化层的原因:cnn中经常用到池化层来缩减表示大小,提高计算速度,同时提高提取特征的鲁棒性。

1.最大池化方法:输入时4*4,输出是2*2;把4*4拆分成不同区域,(用不同颜色标记)每个颜色区域取最大值作为对应2*2矩阵输出值。

2.相当于应用过滤器参数为:维度f=2,步长s=2。

3.含义:可以把4*4输入矩阵看成某些特征集合(或许不是),即神经网络中某一层非激活值集合,数字大意味着检测到了某些特定特征。输入矩阵的左上角存在大数字,具有某个特定特征;右上角数字小,没检测到某特定特征。

4.最大池化作用:只要在过滤器任何地方检测到某特征,在最大池化输出里保留最大值;如果没提取到这一特征,输出的最大值依然很小。最大池化效率高的原因:有一组超级参数,但没有参数需要学习,一旦确定了s、f,梯度下降就是固定运算,梯度下降不改变任何值。

eg最大池化举例:


输入是5*5矩阵,过滤器参数f=3,s=1,利用计算卷积层输出大小的公式计算最大池化层输出大小。如果输入是3维(5*5*nc),输出也是3维(3*3*nc),此时需要对每个通道分别执行二维最大池化过程。

2.平均池化


不是取区域最大值而是取平均值,过滤器参数f=2,s=2。可以用平均池化来分解深度很深的神经网络表示层:例如7*7*1000——>1*1*1000。神经网络中最大池化比平均池化常用到。

3.总结

常用参数f=2,s=2,效果相当于表示层高度宽度缩减一半;f=3,s=2也有时会用到。其他非常用滤波器参数就要看池化类型了,也可自行增加padding参数,但是很少用,目前p常用值=0,但也有例外,以后会讲到。

需要注意的是:池化过程没有参数要学习,执行反向传播时,反向传播没有参数适用于最大池化,只有已经设置好的参数f、s。最大池化只是计算神经网络某一层的固定函数。



### 最大池化和平均池化的数学公式 #### 最大池化层前向传播 最大池化操作通过选取输入特征图中每个局部区域的最大值来减少数据维度。假设有一个大小为 \( f \times f \) 的窗口,并且步幅为 \( s \),那么对于给定的输入矩阵 \( A \in R^{n_H \times n_W} \),最大池化输出可以表示如下: \[ Z[i,j] = max(A[h:h+f,w:w+f]) \] 其中,\( h \) 和 \( w \) 是滑动窗口的位置坐标。 #### 平均池化层前向传播 平均池化则是计算这些局部区域内所有元素的算术平均值。同样的参数设定下,平均池化输出定义为: \[ Z[i,j] = mean(A[h:h+f,w:w+f]) \] 即该窗口内所有数值相加再除以窗口内的总像素数 \( f^2 \)[^3]。 #### 反向传播过程中的梯度计算 ##### 对于最大池化: 反向传播时,仅当某个位置上的原素被选作最大值,则其对应的误差项保留;其他未成为最大值的地方则置零。具体来说,在求导过程中只有那些等于当前窗口最大值得地方会传递梯度,其余部分不会影响最终结果。 ##### 对于平均池化: 在反向传播阶段,来自上一层节点的梯度会被均匀分配到本层每一个参与运算的小方格里去。因此如果某一层采用了尺寸为 \(f\times f\) 的滤波器做平均汇聚的话,那么它所产生的梯度将会平分给这 \(f^2\) 个相连结点。 ```python def distribute_error(dZ, cache): """Distributes the error over all elements of the slice during backpropagation.""" (A_prev, hparameters) = cache stride = hparameters['stride'] f = hparameters['f'] m, n_C_prev, n_H_prev, n_W_prev = A_prev.shape _, _, n_H, n_W = dZ.shape dA_prev = np.zeros_like(A_prev) for i in range(m): # loop over training examples a_prev_slice = A_prev[i] for h in range(n_H): # loop on vertical axis for w in range(n_W): # loop on horizontal axis for c in range(n_C_prev): # loop over channels vert_start = h * stride vert_end = vert_start + f horiz_start = w * stride horiz_end = horiz_start + f if mode == "max": a_prev_slice_masked = a_prev_slice[c, vert_start:vert_end, horiz_start:horiz_end] mask = create_mask_from_window(a_prev_slice_masked) dA_prev[i, c, vert_start: vert_end, horiz_start: horiz_end] += \ np.multiply(mask, dZ[i, c, h, w]) elif mode == "average": da = dZ[i, c, h, w] shape = (f, f) dA_prev[i, c, vert_start: vert_end, horiz_start: horiz_end] += \ distribute_value(da, shape) return dA_prev ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值