文章目录

  • 1. 二维最大池化层和平均池化层
  • 2. 填充和步幅
  • 3. 多通道
  • 小结

实际图像里,我们感兴趣的物体不会总出现在固定位置:即使我们连续拍摄同一个物体也极有可能出现像素位置上的偏移。这会导致同一个边缘对应的输出可能出现在卷积输出 Y中的不同位置,进而对后面的模式识别造成不便。

在本节中我们介绍池化(pooling)层,它的提出是为了缓解卷积层对位置的过度敏感性

1. 二维最大池化层和平均池化层

同卷积层一样,池化层每次对输入数据的一个固定形状窗口(又称池化窗口)中的元素计算输出。不同于卷积层里计算输入和核的互相关性,池化层直接计算池化窗口内元素的最大值或者平均值。该运算也分别叫做最大池化或平均池化。在二维最大池化中,池化窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当池化窗口滑动到某一位置时,窗口中的输入子数组的最大值即输出数组中相应位置的元素。

图5.6展示了池化窗口形状为2×22\times 22×2的最大池化,阴影部分为第一个输出元素及其计算所使用的输入元素。输出数组的高和宽分别为2,其中的4个元素由取最大值运算max\text{max}max得出:

max⁡(0,1,3,4)=4,max⁡(1,2,4,5)=5,max⁡(3,4,6,7)=7,max⁡(4,5,7,8)=8.\max(0,1,3,4)=4,\\ \max(1,2,4,5)=5,\\ \max(3,4,6,7)=7,\\ \max(4,5,7,8)=8.\\ max(0,1,3,4)=4,max(1,2,4,5)=5,max(3,4,6,7)=7,max(4,5,7,8)=8.

二维平均池化的工作原理与二维最大池化类似,但将最大运算符替换成平均运算符。池化窗口形状为p×qp \times qp×q的池化层称为p×qp \times qp×q池化层,其中的池化运算叫作p×qp \times qp×q池化。

让我们再次回到本节开始提到的物体边缘检测的例子。现在我们将卷积层的输出作为2×22\times 22×2最大池化的输入。设该卷积层输入是X、池化层输出为Y。无论是X[i, j]X[i, j+1]值不同,还是X[i, j+1]X[i, j+2]不同,池化层输出均有Y[i, j]=1。也就是说,使用2×22\times 22×2最大池化层时,只要卷积层识别的模式在高和宽上移动不超过一个元素,我们依然可以将它检测出来。

下面把池化层的前向计算实现在pool2d函数里。它跟5.1节(二维卷积层)里corr2d函数非常类似,唯一的区别在计算输出Y上。

import torch
from torch import nndef pool2d(X, pool_size, mode='max'):X = X.float()p_h, p_w = pool_sizeY = torch.zeros(X.shape[0] - p_h + 1, X.shape[1] - p_w + 1)for i in range(Y.shape[0]):for j in range(Y.shape[1]):if mode == 'max':Y[i, j] = X[i: i + p_h, j: j + p_w].max()elif mode == 'avg':Y[i, j] = X[i: i + p_h, j: j + p_w].mean()       return Y

我们可以构造图5.6中的输入数组X来验证二维最大池化层的输出。

X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
pool2d(X, (2, 2))

输出:

tensor([[4., 5.],[7., 8.]])

同时我们实验一下平均池化层。

pool2d(X, (2, 2), 'avg')

输出:

tensor([[2., 3.],[5., 6.]])

2. 填充和步幅

同卷积层一样,池化层也可以在输入的高和宽两侧的填充并调整窗口的移动步幅来改变输出形状。池化层填充和步幅与卷积层填充和步幅的工作机制一样。我们将通过nn模块里的二维最大池化层MaxPool2d来演示池化层填充和步幅的工作机制。我们先构造一个形状为(1, 1, 4, 4)的输入数据,前两个维度分别是批量和通道。

X = torch.arange(16, dtype=torch.float).view((1, 1, 4, 4))
X

输出:

tensor([[[[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.],[12., 13., 14., 15.]]]])

默认情况下,MaxPool2d实例里步幅和池化窗口形状相同。下面使用形状为(3, 3)的池化窗口,默认获得形状为(3, 3)的步幅。

pool2d = nn.MaxPool2d(3)
pool2d(X)

输出:

tensor([[[[10.]]]])

我们可以手动指定步幅和填充。

pool2d = nn.MaxPool2d(3, padding=1, stride=2)
pool2d(X)

输出:

tensor([[[[ 5.,  7.],[13., 15.]]]])

当然,我们也可以指定非正方形的池化窗口,并分别指定高和宽上的填充和步幅。

pool2d = nn.MaxPool2d((2, 4), padding=(1, 2), stride=(2, 3))
pool2d(X)

输出:

tensor([[[[ 1.,  3.],[ 9., 11.],[13., 15.]]]])

3. 多通道

