当前位置: 首页 > news >正文

PyTorch 池化层详解

在深度学习中,池化层(Pooling Layer)是卷积神经网络(CNN)中的关键组成部分。池化层的主要功能是对特征图进行降维和减少计算量,同时增强模型的鲁棒性。本文将详细介绍池化层的作用、种类、实现方法,并对比其与卷积层的异同,以及深入探讨全局池化的应用。

1. 池化层的作用

池化层的核心作用包括以下几个方面:

  1. 降维:通过池化操作,可以减少特征图的空间尺寸(高度和宽度),从而降低计算复杂度。
  2. 特征提取:池化层保留局部区域的显著特征,如边缘、纹理等。
  3. 抑制噪声:池化操作可以抑制输入特征图中的局部噪声,提高模型的鲁棒性。
  4. 防止过拟合:通过减少特征图的尺寸和参数数量,池化层有助于防止模型过拟合。
2. 池化层的类型

池化层主要包括最大池化(Max Pooling)和平均池化(Average Pooling),此外还有全局池化(Global Pooling)。

2.1 最大池化(Max Pooling)

最大池化选取池化窗口内的最大值作为输出。这种方法能够保留特征图中最显著的特征,通常用于提取边缘等强特征。

import torch
import torch.nn as nn# 创建一个二维最大池化层,池化窗口大小为2x2,步幅为2x2
maxpool2d = nn.MaxPool2d(kernel_size=2, stride=2)# 输入数据为 (batch_size, channels, height, width)
input_tensor = torch.tensor([[[[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]]]], dtype=torch.float32)# 进行池化操作
output_tensor = maxpool2d(input_tensor)
print(output_tensor)

输出结果为:

tensor([[[[ 6.,  8.],[14., 16.]]]])
2.1.1 最大池化的详细计算过程

最大池化(Max Pooling)是一种常见的池化操作,用于对输入特征图进行降维和特征提取。其核心思想是通过池化窗口(也称为滤波器)在特征图上滑动,并在每个窗口内选取最大值作为该窗口的输出,从而形成一个新的、尺寸较小的特征图。

1. 池化窗口(Pooling Window)

池化窗口是一个固定大小的矩形区域,通常用kernel_size参数指定。例如,kernel_size=2表示一个2x2的池化窗口。池化窗口在特征图上滑动,滑动的步幅用stride参数指定。例如,stride=2表示池化窗口每次滑动2个单位。

2. 操作过程

假设我们有一个输入特征图,每个池化窗口覆盖特征图的一部分,最大池化的具体操作步骤如下:

  1. 选择窗口位置:将池化窗口放置在特征图的左上角,覆盖一个kernel_size大小的区域。
  2. 计算最大值:在这个窗口内,找出所有元素的最大值。
  3. 记录结果:将这个最大值记录到输出特征图的对应位置。
  4. 滑动窗口:按照stride参数指定的步幅,滑动池化窗口到新的位置,重复步骤2和步骤3,直到整个特征图都被池化窗口覆盖。
3. 示例

假设我们有一个4x4的特征图,池化窗口大小为2x2,步幅为2。具体操作如下:

输入特征图:

[[1, 3, 2, 4],[5, 6, 8, 7],[4, 2, 1, 0],[9, 7, 3, 2]]

池化过程:

  1. 第一个窗口覆盖位置(左上角2x2):
    [[1, 3],[5, 6]]
    
    最大值为6。
  2. 第二个窗口覆盖位置(右上角2x2):
    [[2, 4],[8, 7]]
    
    最大值为8。
  3. 第三个窗口覆盖位置(左下角2x2):
    [[4, 2],[9, 7]]
    
    最大值为9。
  4. 第四个窗口覆盖位置(右下角2x2):
    [[1, 0],[3, 2]]
    
    最大值为3。

输出特征图:

[[6, 8],[9, 3]]

请添加图片描述

4. 代码实现

