新闻详情

新闻详情

首页 / 资讯中心 / 详情

《动手学深度学习》汇聚层(Pooling)深度解析:最大/平均汇聚、填充步幅与多通道实践

发布时间:2026/9/30 1:49:52来源:尧图网络
《动手学深度学习》汇聚层(Pooling)深度解析:最大/平均汇聚、填充步幅与多通道实践
人工智能深度学习机器学习教程【免费下载链接】d2l-zh《动手学深度学习》面向中文读者、能运行、可讨论。中英文版被70多个国家的500多所大学用于教学。项目地址https://gitcode.com/GitHub_Trending/d2/d2l-zh点击查看免费下载本篇技术指南以《动手学深度学习》d2l-zh仓库中 汇聚层章节 为核心骨架系统讲解汇聚层Pooling的两大核心作用——降低卷积层对位置信息的敏感度、对特征图进行空间降采样并完整覆盖最大汇聚、平均汇聚的手写实现、内置层 API 用法填充与步幅以及多通道处理机制。读完本文你将能从数学原理、源码实现到框架调用三个层面彻底理解汇聚层并能在 MXNet、PyTorch、TensorFlow 中自如配置汇聚窗口、填充与步幅。为什么需要汇聚层降低分辨率与平移不变性在图像处理任务中我们往往希望随着网络层数加深逐步降低隐藏表示的空间分辨率将局部信息逐步聚集为全局信息。这样网络中越靠后的神经元其感受野receptive field即输入上它能感知到的区域就越大。这种渐进降采样的动机来自任务本身诸如“图像中是否包含一只猫”这样的问题本质上是一个关于整张图像的全局问题因此网络最后一层的神经元应当对整个输入保持敏感。通过逐层聚合信息、生成越来越粗糙的特征图我们既能最终学到全局表示又能在中间层保留卷积层的一切优势。此外当检测边缘这类低层特征时参见仓库中 卷积层章节 的互相关运算讲解我们还希望表示对平移保持一定的鲁棒性。举例来说如果拍摄一张黑白分界的图像X并把整幅图像向右平移一个像素即Z[i, j] X[i, j 1]那么新图像Z的卷积输出可能与原来大相径庭——边缘会跟着移动一个像素。而现实中物体几乎不会恰好出现在同一像素位置即便使用三脚架拍摄静止物体快门运动引起的相机振动也可能让画面整体偏移一两个像素。汇聚层正是为解决这两个问题而设计的它同时承担两种职责缓解卷积层对位置的过度敏感局部平移不变性对表示进行空间降采样降低特征图分辨率。最大汇聚与平均汇聚与卷积层类似汇聚运算也由一个固定形状的窗口即汇聚窗口pooling window组成窗口按照步幅在输入的所有区域上滑动为窗口扫过的每个位置计算一个输出。但与卷积层中“输入与卷积核做互相关计算”不同汇聚层不包含任何参数没有卷积核。汇聚运算是确定性的通常取汇聚窗口内所有元素的最大值或平均值分别称为最大汇聚maximum pooling简称 max pooling与平均汇聚average pooling。与互相关运算相同汇聚窗口从输入张量的左上角开始从左到右、从上到下地滑动。在窗口到达的每个位置根据使用最大汇聚还是平均汇聚计算窗口内输入子张量的最大值或平均值。上图对应的输入是一个 3×3 张量经过 2×2 最大汇聚后输出形状为 2×2四个输出元素分别来自每个窗口的最大值$$\max(0, 1, 3, 4)4,\quad \max(1, 2, 4, 5)5,\quad \max(3, 4, 6, 7)7,\quad \max(4, 5, 7, 8)8.$$一般地汇聚窗口形状为 $p \times q$ 的汇聚层称为 $p \times q$ 汇聚层对应运算称为 $p \times q$ 汇聚。对平移的容忍回到边缘检测示例回到本节开头的边缘检测场景把卷积层的输出作为 $2 \times 2$ 最大汇聚的输入设卷积层输入为X、汇聚层输出为Y。无论X[i, j]与X[i, j 1]是否相同或X[i, j 1]与X[i, j 2]是否相同汇聚层始终输出Y[i, j] 1。也就是说使用 $2 \times 2$ 最大汇聚层后即使卷积层识别出的模式在高度或宽度方向上移动不超过一个元素我们依然能够将其检测出来——这正是局部平移不变性的直观体现。从零实现汇聚层的前向传播下面用pool2d函数实现汇聚层的前向传播。该函数与仓库 卷积层章节 中的corr2d函数结构类似corr2d的源码实现可参见 d2l/torch.py 与 d2l/mxnet.py 中的定义但没有卷积核输出直接取输入每个区域的最大值或平均值#tab mxnet, pytorch from d2l import torch as d2l import torch from torch import nn def pool2d(X, pool_size, modemax): p_h, p_w pool_size Y d2l.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#tab tensorflow import tensorflow as tf def pool2d(X, pool_size, modemax): p_h, p_w pool_size Y tf.Variable(tf.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].assign(tf.reduce_max(X[i: i p_h, j: j p_w])) elif mode avg: Y[i, j].assign(tf.reduce_mean(X[i: i p_h, j: j p_w])) return Y注意输出形状公式输入高度 $n_h$、宽度 $n_w$汇聚窗口 $p_h \times p_w$ 时输出为 $(n_h - p_h 1) \times (n_w - p_w 1)$与卷积层不加填充时的输出形状公式一致参考 conv-layer_origin.md 中对输出尺寸的推导。用前文图示中的 3×3 输入张量验证最大汇聚的输出#tab all X d2l.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]]) pool2d(X, (2, 2))输出正是 $[[4., 5.], [7., 8.]]$。再验证平均汇聚#tab all pool2d(X, (2, 2), avg)每个 $2\times 2$ 窗口取平均值后得到 $[[2., 3.], [5., 6.]]$与手推结果一致。这段完整代码与验证过程可在仓库的 pooling.md中文版中对照查阅。填充和步幅用内置层控制输出形状与卷积层一样汇聚层也可以通过**填充padding与步幅stride**改变输出形状得到期望的分辨率。下面用深度学习框架内置的二维最大汇聚层演示。首先构造一个四维输入张量X样本数与通道数均为 1。注意框架之间的维度约定差异MXNet/PyTorch 采用“通道在前”布局(批量, 通道, 高, 宽)而 TensorFlow 采用“通道最后”channels-last布局输入的最后维度是通道中文版 pooling.md 中有专门说明#tab mxnet, pytorch X d2l.reshape(d2l.arange(16, dtyped2l.float32), (1, 1, 4, 4)) X#tab tensorflow X d2l.reshape(d2l.arange(16, dtyped2l.float32), (1, 4, 4, 1)) X默认情况下框架内置汇聚层的步幅与汇聚窗口形状相同。因此使用(3, 3)的汇聚窗口时默认步幅也为(3, 3)输出形状为 $2 \times 2$$(4-3)/312$。由于汇聚层没有模型参数实例化后无需调用参数初始化函数#tab mxnet pool2d nn.MaxPool2D(3) pool2d(X)#tab pytorch pool2d nn.MaxPool2d(3) pool2d(X)#tab tensorflow pool2d tf.keras.layers.MaxPool2D(pool_size[3, 3]) pool2d(X)填充和步幅也可以手动指定。例如窗口(3, 3)、填充 1、步幅 2 时输出形状为 $(42-3)/212$#tab mxnet pool2d nn.MaxPool2D(3, padding1, strides2) pool2d(X)#tab pytorch pool2d nn.MaxPool2d(3, padding1, stride2) pool2d(X)#tab tensorflow pool2d tf.keras.layers.MaxPool2D(pool_size[3, 3], paddingsame, strides2) pool2d(X)此外还可以指定任意大小的矩形汇聚窗口并分别设置高度与宽度方向上的填充和步幅。例如窗口(2, 3)、填充(1, 2)、步幅(2, 3)TensorFlow 中需先通过tf.pad手动填充再使用paddingvalid#tab mxnet pool2d nn.MaxPool2D((2, 3), padding(1, 2), strides(2, 3)) pool2d(X)#tab pytorch pool2d nn.MaxPool2d((2, 3), padding(1, 1), stride(2, 3)) pool2d(X)#tab tensorflow pool2d tf.keras.layers.MaxPool2D(pool_size[2, 3], paddingsame, strides(2, 3)) pool2d(X)这里的核心经验是填充、窗口和步幅三者共同决定输出尺寸公式为 $\lfloor (n 2p - k)/s \rfloor 1$。实际工程中使用最大汇聚配合大于 1 的步幅即可便捷地缩小特征图空间维度。多通道逐通道独立汇聚处理多通道输入时汇聚层在每个输入通道上单独运算而不是像卷积层那样把各通道求和汇总。这意味着汇聚层的输出通道数与输入通道数相同。下面在通道维度上拼接张量X和X 1构造一个 2 通道输入TensorFlow 中需沿最后一个维度拼接#tab mxnet, pytorch X d2l.concat((X, X 1), 1) X#tab tensorflow X tf.reshape(tf.stack([X, X1], 0), (1, 2, 4, 4))再次应用(3, 3)窗口、填充 1、步幅 2 的最大汇聚后输出通道数仍然是 2#tab mxnet pool2d nn.MaxPool2D(3, padding1, strides2) pool2d(X)#tab pytorch pool2d nn.MaxPool2d(3, padding1, stride2) pool2d(X)#tab tensorflow pool2d tf.keras.layers.MaxPool2D(3, paddingsame, strides2) pool2d(X)中文版 pooling.md 中同时提供了 PaddlePaddle 实现TensorFlow 的输出因通道维度位置不同乍看有差异但数值上与 MXNet/PyTorch 完全一致只是维度排列不同。汇聚层在经典 CNN 架构中的实际应用源码佐证汇聚层绝非孤立概念它贯穿于本书后续的现代卷积网络架构中仓库源码提供了大量佐证LeNet在 lenet.md 中LeNet 的每个卷积块由“卷积层 sigmoid 激活 平均汇聚层”组成使用nn.AvgPool2d(kernel_size2, stride2)将每个 $2\times2$ 区域的空间维数缩小 4 倍同时通道数逐层增加6 → 16AlexNet在 alexnet.md 中改用nn.MaxPool2D(pool_size3, strides2)进行带重叠的最大汇聚配合更大步幅显著降低特征图分辨率基础互相关实现d2l/torch.py 与 d2l/mxnet.py 中的corr2d函数是pool2d的直接参照——二者共享“固定窗口滑动”的运算骨架区别仅在于汇聚层没有可学习的核。从这些源码可以看到汇聚层的设计哲学始终一致不引入任何可学习参数只做确定性的降采样从而在降低计算量的同时把位置敏感性转交给后续更深层的卷积去处理。小结最大汇聚输出汇聚窗口内输入元素的最大值平均汇聚输出窗口内元素平均值汇聚层的主要优点之一是缓解卷积层对位置的过度敏感带来局部平移不变性可以像卷积层一样为汇聚层指定填充和步幅控制输出形状使用最大汇聚配合大于 1 的步幅可有效减少空间维度高度和宽度汇聚层在每个输入通道上独立运算输出通道数等于输入通道数。思考与练习结合本节原理与仓库代码可以进一步思考以下问题能否把平均汇聚实现为卷积层的特殊情况如果可以请实现能否把最大汇聚实现为卷积层的特殊情况如果可以请实现假设输入大小为 $c \times h \times w$汇聚窗口形状为 $p_h \times p_w$、填充为 $(p_h, p_w)$、步幅为 $(s_h, s_w)$该汇聚层的计算成本是多少为什么最大汇聚和平均汇聚的工作方式不同语义上分别强调什么是否需要单独的“最小汇聚层”能否用已有运算替代它除平均汇聚和最大汇聚外是否还有其他可考虑的汇聚函数提示回想 softmax它为什么不如前两者流行这些问题与汇聚层的实践细节同样收录于仓库的 pooling.md可作为检验理解程度的自测题。赞分享人工智能深度学习机器学习教程【免费下载链接】d2l-zh《动手学深度学习》面向中文读者、能运行、可讨论。中英文版被70多个国家的500多所大学用于教学。项目地址https://gitcode.com/GitHub_Trending/d2/d2l-zh点击查看免费下载相关推荐《动手学深度学习》多GPU训练从零实现数据并行、梯度聚合与全同步详解《动手学深度学习》多GPU训练从零实现数据并行、梯度聚合与全同步详解 本指南围绕《动手学深度学习》开源仓库中 多GPU训练原始文档 https://link.人工智能深度学习机器学习教程理解卷积神经网络中的汇聚层Pooling Layer理解卷积神经网络中的汇聚层Pooling Layer 在深度学习领域特别是计算机视觉任务中汇聚层Pooling Layer是卷积神经网络CNN架人工智能深度学习机器学习教程CANN/ops-math无状态Dropout掩码生成算子stateless_drop_out_gen_mask 产品支持情况 | 产品 | 是否支持 | | : | : : | | term Ascend 950P算子库人工智能CANN上一篇D2图表导出完全指南掌握SVG、PNG、PDF多格式输出最佳实践下一篇Gramps社区生态如何参与开源家谱软件项目开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

