神经网络-池化层

神经网络-池化层,第1张

神经网络-池化层 池化层:

一种形式的降采样
理解:在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。

作用:
特征不变性
特征降维(下采样)
在一定程度上防止过拟合
实现非线性(类似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()

仅作为个人学习总结

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5721344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存