以下是使用PyTorch实现上述最大池化操作的代码示例:

import torch
import torch.nn as nn# 定义一个2x2的最大池化层,步幅为2
maxpool2d = nn.MaxPool2d(kernel_size=2, stride=2)# 输入数据 (1, 1, 4, 4) 表示 (batch_size, channels, height, width)
input_tensor = torch.tensor([[[[1, 3, 2, 4],[5, 6, 8, 7],[4, 2, 1, 0],[9, 7, 3, 2]]]], dtype=torch.float32)# 进行池化操作
output_tensor = maxpool2d(input_tensor)
print(output_tensor)

输出结果为:

tensor([[[[6., 8.],[9., 3.]]]])
2.2 平均池化(Average Pooling)

平均池化计算池化窗口内的平均值作为输出。它能够平滑特征图,通常用于减少噪声。

import torch
import torch.nn as nn# 创建一个二维平均池化层,池化窗口大小为2x2,步幅为2x2
avgpool2d = nn.AvgPool2d(kernel_size=2, stride=2)# 输入数据为 (batch_size, channels, height, width)
input_tensor = torch.tensor([[[[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]]]], dtype=torch.float32)# 进行池化操作
output_tensor = avgpool2d(input_tensor)
print(output_tensor)

输出结果为:

tensor([[[[ 3.5,  5.5],[11.5, 13.5]]]])
3. 全局池化(Global Pooling)

全局池化是一种特殊的池化操作,它将整个特征图缩小为一个单独的值。全局池化通常用于卷积神经网络的最后一个池化层,目的是将特征图的空间维度完全去除,从而得到一个固定大小的输出。这对于连接全连接层(Fully Connected Layer)或进行分类任务非常有用。

3.1 全局平均池化(Global Average Pooling)

全局平均池化计算整个特征图的平均值。

import torch
import torch.nn as nn# 定义一个全局平均池化层
global_avgpool = nn.AdaptiveAvgPool2d((1, 1))# 输入数据 (batch_size, channels, height, width)
input_tensor = torch.tensor([[[[1, 3, 2, 4],[5, 6, 8, 7],[4, 2, 1, 0],[9, 7, 3, 2]]]], dtype=torch.float32)# 进行全局平均池化操作
output_tensor = global_avgpool(input_tensor)
print("全局平均池化后的特征图:", output_tensor)

输出结果为:

全局平均池化后的特征图: tensor([[[[4.2500]]]])
3.2 全局最大池化(Global Max Pooling)

全局最大池化计算整个特征图的最大值。

import torch
import torch.nn as nn# 定义一个全局最大池化层
global_maxpool = nn.AdaptiveMaxPool2d((1, 1))# 输入数据 (batch_size, channels, height, width)
input_tensor = torch.tensor([[[[1, 3, 2, 4],[5, 6, 8, 7],[4, 2, 1, 0],[9, 7, 3, 2]]]], dtype=torch.float32)# 进行全局最大池化操作
output_tensor = global_maxpool(input_tensor)
print("全局最大池化后的特征图:", output_tensor)

输出结果为:

全局最大池化后的特征图: tensor([[[[9.]]]])
3.3 全局池化的应用

全局池化在深度学习模型中有许多应用,特别是在卷积神经网络(CNN)中。以下是一些常见的应用场景:

  1. 简化模型结构:全局池化可以将特征图的空间维度完全去除,从而简化模型结构。这使得模型在处理不同尺寸的输入时更加灵活。
  2. 减少参数:全局池化可以减少全连接层的参数数量,因为它将特征图缩小为一个固定大小的输出。这有助于降低模型的复杂度和过拟合风险。
  3. 提高模型的泛化能力:全局池化通过聚合整个特征图的信息,可以提高模型的泛化能力,使其在不同数据集上表现更好。
