MaxPooling和AvgPooling的求导过程

一、MaxPooling前向传播与反向传播

MaxPooling就是对卷积区域进行最大值计算。
1、MaxPooling池化区域与步长相同时,即只对最大区域进行梯度计算,最后将梯度平均到四个区域中。
1 3 1 4 5 2 4 6 9 6 1 2 3 4 5 6 c o n v ( 2 , 2 ) s t r i d e = 2 > 5 6 9 6 梯 度 坐 标 > 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 梯 度 值 > 0 0 0 0 0.25 0 0 0.25 0.25 0 0 0 0 0 0 0.25 \begin{gathered} \begin{matrix} 1 & 3 & 1 & 4 \\ 5 & 2 &4 & 6 \\ 9 & 6 & 1 & 2 \\ 3 & 4 & 5 & 6\end{matrix} \quad conv(2,2) stride=2 > \begin{matrix} 5 & 6 \\ 9 & 6\end{matrix} \quad 梯度坐标> \begin{matrix} 0 & 0 & 0 & 0 \\ 1 & 0 & 0 & 1 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1\end{matrix} \quad 梯度值> \begin{matrix} 0 & 0 & 0 & 0 \\ 0.25 & 0 & 0 & 0.25 \\ 0.25 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0.25\end{matrix} \end{gathered} 1593326414154626conv(2,2)stride=2>5966>0110000000000101>00.250.2500000000000.2500.25
下图中,红色的框表示池化区域,得到5,而对应的下标计数为1,最后将所有的梯度平均。1/4
在这里插入图片描述
2、MaxPooling池化区域与步长不相同时,进行池化操作之后,对于重复出现的最大值进行重复计数,最后再根据计数进行梯度平均。
1 3 1 4 5 2 4 6 9 6 1 2 3 4 5 6 c o n v ( 2 , 2 ) s t r i d e = 1 > 5 4 6 9 6 6 9 6 6 梯 度 坐 标 > 0 0 0 0 1 0 1 2 2 2 0 0 0 0 0 1 梯 度 值 > 0 0 0 0 0.11 0.11 0 0.22 0.22 0.22 0 0 0 0 0 0.11 \begin{gathered} \begin{matrix} 1 & 3 & 1 & 4 \\ 5 & 2 &4 & 6 \\ 9 & 6 & 1 & 2 \\ 3 & 4 & 5 & 6\end{matrix} \quad conv(2,2) stride=1 > \begin{matrix} 5 & 4& 6 \\ 9 & 6 & 6 \\9 & 6 & 6\end{matrix} \quad 梯度坐标> \begin{matrix} 0 & 0 & 0 & 0 \\ 1 & 0 & 1 & 2 \\ 2 & 2 & 0 & 0 \\ 0 & 0 & 0 & 1\end{matrix} \quad 梯度值> \begin{matrix} 0 & 0 & 0 & 0 \\ 0.11 & 0.11 & 0 & 0.22 \\ 0.22 & 0.22 & 0 & 0 \\ 0 & 0 & 0 & 0.11\end{matrix} \end{gathered} 1593326414154626conv(2,2)stride=1>599466666>0120002001000201>00.110.22000.110.220000000.2200.11
当步长小于池化区域时,存在重叠区域,那么将进行重复计算,对应梯度也按照权重分配。
在这里插入图片描述
上图中,5、4分别是最大值,因此梯度计数回到对应的位置分别为1。下图中,绿、红的最大值均为6,因此被计数两次,梯度坐标为2。
在这里插入图片描述

二、AvgPooling前向传播与反向传播

AvgPooling就是对卷积区域进行均值计算。
1、AvgPooling池化区域与步长相同时,对全局进行梯度平均。
1 3 1 4 5 2 4 6 9 6 1 2 3 4 5 6 c o n v ( 2 , 2 ) s t r i d e = 2 > 2.75 3.75 5.5 3.5 梯 度 坐 标 > 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 梯 度 值 > 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 0.0265 \begin{gathered} \begin{matrix} 1 & 3 & 1 & 4 \\ 5 & 2 &4 & 6 \\ 9 & 6 & 1 & 2 \\ 3 & 4 & 5 & 6\end{matrix} \quad conv(2,2) stride=2 > \begin{matrix} 2.75 & 3.75 \\ 5.5 & 3.5\end{matrix} \quad 梯度坐标> \begin{matrix} 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1\end{matrix} \quad 梯度值> \begin{matrix} 0.0265 & 0.0265 & 0.0265 & 0.0265 \\ 0.0265 & 0.0265 & 0.0265 & 0.0265 \\ 0.0265 & 0.0265 & 0.0265 & 0.0265 \\ 0.0265 & 0.0265 & 0.0265 & 0.0265\end{matrix} \end{gathered} 1593326414154626conv(2,2)stride=2>2.755.53.753.5>1111111111111111>0.02650.02650.02650.02650.02650.02650.02650.02650.02650.02650.02650.02650.02650.02650.02650.0265
2、AvgPooling池化区域与步长不相同时,对全局按照重叠区域进行权重平均。对重复计算的区域进行重复计数。
1 3 1 4 5 2 4 6 9 6 1 2 3 4 5 6 c o n v ( 2 , 2 ) s t r i d e = 1 > 2.75 2.5 3.75 5.5 3.25 3.25 5.5 4 3.5 梯 度 坐 标 > 1 2 2 1 2 4 4 2 2 4 4 2 1 2 2 1 梯 度 值 > 0.0287 0.0556 0.0556 0.0287 0.0556 0.1111 0.1111 0.0556 0.0556 0.1111 0.1111 0.0556 0.0287 0.0265 0.0265 0.0287 \begin{gathered} \begin{matrix} 1 & 3 & 1 & 4 \\ 5 & 2 &4 & 6 \\ 9 & 6 & 1 & 2 \\ 3 & 4 & 5 & 6\end{matrix} \quad conv(2,2) stride=1 > \begin{matrix} 2.75 & 2.5 &3.75\\ 5.5 & 3.25 & 3.25 \\5.5&4&3.5\end{matrix} \quad 梯度坐标> \begin{matrix} 1 & 2 & 2 & 1 \\ 2 & 4 & 4 & 2 \\ 2 & 4 & 4 & 2 \\ 1 & 2 & 2 & 1\end{matrix} \quad 梯度值> \begin{matrix} 0.0287& 0.0556& 0.0556& 0.0287\\ 0.0556& 0.1111 & 0.1111 & 0.0556\\ 0.0556& 0.1111 & 0.1111 & 0.0556 \\ 0.0287& 0.0265 & 0.0265 & 0.0287\end{matrix} \end{gathered} 1593326414154626conv(2,2)stride=1>2.755.55.52.53.2543.753.253.5>1221244224421221>0.02870.05560.05560.02870.05560.11110.11110.02650.05560.11110.11110.02650.02870.05560.05560.0287
这里把重复计数问题通过滑动窗口的形式表现出来:
在这里插入图片描述
左图中数字1,在进行平均池化计算时,由于会被红色个窗口进行平均计算,因此梯度坐标为1,即均值计算计数为1;3经过红、黑两个窗口进行均值计算,计数梯度为2;2这个数字经过红、黑、绿、粉四个窗口进行均值计算,因此计数为4。

