提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Day10 最大池化层 Pooling layer MaxPool2d
前言
一、池化层介绍
1.功能
- 池化:在保留数据特征的情况下减小数据量,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max
pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。 - 与卷积不用,池化是选取核中最大数作为output
- 通常来说,CNN的卷积层之间都会周期性地插入池化层
2.参数
注意,stride
滑动的默认值,是kernel
的大小,跟conv不一样!
kernel_size
– the size of the window to take a max over
stride
– the stride of the window. Default value is kernel_size
padding
– implicit zero padding to be added on both sides
dilation
– a parameter that controls the stride of elements in the
window
return_indices
– if True, will return the max indices along with the
outputs. Useful for torch.nn.MaxUnpool2d later
ceil_mode
– when True, will use ceil instead of floor to compute the
output shape(True则保留多出来的input,False丢弃。)
对ceil_mode的理解,以及利用池化核进行池化的过程:
二、池化层操作步骤
1.数据集准备和加载
依旧以CIFAR10
数据集为例,下载dataset后作为参数传递给dataloader加载,注意batch_size
选取64为一组,其他参数默认
dataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(),
download=True)
dataloader = DataLoader(dataset=dataset, batch_size=64, shuffle=True, drop_last=False)
下载数据集:
2.开始搭建简单神经网络
注意参数设置、init 和 forward 的各自任务:
self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)
output = self.maxpool1(input)
class test(nn.Module):
def __init__(self):
super(test, self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)
def forward(self, input):
output = self.maxpool1(input)
return output
3.实例化test1网络,以矩阵测试样例发生报错
代码如下:
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 = torch.reshape(input, (-1, 1, 5, 5))
test1 = test()
# 矩阵输出
print(test1(input))
注意:
input = torch.reshape(input, (-1, 1, 5, 5))
保证输入格式正确,以防发生报错(参考上一期)
报错:
数据格式报错,解决方案:
强制类型转换,
dtype=torch.float32
4.结合Tensorboard
之前在数据的读取章节介绍过如何将dataloader
加载好的数据读取
writer = SummaryWriter("log2")
step = 0
for data in dataloader:
imgs, t = data
writer.add_images("input", imgs, step)
output = test1(imgs)
# 注意,最大池化不会改变channel(input是3通道,output也是三通道)
writer.add_images("output", output, step)
step = step + 1
writer.close()
三、输出结果展示
1.input展示结果
2.output展示结果
直观感受是把图片马赛克处理了,更直观体会到了池化层在保留数据特征的情况下减小数据量的特点。
三、完整代码
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("./dataset", train=False, transform=torchvision.transforms.ToTensor(),
download=True)
dataloader = DataLoader(dataset=dataset, batch_size=64, shuffle=True, drop_last=False)
# dtype:将数据类型更改为浮点数
# 输入:5x5矩阵
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))
class test(nn.Module):
def __init__(self):
super(test, self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)
def forward(self, input):
output = self.maxpool1(input)
return output
test1 = test()
# 矩阵输出
print(test1(input))
# 图像输出
writer = SummaryWriter("log2")
step = 0
for data in dataloader:
imgs, t = data
writer.add_images("input", imgs, step)
output = test1(imgs)
# 注意,最大池化不会改变channel(input是3通道,output也是三通道)
writer.add_images("output", output, step)
step = step + 1
writer.close()