Pytorch深度学习框架实战教程-番外篇02-Pytorch池化层概念定义、工作原理和作用

 相关文章 + 视频教程

《Pytorch深度学习框架实战教程01》《视频教程

Pytorch深度学习框架实战教程02:开发环境部署》《视频教程

Pytorch深度学习框架实战教程03:Tensor 的创建、属性、操作与转换详解》《视频教程

《Pytorch深度学习框架实战教程04:Pytorch数据集和数据导入器》《视频教程

《Pytorch深度学习框架实战教程05:Pytorch构建神经网络模型》《视频教程

《Pytorch深度学习框架实战教程06:Pytorch模型训练和评估》《视频教程

Pytorch深度学习框架实战教程09:模型的保存和加载》《视频教程》

《Pytorch深度学习框架实战教程10:模型推理和测试》《视频教程》

Pytorch深度学习框架实战教程-番外篇01-卷积神经网络概念定义、工作原理和作用

Pytorch深度学习框架实战教程-番外篇02-Pytorch池化层概念定义、工作原理和作用

Pytorch深度学习框架实战教程-番外篇03-什么是激活函数,激活函数的作用和常用激活函数

PyTorch 深度学习框架实战教程-番外篇04:卷积层详解与实战指南

Pytorch深度学习框架实战教程-番外篇05-Pytorch全连接层概念定义、工作原理和作用

Pytorch深度学习框架实战教程-番外篇06:Pytorch损失函数原理、类型和案例

Pytorch深度学习框架实战教程-番外篇10-PyTorch中的nn.Linear详解

一、什么是池化层?

池化层(Pooling Layer)是卷积神经网络(CNN)中与卷积层配合使用的重要组件,主要用于特征降维、减少计算量并增强模型的平移不变性。它通常紧跟在卷积层之后,对卷积层输出的特征图进行压缩处理。

与卷积层不同,池化层没有可学习的参数,其操作是确定性的(根据预设规则对局部区域进行聚合计算)。

二、池化层的工作原理

池化层的工作流程与卷积层类似,都通过滑动窗口处理特征图,但计算方式不同:

  1. 滑动窗口:池化窗口(如 2×2)在特征图上按指定步长滑动。
  2. 聚合计算:对窗口覆盖的区域执行聚合操作(如取最大值、平均值等),得到一个值作为输出特征图的对应位置像素。
  3. 输出特征图:所有窗口的聚合结果构成尺寸更小的输出特征图。

三、常见池化方式图示

池化层的作用

  1. 特征降维:通过减少特征图的空间尺寸(如 2×2 池化 + 步长 2 可将尺寸减半),降低后续层的计算量和参数数量。
  2. 增强平移不变性:局部微小位移不会改变池化结果(如最大值位置轻微移动不影响输出),提高模型对输入变化的鲁棒性。
  3. 防止过拟合:通过信息聚合减少特征冗余,降低模型对局部细节的过度敏感。
  4. 扩大感受野:池化操作使高层神经元能感知到输入图像更大范围的区域。

四、PyTorch 中的池化层详解

PyTorch 的torch.nn模块提供了多种池化层,适用于不同场景:

池化层作用适用场景
nn.MaxPool2d取窗口内最大值保留显著特征(如边缘、纹理)
nn.AvgPool2d取窗口内平均值保留整体特征,平滑输出
nn.MaxUnpool2d最大池化的逆操作(上采样)特征图恢复
nn.LPPool2d取窗口内 p 次幂的平均值的 p 次方根灵活控制聚合强度
nn.AdaptiveMaxPool2d自适应最大池化(指定输出尺寸)固定输出尺寸,简化网络设计
nn.AdaptiveAvgPool2d自适应平均池化(指定输出尺寸)同上
nn.MaxPool2d核心参数(最常用)

python

运行

