卷积神经网络 - 汇聚层

卷积神经网络一般由卷积层、汇聚层和全连接层构成,本文我们来学习汇聚层。

汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer),其作用是进 行特征选择,降低特征数量,从而减少参数数量。

卷积层虽然可以显著减少网络中连接的数量,但特征映射组中的神经元个数并没有显著减少。如果后面接一个分类器,分类器的输入维数依然很高,很容易出现过拟合。为了解决这个问题,可以在卷积层之后加上一个汇聚层,从而降低特征维数,避免过拟合。

在卷积神经网络(CNN)中,汇聚层(Pooling Layer) 是一种用于降低数据空间维度、增强特征鲁棒性的关键组件。其核心目标是通过对局部区域进行压缩抽象,保留重要信息的同时减少计算量。以下从多个角度详细解析汇聚层的工作原理和实际意义:

一、汇聚层的核心功能

功能说明
降维压缩减少特征图尺寸(如4×4 → 2×2),降低后续层计算复杂度。
特征抽象通过取最大值/平均值,突出显著特征,抑制噪声和细节干扰。
平移不变性微小位置变化不影响输出(如猫耳朵偏移5像素仍被检测到)。
防止过拟合降低参数量的同时引入轻微扰动,增强模型泛化能力。

二、汇聚层的类型与计算

1. 最大汇聚(Max Pooling)
  • 操作:在局部窗口内取最大值。

  • 公式

  • 优势:保留最显著特征(如边缘、纹理),适合物体检测任务。

  • 示例

    • 输入窗口(2×2):

    • 输出值:8

2. 平均汇聚(Average Pooling)
  • 操作:在局部窗口内取平均值。

  • 公式

  • 优势:平滑特征响应,适合分类任务(如ImageNet)。

  • 示例

    • 输入窗口(2×2):同上

    • 输出值:(5+8+3+1)/4=4.25

3. 其他变体
  • 全局平均汇聚(Global Average Pooling, GAP):将每个通道的特征图压缩为单个值,替代全连接层(如ResNet)。

  • 重叠汇聚(Overlapping Pooling):窗口步长小于窗口尺寸(如AlexNet中3×3窗口步长2),增加信息重叠。

  • 随机汇聚(Stochastic Pooling):按概率选择窗口内的值,增强泛化性。

三、汇聚层的实际效果

1. 特征图尺寸变化
  • 输入尺寸:H×W×C

  • 汇聚参数:窗口大小 K×K,步长 S

  • 输出尺寸

  • 示例:输入7×7,窗口2×2,步长2 → 输出3×3。

2. 特征抽象过程
  • 浅层汇聚:过滤低层次噪声(如光照变化)。

  • 深层汇聚:提取语义级特征(如物体部件)。

四、汇聚层与卷积层的对比

维度汇聚层卷积层
参数学习无参数(固定操作)可学习权重和偏置
计算目标压缩空间维度,增强鲁棒性提取局部特征,增加通道数
平移不变性强(最大池化)中等(依赖卷积核设计)
典型位置常用于卷积层后网络的基础组件

五、汇聚层的替代方案

1. 步长卷积(Strided Convolution)
  • 原理:用步长>1的卷积直接降维(如步长2的3×3卷积)。

  • 优势:避免信息丢失(池化可能丢弃有用细节),参数可控。

  • 应用:ResNet、MobileNet等现代网络常用此方法。

2. 空洞卷积(Dilated Convolution)
  • 原理:通过扩大感受野替代池化,保持分辨率(如语义分割任务)。

  • 示例:空洞率=2的3×3卷积 → 等效5×5感受野。

3. 空间金字塔汇聚(Spatial Pyramid Pooling, SPP)
  • 原理:多尺度池化后拼接,处理任意尺寸输入(如Fast R-CNN)。

六、总结与选择建议

核心价值
  • 计算效率:通过降维减少后续层的参数量和计算量。

  • 鲁棒性:最大池化提供对微小形变的容忍度。

  • 通用性:简单有效,适用于大多数视觉任务。

