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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值