【从零开始学习深度学习】24.神经网络中池化层的作用:最大池化与平均池化

news2024/11/23 12:05:49

在之前二维卷积层介绍的图像物体边缘检测应用中,我们构造卷积核从而精确地找到了像素变化的位置。设任意二维数组Xij列的元素为X[i, j]。如果我们构造的卷积核输出Y[i, j]=1,那么说明输入中X[i, j]X[i, j+1]数值不一样。这可能意味着物体边缘通过这两个元素之间。但实际图像里,我们感兴趣的物体不会总出现在固定位置:即使我们连续拍摄同一个物体也极有可能出现像素位置上的偏移。这会导致同一个边缘对应的输出可能出现在卷积输出Y中的不同位置,进而对后面的模式识别造成不便。

目录

    • 1. 二维最大池化层和平均池化层
    • 2. 池化层的填充和步幅
    • 3. 对多通道进行池化
    • 4. 总结

本文将介绍池化(pooling)层,它的主要目的是为了缓解卷积层对位置的过度敏感性

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

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

图1 池化窗口形状为 2 x 2 的最大池化
图1展示了池化窗口形状为$2\times 2$的最大池化,阴影部分为第一个输出元素及其计算所使用的输入元素。输出数组的高和宽分别为2,其中的4个元素由取最大值运算$\text{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 × q p \times q p×q的池化层称为 p × q p \times q p×q池化层,其中的池化运算叫作 p × q p \times q p×q池化。

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

定义一个池化层向前计算的函数pool2d

import torch
from torch import nn

def pool2d(X, pool_size, mode='max'):
    # 默认使用最大池化,平均池化将Mode设置为avg
    X = X.float()
    p_h, p_w = pool_size
    Y = 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

我们可以构造图1中的输入数组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.]]]])

4. 总结

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

对文章存在的问题,或者其他关于Python相关的问题,都可以在评论区留言或者私信我哦

如果文章内容对你有帮助,感谢点赞+关注!

关注下方GZH:阿旭算法与机器学习,可获取更多干货内容~欢迎共同学习交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计的网上点餐系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

自动控制原理笔记-自动控制的一般概念

目录 概念: 自动控制系统的基本组成: 基本控制方式: 一个控制系统的方框图:(由工作原理图绘制方框图) 控制系统的组成: 小结: ​​​​​​​ ​​​​​​​ ​​​​​​​ 梦开始的地方…

微火:AI绘图网站程序源码搭建,定制专属的ai绘画小程序

随着AI绘画的火热,群众对于AI绘画的需求与日俱增,目前已有的小程序、ai绘图软件已不能很好地满足当下用户的画图需求,经常排队生图,一排就是几个小时,或者前面直接8万人排队的现象早日屡见不鲜。 新的优秀的AI绘画小程…

java的序列化与反序列化

什么是序列化与反序列化 序列化: 说白了,就是把一个实现了Serializable接口(只有实现了这个接口的类才能被序列化与反序列化)的类去变成本地文件保存。 反序列化: 说白了,就是把上面保存的本地文件&#…

LeetCode62. 不同路径(java解法——动态规划)

1 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径&#xff1f…

电脑一键重装一直在系统优化升级怎么办

小白一键重装一直在系统优化升级怎么办?电脑总是卡在这个画面上,遇到这种情况该怎么解决呢?遇到这种情况大家也不要慌,小面小编就来演示下如何解决小白一键重装一直在系统优化升级的问题。 工具/原料: 系统版本:win10家庭版 …

电脑免费录屏软件哪个好用?分享3款,亲测好用

相比于图片,视频给人的感受更加通俗易懂,短短几分钟的视频,就能将几十张图片想要表达的意思给表达出来。电脑录屏正是制作视频的其中一部分,但也有不少的小伙伴对于电脑录屏不太熟悉,希望小编分享一些电脑免费录屏软件…

HTML语法学习以及作业解答

文章目录技巧html标签练习作业01作业02作业03作业04作业05作业06作业07作业08作业09作业10技巧 1 输入 html5即可补全出html的骨架,或者是! tab键 2 MDN网站:https://developer.mozilla.org/zh-CN/ 3 div带回车,span后面不带回…