三、代码

import torch
import numpy as np
img = np.array([
        [1,3,1,4],
        [5,2,4,6],
        [9,6,1,2],
        [3,4,5,6],])
img = img.astype(np.float)
img = torch.tensor(img,requires_grad=True).float()
img = img.unsqueeze(0)
img.retain_grad() #保留梯度
pool = torch.nn.functional.avg_pool2d(img,kernel_size=(2,2),stride=1) #平均池化
# pool = torch.nn.functional.max_pool2d(vara,kernel_size=(2,2),stride=1) # 最大池化
print(pool) #池化结果
pool = torch.mean(pool) #均值计算
pool.backward() #梯度回传
print(img.grad) #输出梯度

代码参考

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: maxpoolingavgpooling深度学习中常用的池化操作,用于减小特征图的尺寸和提取特征。 maxpooling是取池化窗口内的最大值作为输出,通常用于提取图像中的边缘和纹理等细节特征。 avgpooling是取池化窗口内的平均值作为输出,通常用于提取图像中的整体特征,如物体的大小和形状等。 两种池化操作都可以减小特征图的尺寸,减少计算量和参数数量,同时也可以提取特征,有助于提高模型的性能。 ### 回答2: MaxpoolingAvgpooling是卷积神经网络中常用的两种池化(pooling)方法。池化层是一种用于降低特征图纬度的操作,通过将大的特征图变成小的特征图,可以减少参数数量,提高计算速度,并有助于防止过拟合。 Maxpooling是一种取最大值的池化方法。具体来说,对于每个池化窗口(通常大小为2×2),Maxpooling会在窗口中选取最大的数值,将其作为缩小后特征图的值。该方法可以保留最重要的特征,抑制噪声,并在一定程度上实现平移不变性,对于图像中的目标检测和分类任务都有较好的效果。 相对而言,Avgpooling则是一种将池化窗口内所有数值的平均值作为特征图值的池化方法。其对特征信息的保留相对于Maxpooling而言略微减少,但是具有更好的平移不变性,对于图像中的目标检测和分类任务也有一定的效果。此外,AvgpoolingMaxpooling更加平滑,能够有效减小特征图中不必要的信息。 总体来说,选择Maxpooling还是Avgpooling要根据具体问题而定。在特征图尺寸减小的情况下,选择Maxpooling可以更好地保留最重要的特征,而选择Avgpooling则可以更好地在不同位置处理相似的特征。因此,在设计深度学习模型时,可以根据具体的任务类型和数据集特点来灵活选择不同的池化方法。 ### 回答3: 池化层是深度学习中一层非常重要的网络层,常见的池化操作包括MaxPoolingAvgPooling两种方式。池化层可以有效地减少输入数据的维度,一方面降低了计算量和参数个数,另一方面还可以提高模型的鲁棒性和泛化能力。 MaxPooling层是指对输入矩阵中的每个子块,取该子块中的最大值作为输出值。这种池化层的作用是提取矩阵中最具代表性的特征,同时也可以减小输入数据的尺寸。它的主要优点在于池化后可以减小输入数据的像素数量,还可以减小特征图中的噪声。 AvgPooling层是指对输入矩阵中的每个子块,取该子块中所有值的平均值作为输出值。这种池化层的作用是减少输入特征图尺寸,平滑输入特征图中的噪声,提高特征图的鲁棒性和泛化性。 两种池化方式的本质区别在于特征表示的方式不同。MaxPooling层相当于对特征图做了一个高度抽象的处理,提取了特征图中最具有区分性的点。而AvgPooling层则可以将各个特征点的信息进行平滑处理,使得神经网络对变化和噪声的容忍度更高。 在使用池化层的时候,需要根据具体的数据情况和任务需求来选择合适的池化方式。如果需要提取的特征比较突出,可以选择MaxPooling层;如果需要较好的平滑效果,可以选择AvgPooling层。但无论使用哪种池化方式,在一定程度上都可以起到减少计算量和提高特征鲁棒性的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值