【学习笔记】【Pytorch】八、池化层
- 学习地址
- 主要内容
- 一、最大池化操作示例
- 二、nn.MaxPool2d类的使用
- 1.使用说明
- 2.代码实现
- 三、池化公式
学习地址
PyTorch深度学习快速入门教程【小土堆】.
主要内容
一、最大池化操作示例
二、nn.MaxPool2d类的使用
作用:对于输入信号的输入通道,提供2维最大池化(max pooling)操作。
三、池化公式
一、最大池化操作示例
动图演示
- 最大池化层(MaxPool),也叫下采样层。
- 上采样就是低分辨率到高分辨率,下采样就是压缩图片分辨率。
- 池化最大的作用是增大感受野。能让后面的卷积核看到更全局的内容。
- 池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。本质是降采样,可以大幅减少网络的参数量。
二、nn.MaxPool2d类的使用
from torch.nn import Conv2d
1.使用说明
官方解释
中文解释
补充:
-
dilation:空洞卷积示例,1号格和2号格中间有空格。
-
ceil_mode 参数中的ceil(向上取整)、floor(向下取整)
2.代码实现
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
class Model(nn.Module):
def __init__(self):
super().__init__() # 父类参数初始化
self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True) # 创建一个实例化
self.maxpool2 = MaxPool2d(kernel_size=3, ceil_mode=False) # 创建一个实例化
def forward(self, input, num):
if num == 1:
output = self.maxpool1(input)
else:
output = self.maxpool2(input)
return output
#---------------示例1:二维张量---------------#
# 二维张量,最大池化层的输入应该是torch.float32类型
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)
# 转化为四维张量,batch_size(数据个数)自动计算,,通道数是1,数据维度是5*5
input = torch.reshape(input, (-1, 1, 5, 5))
print(input.shape) # torch.Size([1, 1, 5, 5])
model = Model() # 创建一个实例
output1 = model(input, 1) # 父类__call__
output2 = model(input, 2) # 父类__call__
print(output1)
print(output2) # tensor([[[[2.]]]])
#---------------示例1:数据集---------------#
dataset = torchvision.datasets.CIFAR10(root="./dataset", train=False,
transform=torchvision.transforms.ToTensor()) # 创建实例
dataloader = DataLoader(dataset, batch_size=64) # 创建实例
step = 0
writer = SummaryWriter("./dataloader_logs") # 创建实例
for data in dataloader:
imgs, targets = data
writer.add_images("input", imgs, step)
output = model(imgs, 1) # 父类__call__
# 池化后,通道数不会变,不用reshape
writer.add_images("output", output, step)
step += 1
# tensorboard命令:tensorboard --logdir=dataloader_logs --port=6007
输出:
torch.Size([1, 1, 5, 5])
tensor([[[[2., 3.],
[5., 1.]]]])
tensor([[[[2.]]]])
TensorBoard输出:
卷积后通道数可能会变,池化后通道数不会变。
三、池化公式
参考:torch.nn.MaxPool2d