神经网络MOSFET模型泛化能力:物理约束与SPICE部署实战 2026/9/30 18:36:07

神经网络MOSFET模型泛化能力:物理约束与SPICE部署实战

简介:这份PDF文献面向电路设计、器件建模方向的研究生与工程师,聚焦神经网络在MOSFET建模中的泛化能力问题。资源为单篇学术论文,压缩包内仅含1个PDF文件,约1.02MB,轻量便于随时查阅。论文提出一种分段建模思路&#x…

阅读更多 →
Codex CLI接入Jev模型与CC Switch多Provider配置实战指南 2026/9/30 18:36:00

Codex CLI接入Jev模型与CC Switch多Provider配置实战指南

Codex CLI我用得不算早,但用得挺狠,几乎每天都挂在终端里干活。最初那段时间确实爽,毕竟官方出品的编码智能体,在终端里画架构图、改bug、跑测试,比在IDE里来回切窗口舒服多了。可问题也随着深入使用一点点冒出来&…

阅读更多 →
用AI Agent搭建投资研究自动化系统:Python工程化与本地部署实战 2026/9/30 18:35:37

用AI Agent搭建投资研究自动化系统:Python工程化与本地部署实战

1. 为什么我要把投资研究交给 AI Agent 先说结论:我不是让 AI 替我拍板买卖,而是让它替我干那些"重复、耗时、但必须做"的脏活累活。这个区别很关键,想清楚这一点,后面所有的架构设计才有意义。 我做投资研究有些年头了…