适用场景
  • 必须使用池化:传统CNN架构(如LeNet、AlexNet)、资源受限场景。

  • 可替代方案:需要高分辨率输出的任务(如分割)、现代轻量级网络(如MobileNet)。

设计建议
  1. 浅层网络:优先使用最大池化(保留关键特征)。

  2. 深层网络:可尝试步长卷积或空洞卷积(减少信息损失)。

  3. 分类任务:结合全局平均池化(GAP)替代全连接层。

  4. 密集预测任务(如分割):减少池化层数,或用空洞卷积保持分辨率。

最终结论
汇聚层是CNN中平衡计算效率特征鲁棒性的关键设计,其本质是通过局部区域的统计操作(最大/平均),在压缩数据的同时保留语义信息。合理选择池化策略,能显著提升模型性能与泛化能力。

七、局部窗口内取平均值的例子

以下是一个具体的平均汇聚(Average Pooling)示例,通过逐步计算展示如何在局部窗口内取平均值:

示例设定

  • 输入特征图(4×4矩阵):

    [[2, 5, 3, 8],[4, 7, 1, 6],[9, 2, 5, 4],[3, 6, 7, 1]
    ]
  • 池化参数

    • 窗口大小:2×2

    • 步长(Stride):2(不重叠滑动)

    • 填充(Padding):0

计算过程

步骤1:划分第一个窗口(左上角2×2区域)
  • 覆盖输入值

    [2, 5]
    [4, 7]
  • 计算平均值

    (2+5+4+7)/4=18/4=4.5
步骤2:向右滑动窗口(右上角2×2区域)
  • 覆盖输入值

    [3, 8]
    [1, 6]
  • 计算平均值

    (3+8+1+6)/4=18/4=4.5
步骤3:向下滑动窗口(左下角2×2区域)
  • 覆盖输入值

    [9, 2]
    [3, 6]
  • 计算平均值

    (9+2+3+6)/4=20/4=5.0
步骤4:向右滑动窗口(右下角2×2区域)
  • 覆盖输入值

    [5, 4]
    [7, 1]
  • 计算平均值

    (5+4+7+1)/4=17/4=4.25

最终输出特征图

[[4.5, 4.5],[5.0, 4.25]
]

关键说明

  1. 窗口与步长的影响

    • 输入尺寸:4×4

    • 窗口大小:2×2

    • 步长:2

    • 输出尺寸:

  2. 平均池化的意义

    • 平滑特征:抑制极端值(如原始矩阵中的9),保留区域整体强度。

    • 示例对比:若使用最大池化,右下角窗口输出为7(保留最大值),而平均池化为4.25,反映区域平均水平。

  3. 扩展场景

    • 重叠池化:若步长=1,窗口会重叠,输出尺寸变为3×3。

    • 全局平均池化:若窗口=输入尺寸(4×4),输出单个值:

通过这个例子可以看出,平均池化通过局部平均操作,将输入特征图压缩为更低维度的表示,同时减少对噪声的敏感度。

八、局部窗口内取最大值的例子

以下是一个具体的最大汇聚(Max Pooling)示例,通过逐步计算展示如何在局部窗口内取最大值:

示例设定

  • 输入特征图(4×4矩阵):

    [[2, 5, 3, 8],[4, 7, 1, 6],[9, 2, 5, 4],[3, 6, 7, 1]
    ]
  • 池化参数

    • 窗口大小:2×2

    • 步长(Stride):2(不重叠滑动)

    • 填充(Padding):0

计算过程

步骤1:划分第一个窗口(左上角2×2区域)
  • 覆盖输入值

    [2, 5]
    [4, 7]
  • 取最大值

    max⁡(2,5,4,7)=7
步骤2:向右滑动窗口(右上角2×2区域)
  • 覆盖输入值

    [3, 8]
    [1, 6]
  • 取最大值

    max⁡(3,8,1,6)=8
步骤3:向下滑动窗口(左下角2×2区域)
  • 覆盖输入值

    [9, 2]
    [3, 6]
  • 取最大值

    max⁡(9,2,3,6)=9