3.4 全局池化与传统池化的对比
特性传统池化(如 MaxPool2d, AvgPool2d)全局池化(Global Pooling)
池化窗口大小固定大小(如 2x2, 3x3)覆盖整个特征图
输出尺寸依据池化窗口大小和步幅固定为 1x1
主要用途局部特征提取和降维全局特征聚合和降维
计算复杂度较低较低
参数数量无参数无参数
4. 池化层和卷积层的对比

池化层和卷积层在使用滑动窗口和降维方面有相似之处,但它们的功能和作用不同。

相似之处
  1. 滑动窗口(Kernel):两者都使用固定大小的窗口在特征图上滑动。
  2. 降维:两者都可以通过设置适当的步幅(stride)来减少特征图的空间尺寸。
  3. 步幅(Stride):两者都可以设置步幅来控制滑动窗口的移动步长,从而影响输出特征图的大小。
不同之处
  1. 操作性质

    • 池化层:主要用于降维和特征选择,操作较为简单(如最大值或平均值计算)。池化层无参数更新,不涉及学习过程。
    • 卷积层:用于特征提取,通过卷积运算捕捉局部特征。卷积层包含可学习的参数(卷积核),这些参数通过反向传播进行更新。
  2. 输出特征图的内容

    • 池化层:输出的特征图是输入特征图的一种精简表示,保留了局部区域的显著特征(如最大值或平均值)。
    • 卷积层:输出的特征图是通过卷积核的加权求和得到的,能够捕捉到输入特征图的不同特征(如边缘、纹理等)。
  3. 学习能力

    • 池化层:无学习能力,不含可学习的参数。
    • 卷积层:具有学习能力,卷积核参数通过训练过程进行优化。
5. 计算输出特征图的大小

池化操作后输出特征图的大小可以通过以下公式计算。假设输入特征图的高度和宽度分别为 H in H_{\text{in}} Hin W in W_{\text{in}} Win,池化窗口的大小(即 kernel size)为 k h × k w k_h \times k_w kh×kw,步幅(stride)为 s h s_h sh s w s_w sw,填充(padding)为 p h p_h ph p w p_w pw

无填充情况下的输出大小计算

在无填充(padding = 0)的情况下,输出特征图的高度 H out H_{\text{out}} Hout 和宽度 W out W_{\text{out}} Wout 可以通过以下公式计算:

H out = ⌊ H in − k h s h ⌋ + 1 H_{\text{out}} = \left\lfloor \frac{H_{\text{in}} - k_h}{s_h} \right\rfloor + 1 Hout=shHinkh+1

W out = ⌊ W in − k w s w ⌋ + 1 W_{\text{out}} = \left\lfloor \frac{W_{\text{in}} - k_w}{s_w} \right\rfloor + 1 Wout=swWinkw+1

有填充情况下的输出大小计算

在有填充的情况下,填充的大小分别为 p h p_h ph p w p_w pw,输出特征图的高度 H out H_{\text{out}} Hout 和宽度 W out W_{\text{out}} Wout 可以通过以下公式计算:

H out = ⌊ H in + 2 p h − k h s h ⌋ + 1 H_{\text{out}} = \left\lfloor \frac{H_{\text{in}} + 2p_h - k_h}{s_h} \right\rfloor + 1 Hout=shHin+2phkh+1

W out = ⌊ W in + 2 p w − k w s w ⌋ + 1 W_{\text{out}} = \left\lfloor \frac{W_{\text{in}} + 2p_w - k_w}{s_w} \right\rfloor + 1 Wout=swWin+2pwkw+1

总结

池化层在深度学习中扮演着重要角色,通过降维、特征提取和抑制噪声等功能,显著提高了模型的计算效率和鲁棒性。最大池化和平均池化是最常见的池化操作,而全局池化作为一种特殊的池化方法,在简化模型结构和提高泛化能力方面表现突出。了解池化层的工作原理和应用,对于设计和优化高效的深度学习模型至关重要。

参考链接