在处理多通道输入数据时,池化层对每个输入通道分别池化,而不是像卷积层那样将各通道的输入按通道相加。这意味着池化层的输出通道数与输入通道数相等。下面将数组XX+1在通道维上连结来构造通道数为2的输入。

X = torch.cat((X, X + 1), dim=1)
X

输出:

tensor([[[[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.],[12., 13., 14., 15.]],[[ 1.,  2.,  3.,  4.],[ 5.,  6.,  7.,  8.],[ 9., 10., 11., 12.],[13., 14., 15., 16.]]]])

池化后,我们发现输出通道数仍然是2。

pool2d = nn.MaxPool2d(3, padding=1, stride=2)
pool2d(X)

输出:

tensor([[[[ 5.,  7.],[13., 15.]],[[ 6.,  8.],[14., 16.]]]])

小结

  • 最大池化和平均池化分别取池化窗口中输入元素的最大值和平均值作为输出。
  • 池化层的一个主要作用是缓解卷积层对位置的过度敏感性。
  • 可以指定池化层的填充和步幅。
  • 池化层的输出通道数跟输入通道数相同。

pytorch学习笔记(二十二):Pooling相关推荐

  1. pytorch学习笔记(十二):权重衰减

    文章目录 1. 方法 2. 高维线性回归实验 3. 从零开始实现 3.1 初始化模型参数 3.2 定义L2L_2L2​范数惩罚项 3.3 定义训练和测试 3.4 观察过拟合 3.5 使用权重衰减 4. ...

  2. pytorch学习笔记(十二):详解 Module 类

    Module 是 pytorch 提供的一个基类,每次我们要 搭建 自己的神经网络的时候都要继承这个类,继承这个类会使得我们 搭建网络的过程变得异常简单. 本文主要关注 Module 类的内部是怎么样 ...

  3. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  4. Windows保护模式学习笔记(十二)—— 控制寄存器

    Windows保护模式学习笔记(十二)-- 控制寄存器 控制寄存器 Cr0寄存器 Cr2寄存器 Cr4寄存器 控制寄存器 描述: 控制寄存器有五个,分别是:Cr0 Cr1 Cr2 Cr3 Cr4 Cr ...

  5. 汇编入门学习笔记 (十二)—— int指令、port

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...

  6. OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器

    OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器 1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此 ...

  7. QT学习笔记(十二):透明窗体设置

    QT学习笔记(十二):透明窗体设置 创建 My_Widget 类 基类为QWidget , My_Widget.cpp 源文件中添加代码 #include "widget.h" # ...

  8. MATLAB学习笔记(十二)

    MATLAB学习笔记(十二) 一.数据插值 1.1 数据插值的计算机制 1.2 数据插值的matlab函数 二.曲线拟合 2.1 曲线拟合原理 2.2 曲线拟合的实现方法 三.数据插值与曲线拟合比较 ...

  9. Windows Workflow HOL学习笔记(十二):创建状态基工作流

    W indows Workflow HOL学习笔记(十二):创建状态基工作流 本文内容来自Microsoft Hands-on Labs for Windows Workflow Foundation ...

  10. 模电学习笔记(十二)——跨阻放大器

    模电学习笔记(十二) 跨阻放大器 跨组运算放大器是将电流信号转换成为电压信号,电流到电压增益基于反馈电阻. 设计目标: 输入 输出 带宽 电源 0A 100uA 0V 7V 20kHz 15V -15 ...

最新文章

  1. python函数中参数前面的*和**的含义
  2. http2-stream-optima-prioritation
  3. git简介 http://msysgit.github.io/
  4. C语言编写Scheme解释器,C语言编写logo语言解释器 ,求高手指导
  5. if you want to have your life valuable
  6. 组合模式coding
  7. proguard android 配置,android – Proguard忽略库的配置文件
  8. iOS多视图代码操作
  9. 利用Postman工具测试若依前后端分离接口
  10. 高动态范围图像是什么
  11. Java 多并发之原子访问(Atomic Access)
  12. 漫画:“架构师”小赵的故事
  13. demo是什么?demo有什么用?
  14. matlab心率和呼吸相关性分析,动态心电图的睡眠呼吸监测与心率变异性的相关性分析...
  15. CNN之Xception Keras实现模型训练
  16. 网站性能优化之DNS Prefetch
  17. Keil_MDK 中绝对地址定位问题
  18. 《论程序员与老板之间的道德问题》
  19. 盛迈坤电商:店铺自然流量怎么提升
  20. 小红书推广方式和技巧有哪些?

热门文章

  1. datetimepicker一个不错的日历android特效
  2. java类和对象的基础(笔记)
  3. error: libXpm.(a|so)
  4. JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体
  5. Tokyo Tyrant (ttserver)的master-slave复制协议分析
  6. 利用JS+Ajax实现下拉列表无刷联动,及其相关
  7. [Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring实现AOP
  8. 《出发吧一起》第二阶段个人总结——Day01
  9. 经典算法题每日演练——第二十四题 梳排序
  10. Delphi 精选文章地址