一、Pooling layers
Pooling layers官网文档
MaxPool最大池化层下采样
MaxUnpool最大池化层上采样
AvgPool最大池化层平均采样
例如:池化核为(3,3),输入图像为(5,5),步长为1,不加边
最大池化就是选出在池化核为单位图像中的最大的值
二、MaxPool2d
torch.nn.MaxPool2d官网API
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
参数 | 解释 |
---|---|
kernel_size | 池化核的大小 |
stride | 池化核移动时的步长,默认值为kernel_size |
padding | 是否对原图像进行加边操作 |
dilation | 池化核映射到图像上每个池化核单元是否有距离,又称空洞池化或空洞卷积 |
return_indices | |
ceil_mode | True 时,使用ceil模式 (2.31取2,向下取整,舍去小数,保留边缘剩余数据 );False 时使用floor模式 ,默认为False (2.31取3,向上取整,整数加一,舍去边缘剩余数据 ) |
三、代码实操
对一个(5,5)的数据进行(kernel_size=3)池化核为(3,3),步长(stride)没传 默认为池化核大小(kernel_size=3)为3,padding也没传参默认为0表示不加边,ceil_mode=True保留边缘剩余数据
MaxPool2d(kernel_size=3,ceil_mode=True)
通过池化层处理之后,输出一个结果为二维tensor[[5,5],[5,5,]]
import torch
from torch import nn
from torch.nn import MaxPool2dinput = torch.tensor([[1,2,3,4,5],[5,4,3,2,1],[1,2,3,4,5],[5,4,3,2,1],[1,2,3,4,5]],dtype=torch.float32)
#RuntimeError: "max_pool2d" not implemented for 'Long' 需要将数据进行转换dtype=torch.float32input = torch.reshape(input,(-1,1,5,5))print(input.shape)#torch.Size([1, 1, 5, 5])class Beyond(nn.Module):def __init__(self):super(Beyond,self).__init__()self.maxpool_1 = MaxPool2d(kernel_size=3,ceil_mode=True)def forward(self,input):output = self.maxpool_1(input)return outputbeyond = Beyond()
output = beyond(input)
print(output)
"""
tensor([[[[5., 5.],[5., 5.]]]])
"""
四、池化层意义
保留输入图像的特征,同时把数据量给减小
(5,5)的图像,经过池化层就会变成(3,3)甚至(1,1)
数据量的减小对于神经网络而言,参数少了,训练的速度会更快
五、通过池化层处理CIFAR-10数据集
对CIFAR10的1w张测试集数据进行(kernel_size=3)池化核为(3,3),步长(stride)没传 默认为池化核大小(kernel_size=3)为3,padding也没传参默认为0表示不加边,ceil_mode=True保留边缘剩余数据
MaxPool2d(kernel_size=3,ceil_mode=True)
import torch
import torchvision
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdataset_test = torchvision.datasets.CIFAR10("CIFAR_10",train=False,transform=torchvision.transforms.ToTensor(),download=True)dataloader = DataLoader(dataset=dataset_test,batch_size=64)#64张为一组class Beyond(nn.Module):def __init__(self):super(Beyond,self).__init__()self.maxpool_1 = MaxPool2d(kernel_size=3,ceil_mode=True)def forward(self,input):output = self.maxpool_1(input)return outputbeyond = Beyond()
writer = SummaryWriter("y_log")i=0
for data in dataloader:imgs,targets = datawriter.add_images("input_maxpool",imgs,i)output = beyond(imgs)writer.add_images("output_maxpool",output,i)i = i + 1writer.close()
在Terminal下运行tensorboard --logdir=y_log --port=7870
,logdir为打开事件文件的路径,port为指定端口打开;
通过指定端口7870进行打开tensorboard,若不设置port参数,默认通过6006端口进行打开。
点击该链接或者复制链接到浏览器打开即可