最大池化的目的在于保留原特征的同时减少神经网络训练的参数,使得训练时间减少。相当于1080p的视频变为了720p
池化层最常用的是下采样,其中参数:
kernel_size:设置取最大值的窗口,类似于卷积层的卷积核,如果传入参数是一个int型,则生成一个正方形,边长与参数相同;若是两个int型的元组,则生成长方形。
stride:步径,与卷积层不同,默认值是kernel_size的大小。
padding:和卷积层一样,用法类似于kernel_size。
dilation:控制窗口中元素步幅的参数,就是两两元素之间有间隔:
ceil_mode:设置ceil模式和floor模式。比如有一个数据:
kernel_size为3:
第一次匹配:
挑选出9个数中最大的值:2,然后先向右移动 kernel_size大小的距离:
此时因为数据没有凑足kernel_size的大小,便涉及取舍问题,ceil_mode为True,则保留,结果为3,若为False,则不保留。得到两种情况的最大池化结果:
ceil_mode = True:
ceil_mode = 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]])
可知,input需要有四个参数,batch_size、channel、输入的高、输入的宽,则设置:
input = torch.reshape(input, [-1, 1, 5, 5])
创建一个神经网络:
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.maxpool1 = nn.MaxPool2d(kernel_size=3, ceil_mode=True)
def forward(self, input):
return self.maxpool1(input)
如果我们将数据放到神经网络训练,会报错,因为不支持输入"Long"型数据,则略修改:
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)
model = Model()
print(model(input))
输出结果:
tensor([[[[2., 3.],
[5., 1.]]]])
与之前的值一致。
和卷积不同,池化输入为三维,输出仍然为三维,最后图片显示不用reshape。
采用CIFAR10数据集的照片:
#设置dataloader
dataset = torchvision.datasets.CIFAR10("./dataset", False, torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset, 64)
使用Tensorboard:
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
model = Model()
writer = SummaryWriter("logs")
step = 0
for data in dataloader:
imgs,targets = data
writer.add_images("inputs", imgs, step)
outputs = model(imgs)
writer.add_images("outpuxts", outputs, step)
step = step+1
writer.close()
观察图片:
图片变模糊,保留原图片的特征,让训练参数减少。