阅读更多 →
OpenMAIC多智能体课堂:不写代码,教师也能搭出AI互动课 2026/9/30 18:35:37

OpenMAIC多智能体课堂:不写代码,教师也能搭出AI互动课

1. 从“不会写代码”到“搭出一堂AI互动课”,中间到底缺了什么第一次看到“多智能体课堂”这个词,很多人脑子里冒出来的画面大概是:一堆AI小人在屏幕里你一言我一语,学生坐在下面看热闹。但真正上手过教学场景的人会告诉你&#x…

阅读更多 →
从malloc到RSS:Linux内存分配器三层原理与排查 2026/9/30 18:35:37

从malloc到RSS:Linux内存分配器三层原理与排查

"这东西已经跑了两百多天,RSS 从 300MB 涨到 1.8GB,你们查一下是不是内存泄漏。"凌晨两点收到这条消息的时候,我第一反应是打开top,第二反应是打开heaptrack,第三反应才是想起来——这台机器上根本没有泄漏&…

阅读更多 →
Redis接入AI:向量检索、语义缓存与Agent状态管理实战 2026/9/30 18:35:37

Redis接入AI:向量检索、语义缓存与Agent状态管理实战

做AI应用开发,最容易被忽略的其实是数据层。模型选型、提示词工程、算力分配,这些话题大家聊得热火朝天,可一旦真跑起来,你会发现几乎所有问题都卡在“数据从哪来回哪去”这一步。Redis这个老牌内存数据库,恰恰是在这个…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