计组 | DRAM芯片、多模块存储器、加法器标志位、软件硬件的关系、扩展操作码、程序转换过程

内容来自 —— 王道 自用学习笔记整理 一、DRAM芯片与内存条 1.1、DRAM芯片 1.2、访问内存时DRAM芯片读取过程 多个芯片并行传输,每一轮每个芯片的行列都相同,n个芯片就会有n个超元 n个超元加起来就是数据总线的长度,如图中超元=8位,数据总线=8个超元=64位 1.3、DRAM引脚数…

使用Apifox创建Mock智能操作

去接口管理新建一个接口来设计 然后直接保存运行,就可以发现已经自动为我们的Mock添加上了相关的属性值,只需要输入相关的字段名就可以了。 设置自定义智能Mock,之前我们智能Mock生成的数据都是通过这个工具实现的。只要你的值匹配上了就会通…

从数据治理到数据应用,制造业企业如何突破数字化转型困境丨行业方案

我国制造业拥有31个大类、179个中类和609个小类,是全球产业门类最齐全、产业体系最完整的制造业。作为世界工厂,中国制造业在拉动本国经济增长、促进本国就业等方面贡献卓越,更是我国民生消费的底层基础。同时,中国从原来的原料出…

OpenSSL QuickStart

文章目录1. Windows环境PerlnasmOpenSSL编译VS测试项目2. Linux环境编译测试项目参考资料1. Windows环境 Windows 10VS 2019nasm汇编工具:https://nasm.us/Perl: 官网地址https://www.perl.org/get.htmlOpenSSL: 官网地址:https://www.opens…

2022下半年软件设计师备考经验帖

祝大家逢考必过 7月1号备考-11月05号考试 推荐up主:zst_2001 跟着视频来基本必过 以下是复习资料 章节章节01 - 计算机组成原理与体系结构07 - 法律法规与标准化与多媒体基础02 - 操作系统基本原理08 - 设计模式03 - 数据库系统09 - 软件工程04 - 计算机网络10 - …

垂直领域问答小程序开发,打开知识领域无限能量

知乎作为一款问答类app,深受大众信赖,知乎构建了一个人人都可以便捷接入的知识分享网络,让人们便捷的与世界分享知识、经验和见解,让我们发现更大的世界。知乎的成功让很多人看到了垂直领域问答小程序存在的商机,想要进…

[JavaScript]使用opencv.js实现基于傅里叶变换的频域水印(隐水印)

PS:查了多方资料,都没有提到用 JavaScript 来实现频域水印的教程,故经过笔者的实践,遂写一篇教程来简单介绍。 通过了解频域水印的相关知识,我理解了频域水印就是先将图片进行傅里叶变换,得到频域图&#x…

全国制造业新产品开发流程管理(甄选班)招生简章

近来,越来越多的TO C企业已经将业务从C端转型到了B端,而传统的市场品牌部门除了品牌相关的工作,也将会越来越多承担企业“增长”的业务;“营”与“销”脱节的是市场部门也越来越受到了Diss。 那么,To B产品经理能力提…

package xxx does not exist

1、开发环境如下: gradle 7.3.3: gradle插件:7.2 AS: 2、报错日志 /Users/andrew/Documents/React/Code/TestRetrofit/app/src/main/java/com/lwd/testretrofit/MainActivity.java:8: error: package com.lwd.testretrofit.lwd does not e…

如何用好图表?

如何选择合适的图表? 在可视化图表中,基于不同的目的,我们要选择不同的图表 一般情况下,我们需要借助图表达成4个目的:展示比较,展示分布,展示联系,展示构成 一.作用 1.展示比较 …

数据结构-克鲁斯卡尔算法,普利姆算法(求最小生成树)

当然了昨天晚上写了求两源点之间最少权值和,就不得不再写一下另外两个求最小生成树的算法分别是克鲁斯卡尔和普利姆了,话不多说直接进入主题 目录 并查集: 克鲁斯卡尔算法(与并查集结合起来): 普利姆算法: 并查集&a…

[附源码]Python计算机毕业设计高校教学过程管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…