ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

19.神经网络-最大池化的使用

19.神经网络-最大池化的使用 torch.nn.pooling layers池化层常用池化层类型:MaxPool1d/2d/3d最大池化最常用也被称为下采样MaxUnpool1d/2d/3d最大反池化在池化前加Un实现上采样AvgPool1d/2d/3d平均池化自适应池化层较少使用MaxPool2d参数详解核心参数:1.kernel_size池化窗口大小可设为单个int如3表示3×3窗口也可设为元组如(2,3)表示2×3窗口2.stride滑动步长默认值 kernel_size与卷积层不同卷积层默认stride13.padding填充方式与卷积层相同4.dilation控制窗口元素间距的参数5.return_indices是否返回最大值索引用于后续MaxUnpool操作通常很少使用6.ceil_mode计算输出形状时使用ceil还是floor模式True时使用ceil计算输出形状默认使用floor注意事项最大池化是最常用的池化方式池化层主要作用是降维下采样和特征提取与卷积层参数的主要区别在于stride默认值不同dilation参数这里解释下dilation的作用像上图中dilation是1的情况下卷积核的每个元素都是紧挨着的。而下图dilation为2的情况下卷积核的每个元素之间间隔1方格这个叫做空洞卷积因为中间有了洞。空洞卷积说明:当dilation1时卷积核元素之间会产生间隔例如3×3卷积核在dilation1时紧密排列dilation2时元素间会间隔1个位置这种间隔形成的空洞效果因此称为空洞卷积ceil_mode参数模式区别:floor模式: 向下取整如2.3取2ceil模式: 向上取整如2.3取3在MaxPool2d中影响输出形状的计算方式ceil_mode实际应用案例:池化操作示意图输入图像尺寸: 示例中为5 X 5 的矩阵池化核设置:默认情况下kernel_size与池化核尺寸相同示例中设置为3 X 3的窗口最大池化操作操作原理:将池化核覆盖输入图像的9个数值取覆盖区域内的最大值作为输出示例输出:第一位置覆盖区域最大值为2输出结果为1 X 1 的数值2池化步长与边界处理默认步长:步长(stride)默认等于池化核尺寸示例中每次移动3个单位边界情况:当覆盖区域不足9个数时如只剩6个处理方式由ceil_model参数决定(1)True模式:允许保留不完整覆盖区域取有效区域内的最大值示例图上图中六数区域最大值为3(2)False模式:放弃不完整覆盖区域示例图上图中六数区域不输出结果实际应用:一般情况下保持默认False需要保留边界特征时可设为True输出尺寸差异需特别注意最大池化操作结果作用与意义形状变化输入5 x 5)经过(3 x 3)池化后输出(2 x 2)或(1 x 1)数据压缩类似视频分辨率从1080p降到720p保留主要特征同时减小数据量计算优势减少网络参数数量 | 加快训练速度网络应用通常与卷积层配合使用形成卷积-池化-激活的标准结构输出尺寸计算公式如下为输出尺寸的计算公式可以不用记忆仅供查阅。以上面的演示为例我们输入尺寸高度是5padding是00dilation是11所以输出高度计算得到。5 - 3-1-1 /3 1 1.667如果开启了ceil_model模式那么我们对结果取ceil,得到输出的尺寸高度是2.如果关闭了ceil_model模式那么我们对结果取floor,得到输出的尺寸高度是1.计算结果与演示中表现的一致。对如上池化演示操作进行代码实现注意池化操作中input的N是 batch_size,C是通道channel通道数因为我们的输入图像只有1层所以channel是1然后我们想让它自己去计算batch_size,所以我们batch_size这里写-1我们执行如下图中代码后结果报错报错原因是最大池化无法对long对数据类型进行实现。因为我们的input矩阵的元素都是123它会认为这个是整数。数据类型必须使用浮点型tensor整数型会报错可通过dtypetorch.float32指定我们如下图修改数据类型后代码能正常执行。我们将ceil_mode由true改成false,查看池化结果。比对代码执行结果和我们演示中的结果输出图像的值是一致的。演示操作的整体代码importtorchimporttorchvisionfromtorchimportnnfromtorch.nnimportMaxPool2dfromtorch.utils.dataimportDataLoaderfromtorch.utils.tensorboardimportSummaryWriterinputtorch.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]],dtypetorch.float32)inputtorch.reshape(input,(-1,1,5,5))classTudui(nn.Module):def__init__(self):super(Tudui,self).__init__()self.maxpool1MaxPool2d(kernel_size3,ceil_modeFalse)defforward(self,input):outputself.maxpool1(input)returnoutput tuduiTudui()outputtudui(input)print(output)最大池化的作用保留数据特征同时将数据量减小会训练的更快。数据压缩类似视频分辨率从1080p降到720p保留主要特征同时减小数据量真实图像的整体代码下面我们加载真实图像来演示最大池化的效果。代码关键点数据集加载使用CIFAR10数据集转换为tensor格式可视化工具使用TensorBoard记录输入输出对比# -*- coding: utf-8 -*-# 作者小土堆# 公众号土堆碎念importtorchimporttorchvisionfromtorchimportnnfromtorch.nnimportMaxPool2dfromtorch.utils.dataimportDataLoaderfromtorch.utils.tensorboardimportSummaryWriter datasettorchvision.datasets.CIFAR10(../data,trainFalse,downloadTrue,transformtorchvision.transforms.ToTensor())dataloaderDataLoader(dataset,batch_size64)classTudui(nn.Module):def__init__(self):super(Tudui,self).__init__()self.maxpool1MaxPool2d(kernel_size3,ceil_modeFalse)defforward(self,input):outputself.maxpool1(input)returnoutput tuduiTudui()writerSummaryWriter(../logs_maxpool)step0fordataindataloader:imgs,targetsdata writer.add_images(input,imgs,step)outputtudui(imgs)writer.add_images(output,output,step)stepstep1writer.close()我们在终端运行 tensorboard --logdir“logs_maxpool” 可查看如下可视化结果。我们发现图像经过最大池化后变得模糊但是保留了主体特征。知识总结
返回列表