步骤4:向右滑动窗口(右下角2×2区域)
  • 覆盖输入值

    [5, 4]
    [7, 1]
  • 取最大值

    max⁡(5,4,7,1)=7

最终输出特征图

[[7, 8],[9, 7]
]

关键说明

  1. 窗口与步长的影响

    • 输入尺寸:4×4

    • 窗口大小:2×2

    • 步长:2

    • 输出尺寸:

  2. 最大池化的意义

    • 保留显著特征:例如左下角窗口的输入值 9(原始特征图中的最大值)被保留,而平均池化会将其平滑为 5.0

    • 抗噪声能力:若窗口内存在异常值(如传感器噪声),最大池化可能放大噪声影响,而平均池化可抑制噪声。

  3. 与平均池化的对比(基于相同输入):

    池化类型输出矩阵特征保留倾向
    最大池化[[7,8], [9,7]]突出局部最大值
    平均池化[[4.5,4.5], [5.0,4.25]]反映区域平均水平

扩展场景

  • 重叠窗口(步长=1)
    输入4×4,窗口2×2,步长1 → 输出3×3:

    复制

    [[7, 8, 8],[9, 7, 6],[9, 7, 7]
    ]
  • 全局最大池化(窗口=输入尺寸)
    输入4×4 → 输出单个值 9

汇聚层中最大汇聚过程示例图如下:

最大池化通过保留局部窗口内的最大值,突出图像中的显著特征(如边缘、纹理),适合需要强特征响应的任务(如目标检测)。而平均池化更适合需要平滑特征分布的场景(如图像分类)。两者选择需根据具体任务需求权衡。

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

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

相关文章

vue使用element-ui自定义样式思路分享【实操】

前言 在使用第三方组件时,有时候组件提供的默认样式不满足我们的实际需求,需要对默认样式进行调整,这就需要用到样式穿透。本篇文章以vue3使用element-ui的Tabs组件,对Tabs组件的添加按钮样式进行客制化为例。 确定需要修改的组…

【工具分享】vscode+deepseek的接入与使用

目录 第一章 前言 第二章 获取Deepseek APIKEY 2.1 登录与充值 2.2 创建API key 第三章 vscode接入deepseek并使用 3.1 vscode接入deepseek 3.2 vscode使用deepseek 第一章 前言 deepseek刚出来时有一段时间余额无法充值,导致小编没法给大家发完整的流程&…

【蓝桥杯速成】| 9.回溯升级

题目一:组合综合 问题描述 39. 组合总和 - 力扣(LeetCode) 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返…

【C++进阶】深入探索类型转换

