神经网络-池化层
2022/2/2 23:46:16
本文主要是介绍神经网络-池化层,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
池化层:
一种形式的降采样
理解:在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。
作用:
特征不变性
特征降维(下采样)
在一定程度上防止过拟合
实现非线性(类似relu)
扩大感受野
常见的池化层:
最大池化、平均池化、全局平均池化、全局最大池化
重叠池化
空金字塔池化
以最大池化为例:
参数:
kernel_size :表示做最大池化的窗口大小,可以是单个值,也可以是tuple元组 | |
---|---|
stride :步长,可以是单个值,也可以是tuple元组 | |
---|---|
padding :填充,可以是单个值,也可以是tuple元组 | |
---|---|
dilation :控制窗口中元素步幅 | |
---|---|
return_indices :布尔类型,返回最大值位置索引 | |
---|---|
ceil_mode :布尔类型,为True,用向上取整的方法,计算输出形状;默认是向下取整 | |
---|---|
理解:
如果池化核为一个kernel size=3
的,
若ceil_mode
为True,分析下过程,首先,池化核在初始位置,
即在:
[1,2,0], [0,1,2], [1,2,1]
检测到最大值为2,输出2
然后向右移动,发现不足9个,只有6个
即:
[[3,1], [3,1], 0,0]]
因为参数中ceil_mode为True,所以我们就按这6个找最大值
输出3。然后我们往下依次进行池化
结果等于
[[2,3], [5,1]]
若参数中ceil_mode
为False,那么我们那些不足池化核面积的,本示例中指不足3x3的会直接舍去,所以结果为 2
代码示例:
import torch from torch import nn from torch.nn import MaxPool2d input = torch.tensor([[1,2,0,3,1], [0,1,2,3,1], [1,2,1,0,0], [5,2,3,1,1], [2,1,0,1,1]],dtype=float) input =torch.reshape(input,(-1,1,5,5)) class Test(nn.Module): def __init__(self): super(Test, self).__init__() self.maxpool = MaxPool2d(kernel_size=3,ceil_mode=True) def forward(self,input): output = self.maxpool(input) return output test = Test() output = test(input) print(output)
在ceil_mode为True时
输出为:
tensor([[[[2., 3.], [5., 1.]]]], dtype=torch.float64)
在ceil_mode为False时
输出为:
tensor([[[[2.]]]], dtype=torch.float64)
代码注意:
这里在写input时要注意数据的类型,如果不加dtype则会报错
以图片来进行演示最大池化
import torch import torchvision from torch import nn from torch.nn import MaxPool2d from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter dataset = torchvision.datasets.CIFAR10("dataset2",train=False,transform=torchvision.transforms.ToTensor(),download=False) dataloader = DataLoader(dataset,batch_size=64) class Test(nn.Module): def __init__(self): super(Test, self).__init__() self.maxpool = MaxPool2d(kernel_size=3,ceil_mode=False) def forward(self,input): output = self.maxpool(input) return output test = Test() step =0 writer = SummaryWriter("logs") for data in dataloader: imgs,target = data writer.add_image("input",imgs,step,dataformats="NCHW") output = test(imgs) writer.add_image("output",output,step,dataformats="NCHW") step+=1 writer.close()
仅作为个人学习总结
这篇关于神经网络-池化层的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南