PyTorch概述
Pytorch :张量(Tensor)详解
PyTorch 卷积层详解
PyTorch 全连接层(Fully Connected Layer)详解
PyTorch 池化层详解
PyTorch 激活函数及非线性变换详解

相关文章:

PyTorch 池化层详解

在深度学习中,池化层(Pooling Layer)是卷积神经网络(CNN)中的关键组成部分。池化层的主要功能是对特征图进行降维和减少计算量,同时增强模型的鲁棒性。本文将详细介绍池化层的作用、种类、实现方法&#xf…...

Intel架构的基本知识

1.字节序 CPU的字节序分为LittleEndian和BigEndian。 所谓Endian,就是多字节数据在内存中的排列方式。 例如,假设有一个整数0x11223344: LittleEndian的排列方式是,从内存的低地址开始,依次存放 0x44 0x33 0x22 0x11; BigEndian的排列方式是,从内存的低地址开始,依…...

Element Plus 中Input输入框

通过鼠标或键盘输入字符 input为受控组件,他总会显示Vue绑定值,正常情况下,input的输入事件会正常被响应,他的处理程序应该更新组件的绑定值(或使用v-model)。否则,输入框的值将不会改变 不支…...

大模型中常见 loss 函数

loss 函数 首先,Loss 是允许不降到 0 的,模型计算的 loss 最终结果可以接近 0。 可以成为 loss 函数的条件## 常用 loss 以下函数调用基于 Pytorch,头文件导入: import torch.nn as nn 均方差(MSE) nn.…...

(十六)Ubuntu 20.04 下搭建PX4+MATLAB 仿真环境(HITL)

在文章(十五)Ubuntu 20.04 下搭建PX4MATLAB 仿真环境我们学习了如何配置仿真环境,在本节,主要进行HITL的仿真环境搭建。 根据(十五)Ubuntu 20.04 下搭建PX4MATLAB 仿真环境完成配置到如下界面:…...

Matlab simulink建模与仿真 第十七章(补充离散库和补充数学库)

参考视频:simulink1.1simulink简介_哔哩哔哩_bilibili 一、补充离散库和补充数学库中的模块概览 1、补充离散库 注:每个版本的补充离散库不一定相同,也不是每个版本的库都有如上所有模块。 2、补充数学库 二、离散直接传递函数Ⅱ模块 1、…...

Android Glide:让图片加载从未如此简单

在 Android 开发中,图片加载一直是一个关键环节。无论是从网络还是本地加载图片,都需要考虑到性能、内存管理和用户体验等多个方面。而在这方面,Glide 成为了众多开发者的首选库之一。本文将带你深入了解 Glide 的强大之处,并介绍如何在项目中快速集成和使用 Glide。 为什…...

YOLOv9改进策略【注意力机制篇】| 2024 SCSA-CBAM 空间和通道的协同注意模块

一、本文介绍 本文记录的是基于SCSA-CBAM注意力模块的YOLOv9目标检测改进方法研究。现有注意力方法在空间-通道协同方面未充分挖掘其潜力,缺乏对多语义信息的充分利用来引导特征和缓解语义差异。SCSA-CBAM注意力模块构建一个空间-通道协同机制,使空间注意力引导通道注意力增…...

Obsidian 全部笔记共享配置文件,obsidian仓库-文件夹配置统一化

obsidian仓库-文件夹配置统一化 在每次新建obsidian仓库(vaults)时,仓库的主题和快捷键等都需要重新设置,这是因为每次创建新的仓库时 新仓库的配置文件都是默认配置但是如果通过复制粘贴旧配置文件来达到新仓库的配置和旧仓库一致的话,无法…...

c++可视化打印树

#include <iostream> #include <string>// 定义节点结构体 struct Node {std::string data;Node* left;Node* right;Node(const std::string& data) : data(data), left(nullptr), right(nullptr) {} };// 递归打印树 void printTree(Node* root, std::string …...

ElementUI 快速入门:使用 Vue 脚手架搭建项目