目录 一、C语言中的类型转换 1.1 隐式类型转换 1.2. 显式类型转换 1.3.C语言类型转换的局限性 二、C 类型转换四剑客 2.1 static_cast:静态类型转换(编译期检查) 2.2 dynamic_cast:动态类型转换(运行时检查&…

代码随想录_动态规划

代码随想录 动态规划 509.斐波那契数 509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n…

计算机基础:编码03,根据十进制数,求其原码

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:计算机基础:编码02,有符号数编码&#xf…

设计模式(创建型)-单例模式

摘要 在软件开发的世界里,设计模式是开发者们智慧的结晶,它们为解决常见问题提供了经过验证的通用方案。单例模式作为一种基础且常用的设计模式,在许多场景中发挥着关键作用。本文将深入探讨单例模式的定义、实现方式、应用场景以及可…

基于FPGA频率、幅度、相位可调的任意函数发生器(DDS)实现

基于FPGA实现频率、幅度、相位可调的DDS 1 摘要 直接数字合成器( DDS ) 是一种通过生成数字形式的时变信号并进行数模转换来产生模拟波形(通常为正弦波)的方法,它通过数字方式直接合成信号,而不是通过模拟信号生成技术。DDS主要被应用于信号生成、通信系统中的本振、函…

本地JAR批量传私服

在有网络隔离的环境下,Maven项目如果没有搭建私服就得把用到的通用组件通过U盘在每个组员间拷贝来拷贝去。非常的麻烦跟低效。搭建私服,如果通用组件很多的时候手工一个一个上传更是非常的麻烦跟低效; 我就遇上这问题,跟A公司合作…

【ROS实战】02-ROS架构介绍

1. 简介 你是否曾有过这样的疑问:我按照文档安装了ROS,依照要求写了一些示例节点(node)、消息(msg)和话题(topic),但觉得过程既麻烦又繁琐。也许你开始怀疑:…

LeetCode算法题(Go语言实现)_07

题目 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复…

网络华为HCIA+HCIP 网络编程自动化

telnetlib介绍 telnetlib是Python标准库中的模块。它提供了实现Telnet功能的类telnetlib.Telnet。这里通过调用telnetlib.Telnet类里的不同方法实现不同功能。 配置云

查看GPU型号、大小;CPU型号、个数、核数、内存

GPU型号、大小 nvidia-smiCPU型号 cat /proc/cpuinfo | grep model name | uniqCPU个数 cat /proc/cpuinfo | grep "physical id" | uniq | wc -lCPU核数 cat /proc/cpuinfo | grep "cpu cores" | uniqCPU内存 cat /proc/meminfo | grep MemTotal参考…

Docker与K8S是什么该怎么选?

用了很久的容器化,最近突然看到一个问题问: docker和K8S究竟有什么区别,到底该怎么选?我认真思考了一会,发现一时间还真说不明白,于是就研究了一段时间发布今天的博文! Docker vs Kubernetes&a…

Android Handler 通过线程安全的 MessageQueue 和底层唤醒机制实现跨线程通信

目录 一、MessageQueue 的线程安全实现 1. 消息队列的同步锁(synchronized) 2. 消息顺序与延时处理 二、底层唤醒机制:从 Java 到 Linux 内核 1. 消息插入后的唤醒逻辑 2. Native 层实现(基于 Linux 的 eventfd 和 epoll&am…

关于 2>/dev/null 的作用以及机理

每个进程都有三个标准文件描述符:stdin(标准输入)、stdout(标准输出)和stderr(标准错误)。默认情况下,stderr会输出到终端。使用2>可以将stderr重定向到其他地方,比如…

MySQL中的锁机制:从全局锁到行级锁

目录 1. 锁的基本概念 2. 全局锁 2.1 全局锁的定义 2.2 全局锁的类型 2.3 全局锁的使用场景 2.4 全局锁的实现方式 2.5 全局锁的优缺点 2.6 全局锁的优化 3. 表级锁 3.1 表级锁的类型 3.2 表级锁的使用场景 3.3 表级锁的优缺点 4. 意向锁(Intention Lo…

编程语言选择分析:C#、Rust、Go 与 TypeScript 编译器优化

编程语言选择分析:C#、Rust、Go 与 TypeScript 编译器优化 在讨论编程语言的选择时,特别是针对微软的 C# 和 Rust,以及谷歌的 Go 语言,以及微软试图通过 Go 来拯救 TypeScript 编译器的问题,我们可以从多个角度来分析和…

基于WebRTC的嵌入式音视频通话SDK:EasyRTC跨平台兼容性技术架构实时通信的底层实现

EasyRTC的核心架构围绕WebRTC技术构建,同时通过扩展信令服务、媒体服务器和NAT穿透机制,解决了WebRTC在实际部署中的痛点。其架构可以分为以下几个核心模块: 1)WebRTC基础层 媒体捕获与处理:通过getUserMediaAPI获取…

【Rust】包和模块管理,以及作用域等问题——Rust语言基础15

文章目录 1. 前言2. 包和 Crate3. 定义模块以及模块之间的关系4. 作用域问题4.1. 作用域问题初现4.2. 解决问题一4.3. 解决问题二4.4. super 关键字4.5. 将路径引入作用域4.6. as 关键字4.7. pub use 重导出 5. 引入的问题5.1. 引入一个外部包5.2. 嵌套路径来消除大量的 use 行…