【学习笔记】【Pytorch】八、池化层

  • 学习地址
  • 主要内容
  • 一、最大池化操作示例
  • 二、nn.MaxPool2d类的使用
  • 1.使用说明
  • 2.代码实现
  • 三、池化公式


学习地址

PyTorch深度学习快速入门教程【小土堆】.

主要内容

一、最大池化操作示例
二、nn.MaxPool2d类的使用
作用:对于输入信号的输入通道,提供2维最大池化(max pooling)操作。
三、池化公式

一、最大池化操作示例

动图演示 默认步长为池化核尺寸。

pytorch全局平局池化代码 pytorch 池化_池化

  • 最大池化层(MaxPool),也叫下采样层。
  • 上采样就是低分辨率到高分辨率,下采样就是压缩图片分辨率。
  • 池化的由来:卷积输出中包含的大部分信息是冗余的,可以通过池化操作减小输入的大小以及输出中相似值的数量。池化最大的作用是增大感受野,能让后面的卷积核看到更全局的内容。
  • 池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。本质是降采样,可以大幅减少网络的参数量
  • 池化层的特征
  • 没有要学习的参数
    池化层和卷积层不同,没有需要学习的参数,池化只是从目标区域中取最大值(平均值),因此不存在要学习的过程。
  • 通道数不发生变化
    经过池化运算,输入数据和输出数据的通道数不会发生变化。
  • 对于微小的位置变化具有鲁棒性(健壮)
    输入数据发生微小变化时,池化仍会返回相同的结果,所以池化操作具有很强的鲁棒性。

二、nn.MaxPool2d类的使用

from torch.nn import Conv2d

1.使用说明

官方解释中文解释

pytorch全局平局池化代码 pytorch 池化_池化_02


补充

  • dilation:空洞卷积示例,1号格和2号格中间有空格。
  • pytorch全局平局池化代码 pytorch 池化_学习_03

  • ceil_mode 参数中的ceil(向上取整)、floor(向下取整)
  • pytorch全局平局池化代码 pytorch 池化_pytorch全局平局池化代码_04

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输出

pytorch全局平局池化代码 pytorch 池化_学习_05


卷积后通道数可能会变,池化后通道数不会变。

三、池化公式

参考:torch.nn.MaxPool2d

pytorch全局平局池化代码 pytorch 池化_深度学习_06