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

学习地址

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
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值