nn.MaxPool2d(kernel_size,    # 池化窗口大小(int或tuple)stride=None,    # 步长(默认与kernel_size相同)padding=0,      # 填充大小dilation=1,     # 窗口元素间隔(用于空洞池化)return_indices=False,  # 是否返回最大值的索引(用于Unpool)ceil_mode=False  # 是否使用向上取整计算输出尺寸(默认向下取整)
)

输出尺寸计算公式
H_out = floor((H + 2×padding - dilation×(kernel_size-1) - 1) / stride + 1)
(与卷积层相同,ceil_mode=True时用ceil替代floor

五、示例程序:PyTorch 池化层实战

以下示例展示不同池化层的效果,包括:

  1. 标准池化(MaxPool2d、AvgPool2d)
  2. 自适应池化(AdaptiveMaxPool2d)
  3. 池化对特征图的影响可视化
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from torchvision import transforms# 1. 数据准备:加载图片并生成特征图(模拟卷积层输出)
def prepare_feature_maps():# 加载图片并转为单通道灰度图transform = transforms.Compose([transforms.Resize((128, 128)),transforms.Grayscale(),  # 转为单通道transforms.ToTensor()])# 使用示例图片(实际运行时替换为你的图片路径)image = Image.open("example.jpg")image_tensor = transform(image).unsqueeze(0)  # 形状:[1, 1, 128, 128]# 模拟卷积层输出:创建4个特征图(实际中来自卷积层)# 这里通过简单变换生成不同特征图以展示效果feature_maps = []for i in range(4):# 对原图进行简单变换生成不同特征图if i == 0:fm = image_tensor * (i+1)elif i == 1:fm = torch.roll(image_tensor, shifts=5, dims=2)  # 水平偏移elif i == 2:fm = torch.roll(image_tensor, shifts=5, dims=3)  # 垂直偏移else:fm = image_tensor * 0.5 + torch.roll(image_tensor, shifts=3, dims=(2,3)) * 0.5feature_maps.append(fm)# 合并为[1, 4, 128, 128](批次=1,通道=4,高=128,宽=128)return torch.cat(feature_maps, dim=1), image# 2. 定义池化层模型
class PoolingDemo(nn.Module):def __init__(self):super(PoolingDemo, self).__init__()# 2×2最大池化,步长2(默认与kernel_size相同)self.max_pool = nn.MaxPool2d(kernel_size=2, stride=2)# 3×3平均池化,步长2,填充1self.avg_pool = nn.AvgPool2d(kernel_size=3, stride=2, padding=1)# 自适应最大池化,固定输出尺寸为(32, 32)self.adaptive_max_pool = nn.AdaptiveMaxPool2d(output_size=(32, 32))def forward(self, x):max_out = self.max_pool(x)avg_out = self.avg_pool(x)adaptive_max_out = self.adaptive_max_pool(x)return max_out, avg_out, adaptive_max_out# 3. 可视化函数
def visualize_pooling效果(original_img, input_fm, max_out, avg_out, adaptive_out):plt.figure(figsize=(16, 14))# 显示原始图片plt.subplot(5, 1, 1)plt.title("Original Image")plt.imshow(original_img, cmap='gray')plt.axis('off')# 显示输入特征图(4个通道)plt.subplot(5, 1, 2)plt.title("Input Feature Maps (4 channels)")input_grid = np.zeros((128, 128*4))for i in range(4):fm = input_fm[0, i].detach().numpy()  # 取第一个样本的第i个通道input_grid[:, i*128:(i+1)*128] = fmplt.imshow(input_grid, cmap='gray')plt.axis('off')plt.text(-20, 64, f"Size: {input_fm.shape[2:]}", va='center', rotation=90)# 显示最大池化结果plt.subplot(5, 1, 3)plt.title("Max Pooling (2×2, stride=2) Output")max_grid = np.zeros((64, 64*4))  # 尺寸减半为64×64for i in range(4):fm = max_out[0, i].detach().numpy()max_grid[:, i*64:(i+1)*64] = fmplt.imshow(max_grid, cmap='gray')plt.axis('off')plt.text(-20, 32, f"Size: {max_out.shape[2:]}", va='center', rotation=90)# 显示平均池化结果plt.subplot(5, 1, 4)plt.title("Average Pooling (3×3, stride=2, padding=1) Output")avg_grid = np.zeros((64, 64*4))  # 尺寸约为64×64for i in range(4):fm = avg_out[0, i].detach().numpy()avg_grid[:, i*64:(i+1)*64] = fmplt.imshow(avg_grid, cmap='gray')plt.axis('off')plt.text(-20, 32, f"Size: {avg_out.shape[2:]}", va='center', rotation=90)# 显示自适应池化结果plt.subplot(5, 1, 5)plt.title("Adaptive Max Pooling (output 32×32) Output")adaptive_grid = np.zeros((32, 32*4))  # 固定尺寸32×32for i in range(4):fm = adaptive_out[0, i].detach().numpy()adaptive_grid[:, i*32:(i+1)*32] = fmplt.imshow(adaptive_grid, cmap='gray')plt.axis('off')plt.text(-20, 16, f"Size: {adaptive_out.shape[2:]}", va='center', rotation=90)plt.tight_layout()plt.show()# 4. 主函数
if __name__ == "__main__":# 准备特征图和原始图片feature_maps, original_img = prepare_feature_maps()print(f"输入特征图形状: {feature_maps.shape}")  # [1, 4, 128, 128]# 初始化模型并执行池化操作model = PoolingDemo()max_pool_out, avg_pool_out, adaptive_pool_out = model(feature_maps)# 打印各池化层输出形状print(f"最大池化输出形状: {max_pool_out.shape}")       # [1, 4, 64, 64]print(f"平均池化输出形状: {avg_pool_out.shape}")       # [1, 4, 64, 64]print(f"自适应池化输出形状: {adaptive_pool_out.shape}") # [1, 4, 32, 32]# 可视化池化效果visualize_pooling效果(original_img=original_img,input_fm=feature_maps,max_out=max_pool_out,avg_out=avg_pool_out,adaptive_out=adaptive_pool_out)

代码说明

  1. 数据准备:通过加载图片并生成 4 个特征图(模拟卷积层输出),特征图通过简单变换(偏移、混合)模拟不同卷积核提取的特征。

  2. 池化层定义

    • MaxPool2d(2, 2):2×2 窗口,步长 2,输出尺寸为输入的 1/2(128→64)。
    • AvgPool2d(3, 2, 1):3×3 窗口,步长 2,填充 1,输出尺寸接近输入的 1/2。
    • AdaptiveMaxPool2d(32, 32):无论输入尺寸如何,输出固定为 32×32,简化网络设计。
  3. 可视化结果

    • 最大池化输出更锐利,保留局部显著特征(如边缘)。
    • 平均池化输出更平滑,保留整体区域信息。
    • 自适应池化严格保证输出尺寸,便于多层网络拼接。

关键结论

  • 池化层通过聚合局部特征实现降维,是 CNN 中控制计算复杂度的关键。
  • 最大池化更适合保留锐利特征,平均池化更适合平滑特征。
  • 自适应池化(Adaptive*Pool)通过指定输出尺寸简化网络设计,在迁移学习和固定尺寸输出场景中广泛使用。
  • 池化层通常紧跟卷积层,形成 "卷积 + 池化" 的经典组合,逐步提取高层特征。

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

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

相关文章

常见通信协议详解:TCP、UDP、HTTP/HTTPS、WebSocket 与 GRPC

常见通信协议详解:TCP、UDP、HTTP/HTTPS、WebSocket 与 RPC 在现代网络通信中,各种协议扮演着至关重要的角色,它们决定了数据如何在网络中传输、控制其可靠性、实时性与适用场景。对于开发者而言,理解这些常见的通信协议&#xff…

部署一个自己的音乐播放器教程

以下以部署 YesPlayMusic 为例,介绍两种常见的部署方法,一种是通过 Node.js 和 Git 在 Windows 系统上部署,另一种是通过 Docker 在 Linux 系统上部署。具体步骤如下:Windows 系统部署(基于 Node.js 和 Git&#xff09…

FFMPEG将H264转HEVC时,码率缩小多少好,以及如何通过SSIM(Structural Similarity Index结构相似性指数)衡量转码损失

最近整理一些视频,我发现太多了,就想把一些本来就需要转码的视频缩小一下。因为转码的时候为了弥补损失,我将码率增大了 10-20%,但是如果将 H264 转 HEVC(当然也可以是其他格式),那么或许不用增…

前端,route路由

路由定义与导航动态路由匹配&#xff1a;参数传递&#xff08;/user/:id&#xff09;嵌套路由配置与 <router-view> 层级渲染编程式导航&#xff1a;router.push、router.replace 和 router.go路由守卫与权限控制全局守卫&#xff1a;beforeEach、beforeResolve、afterEa…

Kubernetes网络原理深度解析

Kubernetes网络原理深度解析 1 Kubernetes网络模型 Kubernetes 网络模型是其实现容器化应用高效通信的基础框架。它致力于解决容器编排环境中复杂的网络连通性、服务发现与负载均衡等问题&#xff0c;追求让容器、Pod 等网络端点像传统主机网络一样简洁、可预测地通信 。其核心…

Python3.10 + Firecrawl 下载 Markdown 文档:构建高效通用文章爬虫

在信息爆炸的时代&#xff0c;从各种网站收集和整理文章内容已成为许多开发者和研究人员的常见需求。无论是为了内容聚合、数据分析还是知识管理&#xff0c;一个高效、稳定的通用文章爬虫都是不可或缺的工具。 本文将详细介绍如何使用 Python 3.10 结合 Firecrawl API 构建一个…

国产3D大型装配设计新突破②:装配约束智能推断 | 中望3D 2026

本文为CAD芯智库整理&#xff0c;未经允许请勿复制、转载&#xff01;→ www.xwzsoft.com/h-nd-605.html中望3D2026亮点速递之【装配篇】已经介绍了设计效率的提升&#xff0c;今天将分享的是中望3D2026【装配约束智能推断】&#xff0c;也预告一下第三篇是讲解【组件复用效率提…

深入浅出设计模式——行为型模式之观察者模式 Observer

文章目录1.观察者模式简介2.观察者模式结构3.观察者模式代码实例3.0.公共头文件3.1.观察者3.1.1.抽象观察者Observer3.1.2.具体观察者Player3.2.目标类3.2.1.抽象目标AllyCenter3.2.2.具体目标AllyCenterController循环包含错误示例“前向声明什么时候不够、必须 #include 对方…

CA证书、SSL加速器、HTTPS、HTTP和域名之间的关系

理解CA证书、SSL加速器、HTTPS、HTTP和域名之间的关系对于构建安全、高效的网站至关重要。它们共同构成了现代安全网络通信的基础。下面是它们各自的概念以及它们之间的关系&#xff1a;域名 概念&#xff1a; 人类可读的网站地址&#xff08;如 www.example.com&#xff09;。…

3D感知多模态(图像、雷达感知)

一.BEVFusion1.简要介绍BEV是一个俯视空间&#xff0c;Fusion做的就是融合&#xff0c;这里指的就是图像和点云的融合。那如何把图像和点云融合在一起&#xff1f;认为融合方法有三种&#xff1a;a.point level fusion:点集的融合&#xff0c;从点云中采样一些点,再根据相机的内…

STM32 HAL库驱动W25QXX Flash

STM32 HAL库驱动W25QXX Flash 1. 概述 W25QXX系列是一种SPI接口的Flash存储器&#xff0c;广泛应用于嵌入式系统中作为数据存储设备。本文档详细介绍了基于STM32 HAL库的W25QXX Flash驱动实现&#xff0c;包括硬件连接、驱动函数实现以及使用示例。 项目源码仓库&#xff1a…

Vivado自定义IP核学习笔记

文章目录【1】创建一个新的IP核【2】实现功能【3】编辑IP核【4】IP封装【5】创建Vivado工程【1】创建一个新的IP核 1.1 打开Vivado->点击【Tasks->Manage IP->New IP Location】->弹出窗口1.2 【Next】->设置IP属性->【Finish】->【OK】 【IP Location】…

【面试】高级开发面试场景题

1、如何保证MySql到ES的数据一致性? 答:ES是一个开元分布式搜索和分析引擎、它提供了全文搜索、结构化搜索分析以及这些组合的能力。 全文搜索能力:ES支持复杂的搜索能力,包括模糊匹配、短语查询、布尔查询等,并且可以快速的返回结果 实时数据分析:实时数据分析,支持对…

《 慢 SQL 分析与 SQL 优化实战指南》

&#x1f50d; 慢 SQL 分析与 SQL 优化实战指南、 &#x1f9e0;前言 在数据库性能调优中&#xff0c;慢 SQL 是性能瓶颈的常见元凶。 一次慢查询可能会拖垮整个业务线程池&#xff0c;甚至引发锁等待、雪崩效应。 对后端开发与 DBA 而言&#xff0c;快速定位并优化慢 SQL&am…

C#中如何运用JWT用户认证

一、JWT概述JSON Web Token&#xff08;JWT&#xff09;是一种轻量级的身份认证机制&#xff0c;广泛应用于分布式系统中的用户认证。它通过紧凑的JSON格式存储用户身份信息&#xff0c;并使用数字签名确保信息的完整性和真实性。与传统的基于Session的认证相比&#xff0c;JWT…

Hibernate 使用详解

在现代的Java开发中&#xff0c;数据持久化是一个至关重要的环节。而在众多持久化框架中&#xff0c;Hibernate以其强大的功能和灵活性&#xff0c;成为了开发者们的首选工具。本文将详细介绍Hibernate的原理、实现过程以及其使用方法&#xff0c;希望能为广大开发者提供一些有…

【图像算法 - 13】基于 YOLO12 与 OpenCV 的实时目标点击跟踪系统(系统介绍 + 源码详细)

基于 YOLO12 与 OpenCV 的实时点击目标跟踪系统 在计算机视觉领域&#xff0c;目标检测与跟踪是两个核心任务。本文将介绍一个结合 YOLO 目标检测模型与 OpenCV 跟踪算法的实时目标跟踪系统&#xff0c;该系统允许用户通过鼠标交互选择特定目标进行持续跟踪&#xff0c;支持多…

【数据库】 MySQL 表的操作详解

在 MySQL 数据库的日常开发与维护中&#xff0c;表的操作是最基础且最常用的部分。本文将从 创建表、查看表结构、修改表 以及 删除表 等方面进行详细讲解&#xff0c;并附上对应的 SQL 语句示例&#xff0c;方便在实际项目中直接应用。一、创建表 1.1 创建表语法 CREATE TABLE…

DiT: Transformer上的扩散模型

论文&#xff08;ICCV 2023&#xff09;&#xff1a;Scalable Diffusion Models with Transformers 代码和工程网页&#xff1a;https://www.wpeebles.com/DiT.html DiTs&#xff08;Diffusion Transformers&#xff09;是首个基于Transformer架构的扩散模型&#xff01;它在…

MySQL 索引:索引为什么使用 B+树?(详解B树、B+树)

文章目录一、二叉查找树(BST)&#xff1a;不平衡二、平衡二叉树(AVL)&#xff1a;旋转耗时三、红黑树&#xff1a;树太高由一个例子总结索引的特点基于哈希表实现的哈希索引高效的查找方式&#xff1a;二分查找基于二分查找思想的二叉查找树升级版的BST树&#xff1a;AVL 树四、…