文章目录 一 . ElementUI 的基本安装1.1 通过 Vue 脚手架创建项目1.2 在 vue 脚手架中安装 ElementUI1.3 编写页面 ElementUI 是 Vue.js 的强大 UI 框架&#xff0c;让前端界面开发变得简单高效。本教程将带你从安装到实战&#xff0c;快速掌握 ElementUI 的核心技巧。 核心内容…...

算法打卡:第十一章 图论part02

今日收获&#xff1a;岛屿数量&#xff08;深搜&#xff09;&#xff0c;岛屿数量&#xff08;广搜&#xff09;&#xff0c;岛屿的最大面积 1. 岛屿数量&#xff08;深搜&#xff09; 题目链接&#xff1a;99. 岛屿数量 思路&#xff1a;二维遍历数组&#xff0c;先判断当前…...

广度优先搜索算法及其matlab程序详解

#################本文为学习《图论算法及其MATLAB实现》的学习笔记################# 算法用途 广度优先搜索算法的应用 算法思想 广度优先搜索算法的步骤: ①,标号,令。 ②当所有标号为 的、与顶点 相关联的边的端点都已标号时,则停止;否则,把与 相关联的边的未标号的…...

力扣 438找到字符串中所有字母异位词

https://leetcode.cn/problems/find-all-anagrams-in-a-string/ 题目描述 题目分析 异位词所表示的空间 P \text{P} P 即一字符串的所有排列,记 s i \bold{s_i} si​为以 s [ i ] s[i] s[i]开头的长度为 plen \text{plen} plen的 s s s子串 故本题可理解为求解 A n s Ans Ans…...

图像滤波---各项异性扩散滤波使用笔记及代码

图像滤波---各项异性扩散滤波使用笔记及代码 一、文章内容介绍二、各项异性扩散滤波和各项同性滤波1、各项同性滤波2、各项异性扩散滤波3、各项异性和各项同性的对比 三、各项异性扩散滤波的原理介绍四、各项异性扩散滤波公式五、公式中的参数使用说明1、扩散速率 λ \lambda λ…...

用Go语言构建健壮的并发系统:深入理解错误传播与处理

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在当今的软件开发中,构建并发和分布式系统已经成为常态。然而,在这些系统中,错误的发生频率高且定位困难。如果我们能够深入考虑错误如何在系统中传播,以及最终如何呈现给用户,那么我们就能为自己、团队和用…...

掌握C#中的动态规划技术

C# 中的动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种在数学、计算机科学和经济学中使用的&#xff0c;通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划通常用于优化问题&#xff0c;特别是那些具有重叠子问题和最优子结构性质的问题…...

C语言进阶【5】---数据在内存中的存储【2】(小数存储很难吗?)

本章概述 本章引要练习 浮点数的存储浮点数的取出小补充题目解析彩蛋时刻&#xff01;&#xff01;&#xff01; 本章引要 常见的浮点数&#xff1a;3.1415&#xff0c;1E10等。其中&#xff0c;1E10是科学计数法的形式&#xff0c;它也就等于1*10^10。小数数据类型&#xff1…...

如何更新至CDS-Beta下载ERA5数据

数据下载网站 api 更新 api setup 更新api 2024年9月26日起老版的CDS将被停用&#xff0c;会搬迁到CDS-beta上。 创建一个新的CDS-beta账户&#xff0c;也可以使用之前的ECMWF账户。https://cds-beta.climate.copernicus.eu/vi ~/.cdsapirc &#xff0c;登陆https://cds-bet…...

SQL编程题复习(24/9/20)

练习题 x25 10-120 统计每个班级期末成绩的最高分&#xff08;Max&#xff09;&#xff0c;显示班级名称、期末最高成绩10-121 显示没有班导师的班级名称、院系名称10-122 将电子信息1班(班级编号&#xff1a;08)的班主任编号改为李丽清老师的编号&#xff08;PTA题目表述错误&…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...