最大池化层MaxPool2d
参数都类似卷积层的
torch.nn.MaxPool2d(kernel_size,
stride=None,
padding =0,dialation=1,
return_indices=False, ceil_node=False)
kernel_size卷积核大小
stride步径,默认为卷积核大小(在卷积层时,默认1)
padding填充
dialation空洞卷积
ceil_node为True是ceil模式,向上取整(就是保留—);floor向下取整
上图中最下面这个图解释了dialation空洞卷积
最大池化层应该就是取小圈里面的最大值(卷积层是小圈里的对应位置值与输入的重合位置值的乘积,再累加)
上图用来解释ceil_node,第一步在红色,默认stride=kernel_size=3,那第二步在蓝色,但是不满,那当ceil_node=true时,向上取整,则保留。
—————理论讲完,后面是实践——————————
要求的输入是4维的,n就是batchsize,c是chanel有几层?有几个图片
所以一般写完二维数组,需要reshape一下
最大池化的作用:
保留输入的特征同时减少数据量。
输入是5x5的,但是处理后,可能输出只有2x
2的,eg网速慢的时候视频从1080p变成720p,缩小文件尺寸。
代码
import torch
from torch import nn
from torch.nn import MaxPool2d
#torch.nn.MaxPool2d(kernel_size, stride=None, padding =0,dialation=1, return_indices=False, ceil_node=False)
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 Tudui(nn.Module):
def __init__(self):
super(Tudui, self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)
def forward(self, input):
output = self.maxpool1(input)
return output
tudui = Tudui()
output = tudui(input)
print(output) #tensor([[[[2., 3.],[5., 1.]]]])
另一种,直接拿图片试
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
#torch.nn.MaxPool2d(kernel_size, stride=None, padding =0,dialation=1, return_indices=False, ceil_node=False)
dataset = torchvision.datasets.CIFAR10("/Users/bbing517/Downloads/蚂蚁数据集/hymenoptera_data/神经网络",
train=False,
transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset, batch_size=64)
class Tudui(nn.Module):
def __init__(self):
super(Tudui, self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)
def forward(self, input):
output = self.maxpool1(input)
return output
tudui = Tudui()
writer = SummaryWriter("./logs_maxpool")
step=0
for data in dataloader:
imgs, targets = data
writer.add_images("input", imgs,step)
output = tudui(imgs)
writer.add_images("output",output,step)
step= step+1
writer.close()