一、池化层概述

在卷积神经网络中,池化层是核心组件之一,主要作用是逐步降低特征图的空间尺寸即宽和高,从而减少计算量、控制过拟合并增强模型的鲁棒性。

核心作用

  1. 降维与减少计算量
    压缩特征图的尺寸,显著减少后续层的参数数量和计算负担。
  2. 引入平移不变性
    对微小位置变化不敏感。如输入图像中目标物体稍微移动后,池化层仍能提取相同特征。
  3. 抑制噪声与保留主要特征
    通过取局部区域的最大值或平均值,保留显著特征并过滤细节噪声。
  4. 扩大感受野
    使后续层能融合更广阔区域的上下文信息。

1. 最大池化

原理:取滑动窗口内的最大值。
例子:对 4×4 特征图进行 2×2 窗口 + 步长2 的最大池化:

可以使用torch.nn.MaxPool2d构造最大池化层:

maxpool_layer = torch.nn.MaxPool2d(kernel_size, # 池化窗口的大小stride=None, # 池化操作的步长,默认等于窗口大小padding=0,   # 零像素的边缘填充数量dilation=1,  # 扩张元素的数量return_indices=False, # 返回池化取值的索引,并通过nn.MaxUnpool2d()进行反池化ceil_mode=False # 在输出尺寸中是否使用向上取整代替向下取整)
输入特征图(4×4):
[[1, 2, 5, 3],[4, 9, 6, 8],[7, 1, 4, 2],[3, 5, 2, 6]]池化操作:
| 1  2 | 5  3 |   → 取 max(1,2,4,9)=9    | 取 max(5,3,6,8)=8
| 4  9 | 6  8 |
-------------------
| 7  1 | 4  2 |   → 取 max(7,1,3,5)=7    | 取 max(4,2,2,6)=6
| 3  5 | 2  6 |输出特征图(2×2):
[[9, 8],[7, 6]]

效果:保留边缘、纹理等显著特征。


2. 平均池化

原理:取滑动窗口内的平均值。
例子:相同输入,进行 2×2 平均池化:

可以使用torch.nn.AvgPool2d构造平均池化层:

avgpool_layer = torch.nn.AvgPool2d(kernel_size, # 池化窗口的大小stride=None, # 池化操作的步长,默认等于窗口大小padding=0,   # 零像素的边缘填充数量ceil_mode=False # 在输出尺寸中是否使用向上取整代替向下取整count_include_pad=True, # 计算均值时是否考虑填充像素divisor_override=None # 若指定将用作平均操作中的除数)
| 1  2 | 5  3 |   → 平均 = (1+2+4+9)/4 = 4   | (5+3+6+8)/4 = 5.5
| 4  9 | 6  8 |
-------------------
| 7  1 | 4  2 |   → 平均 = (7+1+3+5)/4 = 4   | (4+2+2+6)/4 = 3.5输出特征图(2×2):
[[4.0, 5.5],[4.0, 3.5]]

适用场景:全局信息平滑如图像分类的背景区域。

应用:

  • 目标检测:最大池化保留物体的关键特征如猫的耳朵,即使位置轻微变化仍能被识别。
  • 减少过拟合:通过降低特征图尺寸,强制网络学习更泛化的模式。
  • 加速训练:减少全连接层的参数如将 200×200 特征图池化为 100×100,后续计算量减少75%。

改进:

  • 趋势:部分网络(如ResNet)用步长>1的卷积层替代池化层,在降维的同时学习特征。
  • 全局平均池化(Global Average Pooling):将整个特征图池化为一个值(替代全连接层),极大减少参数(如用于Inception、SqueezeNet)。

二、卷积层参数如何计算

2.1 参数数量计算

#例子
class CNN(nn.Module):def __init__(self, activation="relu"):super(CNN, self).__init__()self.activation = F.relu if activation == "relu" else F.selu#输入通道数,图片是灰度图,所以是1,图片是彩色图,就是3,输出通道数,就是卷积核的个数(32,1,28,28)self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1)#输入x(32,32,28,28) 输出x(32,32,28,28)self.conv2 = nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, padding=1)self.pool = nn.MaxPool2d(2, 2) #池化核大小为2(2*2),步长为2self.conv3 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1)self.conv4 = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, padding=1)self.conv5 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1)self.conv6 = nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, padding=1)self.pool2 = nn.MaxPool2d(2, 2)   #输入(128,7,7) 输出(128,3,3)self.flatten = nn.Flatten()# input shape is (28, 28, 1) so the fc1 layer in_features is 128 * 3 * 3self.fc1 = nn.Linear(128 * 3 * 3, 128)self.fc2 = nn.Linear(128, 10) #输出尺寸(32,10)self.init_weights()
1. **卷积层 **

参数数量 = (in_channels × out_channels × kernel_height × kernel_width) + out_channels

  • 权重参数in_channels × out_channels × kernel_size²
  • 偏置参数out_channels(每个输出通道一个偏置)
2. **全连接层 **

参数数量 = (in_features × out_features) + out_features

  • 权重参数in_features × out_features
  • 偏置参数out_features
3. 池化层/ Flatten 层

参数数量 = 0(无训练参数)

以下是CNN模型中每一层的参数数量计算和输出尺寸变化的详细说明(输入为 (batch_size, 1, 28, 28)):

  1. Conv1 层
  • 输入尺寸(batch_size, 1, 28, 28)
  • 输出尺寸(batch_size, 32, 28, 28)
    • Padding=1 保持空间尺寸不变((28 + 2 - 3)/1 + 1 = 28)。
  • 参数数量
    • 权重:1 × 32 × 3 × 3 = 288
    • 偏置:32
    • 总计:288 + 32 = 320
  1. Conv2 层
  • 输入尺寸(batch_size, 32, 28, 28)
  • 输出尺寸(batch_size, 32, 28, 28)
    • Padding=1 保持尺寸不变。
  • 参数数量
    • 权重:32 × 32 × 3 × 3 = 9,216
    • 偏置:32
    • 总计:9,216 + 32 = 9,248

  1. Pool 层(MaxPool2d, kernel=2, stride=2)
  • 输入尺寸(batch_size, 32, 28, 28)
  • 输出尺寸(batch_size, 32, 14, 14)
    • 下采样公式:(28 - 2)/2 + 1 = 14
  • 参数数量0(池化层无参数)

  1. Conv3 层
  • 输入尺寸(batch_size, 32, 14, 14)
  • 输出尺寸(batch_size, 64, 14, 14)
    • Padding=1 保持尺寸不变。
  • 参数数量
    • 权重:32 × 64 × 3 × 3 = 18,432
    • 偏置:64
    • 总计:18,432 + 64 = 18,496

  1. Conv4 层
  • 输入尺寸(batch_size, 64, 14, 14)
  • 输出尺寸(batch_size, 64, 14, 14)
  • 参数数量
    • 权重:64 × 64 × 3 × 3 = 36,864
    • 偏置:64
    • 总计:36,864 + 64 = 36,928

  1. Pool 层(再次使用,kernel=2, stride=2)
  • 输入尺寸(batch_size, 64, 14, 14)
  • 输出尺寸(batch_size, 64, 7, 7)
    • 下采样:(14 - 2)/2 + 1 = 7
  • 参数数量0

  1. Conv5 层
  • 输入尺寸(batch_size, 64, 7, 7)
  • 输出尺寸(batch_size, 128, 7, 7)
    • Padding=1 保持尺寸不变。
  • 参数数量
    • 权重:64 × 128 × 3 × 3 = 73,728
    • 偏置:128
    • 总计:73,728 + 128 = 73,856

  1. Conv6 层
  • 输入尺寸(batch_size, 128, 7, 7)
  • 输出尺寸(batch_size, 128, 7, 7)
  • 参数数量
    • 权重:128 × 128 × 3 × 3 = 147,456
    • 偏置:128
    • 总计:147,456 + 128 = 147,584

  1. Pool2 层(MaxPool2d, kernel=2, stride=2)
  • 输入尺寸(batch_size, 128, 7, 7)
  • 输出尺寸(batch_size, 128, 3, 3)
    • 下采样:(7 - 2)/2 + 1 = 3(向下取整)。
  • 参数数量0

  1. Flatten 层
  • 输入尺寸(batch_size, 128, 3, 3)
  • 输出尺寸(batch_size, 128 × 3 × 3) = (batch_size, 1,152)
  • 参数数量0

  1. FC1 层(全连接层)
  • 输入尺寸(batch_size, 1,152)
  • 输出尺寸(batch_size, 128)
  • 参数数量
    • 权重:1,152 × 128 = 147,456
    • 偏置:128
    • 总计:147,456 + 128 = 147,584

  1. FC2 层(全连接层)
  • 输入尺寸(batch_size, 128)
  • 输出尺寸(batch_size, 10)
  • 参数数量
    • 权重:128 × 10 = 1,280
    • 偏置:10
    • 总计:1,280 + 10 = 1,290

完整计算流程(输入 (1, 28, 28))

输出尺寸参数计算参数数量
Conv1(32, 28, 28)(1×32×3×3) + 32320
Conv2(32, 28, 28)(32×32×3×3) + 329,248
Pool1(32, 14, 14)无参数0
Conv3(64, 14, 14)(32×64×3×3) + 6418,496
Conv4(64, 14, 14)(64×64×3×3) + 6436,928
Pool2(64, 7, 7)无参数0
Conv5(128, 7, 7)(64×128×3×3) + 12873,856
Conv6(128, 7, 7)(128×128×3×3) + 128147,584
Pool3(128, 3, 3)无参数0
Flatten(1152,)无参数0
FC1(128,)(1152×128) + 128147,584
FC2(10,)(128×10) + 101,290
总计--435,306

2.2 每层输出尺寸变换原理

卷积输出尺寸公式:

假设输入尺寸为 Hin×Win

卷积核尺寸 K,步长 S,填充 P,输出尺寸 Hout×Wout 为:
Hout=⌊Hin+2P−KS⌋+1 Hout= \left\lfloor \frac{H_{in} + 2P - K}{S} \right\rfloor + 1 Hout=SHin+2PK+1

Wout=⌊Win+2P−KS⌋+1 Wout=\left\lfloor \frac{W_{in} + 2P - K}{S} \right\rfloor + 1 Wout=SWin+2PK+1

默认设置(最常见):

  • kernel_size = 3
  • stride = 1
  • padding = 1
    则:

Hout=Hin,Wout=WinH

尺寸不变

当卷积核尺寸 K=2,步长 S=2.填充 P=1时

这个操作会让图像尺寸缩小一半:

简化为:
Hout=⌊HinS⌋ Hout= \left\lfloor \frac{H_{in} }{S} \right\rfloor Hout=SHin
例如:

  • 输入 28×2814×14
  • 输入 14×147×7
  • 输入 7×73×3

Flatten 展平层

将形如 (batch_size, C, H, W) 的张量展平成 (batch_size, C × H × W),准备送入全连接层。

总结

输入尺寸操作输出尺寸说明
conv11×28×28Conv2d(3, p=1)32×28×28尺寸不变,通道变为 32
conv232×28×28Conv2d(3, p=1)32×28×28尺寸不变
pool132×28×28MaxPool2d(2,2)32×14×14高宽缩小一半
conv332×14×14Conv2d(3, p=1)64×14×14通道增加
conv464×14×14Conv2d(3, p=1)64×14×14通道不变
pool264×14×14MaxPool2d(2,2)64×7×7再次缩小
conv564×7×7Conv2d(3, p=1)128×7×7通道增加
conv6128×7×7Conv2d(3, p=1)128×7×7通道不变
pool3128×7×7MaxPool2d(2,2)128×3×3尺寸变为最终
flatten128×3×3Flatten1152送入全连接层
fc11152Linear(1152→128)128隐藏层
fc2128Linear(128→10)10输出分类结果

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

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

相关文章

写一个音乐爬虫

今天我们写一个网易云音乐的爬虫,爬取网易云音乐热歌榜音乐链接并下载,这里用到了之前引用的BeautifulSoup和requests。 BeautifulSoup是一个Python库,用于从HTML和XML文件中提取数据。它提供了一种简单的方式来遍历文档树和搜索文档树中的元…

战斗公式和伤害走配置文件

故事背景,上次属性计算用的配置,这次伤害计算也走配置,下面是测试代码和测试数据local formulas {[100001]{id 100001,name "基础伤害",formula "function (self,tag,ishit,iscritial,counterratio)\n if ishit1 then\n …

线性代数 上

文章目录线性代数知识整理一、求行列式1、 套公式2、利用性质,化为可套公式3、抽象行列式4、抽象向量二、代数余子式的线性组合三、求AnA^nAn四、证明A可逆五、求A的逆1、定义法2、初等变换3、公式六、求秩七、线性表示的判定八、线性无关九、求极大线性无关组十、等…

红帽AI推理服务器三大特点

生成式人工智能(Gen AI)的迅猛发展,对大型语言模型(LLM)的部署提出了更高的性能、灵活性和效率要求。无论部署在何种环境中,红帽AI推理服务器都为用户提供经过强化并获得官方支持的vLLM发行版,配…

开始记录一步步学习pcl

安装参考,大神写的非常详细,一步到位 https://blog.csdn.net/qq_36812406/article/details/144307648?ops_request_misc%257B%2522request%255Fid%2522%253A%25220e215e6ac266b90ded12ed6b2eab1257%2522%252C%2522scm%2522%253A%252220140713.13010233…

Linux系统Centos7 安装mysql5.7教程 和mysql的简单指令

目录 一. 安装 MySQL 官方 Yum 仓库 二. 安装 MySQL 5.7 1.查看可用的mysql版本仓库 2.启用MySql5.7仓库 3.禁用更高版本的仓库(可选) 4.导入 MySQL GPG 公钥 5.安装MySql5.7 三. 启动 MySQL 服务 1.启动 MySQL 服务 2. 设置开机自启 3.查看服…

嵌入式——C语言:指针③

一、函数指针和指针函数(一)指针函数:是函数,函数的返回值是指针1.不能返回局部变量的值2.指针函数返回的地址可以作为下一个函数调用的参数(二)函数指针:是指针,指针指向一个函数in…

OpenCV(05)直方图均衡化,模板匹配,霍夫变换,图像亮度变换,形态学变换

【OpenCV(01)】基本图像操作、绘制,读取视频 【OpenCV(02)】图像颜色处理,灰度化,二值化,仿射变换 【OpenCV(03)】插值方法,边缘填充&#xff0…

常见的未授权访问漏洞靶场-练习教程

一.Redis未授权访问漏洞1.首先需要准备一个vps和vulhub靶场,然后进入目录。命令:进入靶场目录:cd /etc/vulhub-master/redis/4-unacc 启动靶场:docker-compose up -d2.然后启动我们kali,下载redis服务然后连接redis,并执行命令。…

EAP(基于事件的异步编程模式)

📜 1. 核心思想 📌 事件驱动解耦 异步操作通过事件通知结果,调用者无需阻塞线程,通过事件处理器响应操作完成、错误或取消。 📌 线程池与UI线程协同 耗时操作在后台线程池执行,完成后通过 SynchronizationC…

【三桥君】如何解决后端Agent和前端UI之间的交互问题?——解析AG-UI协议的神奇作用

​你好,我是 ✨三桥君✨ 📌本文介绍📌 >> 一、引言 在智能体(Agent)领域,MCP、A2A、ANP等协议已经规范了Agent与工具、Agent与Agent之间的通信,但Agent与用户之间的交互一直缺乏标准化。…

面试官:详细说说Kafka rebalance 的策略以及具体过程

hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶 程序员各种工具大全 Kafka 的 Rebalance(再平衡) 是消费者组(Consumer Group)在消费者数量…

C++入门自学Day2-- c++类与对象(初识)

一、面向对象和面向过程1、什么是面向过程(Process-Oriented Programming, POP)📌 定义面向过程强调的是 过程(过程函数),即:按照步骤(流程)组织代码。程序结构 数据结构…

DAO组织智能合约开发:从理论到实践

目录 DAO组织智能合约开发:从理论到实践 1. DAO概述:去中心化自治组织 2. DAO核心组件设计 2.1 架构设计 2.2 关键智能合约 3. 治理代币实现 3.1 ERC20扩展合约 4. 提案管理系统实现 4.1 提案状态机 4.2 提案合约实现 5. DAO核心合约实现 5.1 DAO合约架构 5.2 提案类型扩展 6…

Ubuntu系统完整配置教程

Ubuntu系统完整配置教程 目录 配置镜像源安装网络服务虚拟机中安装CUDAPython开发环境配置Java开发环境配置 1. 配置镜像源 1.1 备份原始源文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup1.2 编辑源文件 sudo nano /etc/apt/sources.list1.3 各大镜像源…

【mysql慢查询】

mysql慢查询慢查询慢查询日志配置慢查询 慢查询是指执行时间超过指定阈值的SQL语句。在MySQL中,默认情况下执行时间超过10秒的查询会被认为是慢查询,但这个阈值可以根据需要进行调整。 慢查询日志配置 -- 查看当前慢查询配置 SHOW VARIABLES LIKE slo…

django 按照外键排序

在Django中,使用外键(ForeignKey)进行排序是一种常见的需求,特别是在处理数据库关系时,如用户和订单之间的关系(一个用户有多个订单)。下面是如何在使用Django ORM时进行基于外键的排序。 定义模…

JAVA_EIGHTEEN_特殊文件

目录 Properties属性文件 XML的作用和应用场景 日志技术 Properties属性文件 约束:只能是键值对 键不能重复 文件后缀一般是.properties结尾的 是一个Map集合(键值对集合) 核心作用:Properties是用来代表属性文件的&#…

第二十二节 MATLAB转置向量、MATLAB追加向量

MATLAB中转置操作能够将一个行向量改变成一个列向量,反之亦然。MATLAB中转置操作使用一个单引号()来表示。详细例子在MATLAB中建立一个脚本文件,输入下述代码:r [ 1 2 3 4 ]; tr r; v [1;2;3;4]; tv v; disp(tr); …

window显示驱动开发—Direct3D 11 视频设备驱动程序接口 (DDI)

这些设备驱动程序接口 (DDI) 是新的或针对Windows 8更新的:CalcPrivateCryptoSessionSizeCalcPrivateAuthenticatedChannelSizeCalcPrivateVideoDecoderOutputViewSizeCalcPrivateVideoDecoderSizeCalcPrivateVideoProcessorEnumSizeCalcPrivateVideoProcessorInput…