最大池化层(常用的是maxpool2d)的作用:
- 一是对卷积层所提取的信息做更一步降维,减少计算量
- 二是加强图像特征的不变性,使之增加图像的偏移、旋转等方面的鲁棒性
具体操纵:取图像中的最大值作为输出,如下所示,第一个橙色框代表最大池化操作,最左边池化的最大值为3,即第一个输出为3,后面以此类推。橙色的操作代表ceil_mode=True()时的操作,即不够的向上取整,False代表向下取整。
代码:
import torch
from torch import nn
from torch.nn import MaxPool2d
#我们经常使用的是浮点数,要把输入数据设置为浮点数,1=1.0
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=torch.float32)
#转换成合适的输入格式
input = torch.reshape(input,(-1,1,5,5))
print(input.shape)
class Mymodel(nn.Module):
def __init__(self):
super(Mymodel, self).__init__()
#ceil_mode=true,即最大池化层映射有空白的部分向上取整,如3.2取4
self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=True)
def forward(self,input):
output = self.maxpool1(input)
return output
#创建神经网络
mymodel = Mymodel()
#输入数据经过神经网络输出
output = mymodel(input)
print(output)
结果:
把ceil_mode修改为False时,
结果为2:
下面利用torchvision类下来数据,然后经过神经网络操作
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("./fl/data",train=False,download=True,transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset,batch_size=64)
class Mymodel(nn.Module):
def __init__(self):
super(Mymodel, self).__init__()
#ceil_mode=true,即最大池化层映射有空白的部分向上取整,如3.2取4
self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)
def forward(self,input):
output = self.maxpool1(input)
return output
#创建神经网络
mymodel = Mymodel()
writer = SummaryWriter("../logs_maxpool")
step = 0
for data in dataloader:
imgs,targets = data
writer.add_images("input",imgs,step)
output = mymodel(imgs)
writer.add_images("output",output,step)
step = step + 1
writer.close()
运行后,在terminal下执行:tensorboard --logdir=logs_maxpool --port=6009
(如果执行有误,参考tensorboard使用方法)
执行如下:
打开链接,如下: