详细解释卷积神经网络中的卷积与池化计算

2025-7-15|2026-3-9
Pavel Han
Pavel Han
date
Jul 15, 2025
slug
2025-07-15-the-summary-of-calculation-workflow-in-CNN
status
Published
tags
CNN
summary
type
Post
category
AI
AI summary
本文基于对参考资料的学习,以一个简单的卷积神经网络结构为例,对卷积神经网络中的卷积与池化操作的完整计算过程进行了详细的总结和解释。
本文实际上是《深度学习原理与Pytorch实战(第二版)》第五章的部分读书笔记,基于自己的语言整理出来加深记忆和理解。这本书是讲解深度学习理论和Pytorch实践的一本不可多得的好书,非常适合入门学习,强烈推荐。
下图是一个典型的用于对手写图像目标进行检测的卷积神经网络的结构示例:
notion image
从以上卷积神经网络的结构上看总体可以分为四层:
  • 输入层:输入数据是一副由二维矩阵表示的手写图像,矩阵中的每个元素对应图像的一个像素,每个像素包含一个0-255的灰度值,值越大越白,否则越黑。
  • 卷积和池化层:对应以上架构中的两组交错的卷积层和池化层,把输入图像一步步提取出来其中包含的特征并降维保存,只保留图像中所包含的重要特征并最终输出给特征层执行分类任务。
  • 特征层:也称为全连接层,主要就是基于卷积和池化层的输出执行分类任务。把前面池化层的输出的特征拉伸为一维向量,然后整合这些识别出来的全局特征,使用激活函数(如ReLU、Sigmoid等)进行非线性变换,得到一个分类概率或预测值。
  • 输出层:最后的输出层包含10个神经元,针对送入神经网络去识别的每一张手写图像,在这10个神经元中输出0-9各个数字的识别概率,所有神经元的识别概率加起来为1。选取最大概率对应的数字作为输出。
本文的目的,是详细解释清楚在以上架构中,图像通过输入层进入卷积神经网络后,在卷积层和池化层所进行的计算操作是如何展开的

卷积层的计算

与图像卷积操作密切相关的一个概念是卷积核。卷积核可以认为就是一张很小分辨率的图像,在原始图像上所执行的卷积操作,实际上就是使用这个小分辨率的图像(即卷积核)从左到右,从上到下逐个像素进行扫描和匹配,匹配的结果是一张新的图像,即特征图。特征图是一个灰度图像,每个像素的灰度值表示该位置原始图像与卷积核小图的匹配程度。如下图所示:
notion image
以下图为例说明原始图像与卷积核小图之间进行的卷积计算的过程。此处卷积核为一个3x3的小图,其中的每个像素都是一个实数值,代表卷积神经网络的计算权重。
  • 卷积核中每个像素对应的权重值就是后续这个卷积神经网络需要训练的参数
notion image
如上图所示,首先是使用卷积核对原始图像左上角的卷积计算。此处进行的卷积计算,也就是把原始图像左上角与卷积核相同的3x3区域的每个像素,与卷积核图像对应位置的像素相乘,然后再把这个3x3区域的9个乘积结果相加,就得到了特征图左上角的第一个像素的值。
然后卷积核在原始图像上向右移动一个像素,继续执行相同的操作,得到特征图第一行第二个像素的值。
notion image
按照以上计算逻辑,依次向右移动卷积核,每次向右移动一个像素,直到移动到原始图像的最右侧。然后再向下移动一个像素,开始做第二行的卷积。如此循环往复,直到卷积核移动到原始图像的右下角,完成整个图像的扫描,得到一副完整的特征图。
notion image
按照以上的卷积计算逻辑,当原始图像的尺寸为m x n,卷积核的大小为w,那么经过以上卷积计算以后的特征图的大小为(m-w+1)x(n-w+1)。也就是说,特征图会比原始图像稍微小一点。如果希望特征图大小与原始图像保持一致,就需要在进行卷积计算之前,先在原始图四周填补一圈0:
notion image
以上使用一个卷积核,对原始图像所执行的完整卷积操作,可以得到一副与该卷积核相对应的特征图。而实际上,在卷积神经网络的执行中,往往会使用不同的多个卷积核分别对原始图像进行各自独立的卷积操作,从而产生多个特征图。例如,下图表示对125x125分辨率的原始图像进行100个不同卷积核的卷积操作,生成了100个125x125分辨率的特征图:
notion image
这一点,也是卷积神经网络架构中,从输入的原始图像经过第一个卷积层的卷积计算后,二维图像变成一个长方体的原因所在。

池化层的计算

如以下卷积神经网络整体架构的阴影部分所示,每个卷积层后面都有一个池化层,用于对卷积层所提炼出来的特征进行简化,只保留特征图中的粗粒度信息。卷积层C1经过对原始图像使用4个卷积核卷积之后,得到4个28x28的特征图。池化层P1的操作则是对每一个特征图进行池化操作,将其缩小,最后得到4个14x14分辨率的池化后特征图,在保留重要特征的基础上数据量大大减少。
notion image
池化的操作非常简单。以下图为例,此处进行的3x3池化操作,是把原始特征图中的每个3x3区域基于取值最大的原则,将其最大值像素取出作为整个区域的池化输出。这样原始特征图的每个3x3区域就对应池化后特征图中的一个像素。
notion image
需要注意的是,池化运算过程中的移动是无重叠的移动,这一点与卷积不同,所以池化后的输出要比原始特征图小很多。因此,上面9x9的原始特征图,经过3x3的池化操作后,其结果是一个3x3的池化后特征图。同样的,上面架构图中卷积层C1的4个原始28x28分辨率特征图,经过2x2的池化操作后,变成了4个14x14分辨率的池化后特征图。

立体卷积计算

池化层的输出是一个三维的立方体(多张池化后的特征图),那么池化后的数据再送入到下一层的卷积层计算时,其卷积计算的流程就跟原始图像送入第一个卷积层所进行卷积计算不同(原始图像是一个二维矩阵)。池化层的输出,送入到下一个卷积层进行计算时,需要进行的卷积计算是立体卷积计算。
下图是一个立体卷积核的示例。左侧是池化层,右侧是下一个卷积层。对于池化层进行的立体卷积计算而言,需要首先选择一个厚度与池化层输出相同的立体卷积核,然后使用这个立体卷积核对池化层所输出的多张池化后特征图进行立体卷积运算,每次运算结果(进行立体卷积运算的整个长方体相应位置相乘后再相加)对应于卷积层的一个像素,使用立体卷积核对池化层输出进行一次完整的扫描,就对应了卷积层的一张特征图。
notion image
同样的,也可以有多个立体卷积核,使用一个立体卷积核执行一次立体计算得到一张特征图,那么多个立体卷积核的运算结果就对应于卷积层的多张特征图,因此,卷积层的输出也是一个长方体。
因此总体起来,对于一个简单的卷积神经网络而言,其卷积和池化的计算流程就是:二维图像输出-第一层卷积计算(平面卷积计算)-第一层池化运算-第二层卷积计算(立体卷积计算)-第二层池化计算-第二层卷积计算(立体卷积计算)...如此循环往复,直到最后把卷积计算出来的图像特征整理出来传递给特征层进行图像分类任务。
总结起来,对于卷积神经网络CNN而言,其卷积层的参数就是各个卷积层所包含的卷积核中的参数,这就是CNN网络在训练过程中主要训练的参数,而池化层因为只是简单地进行2x2或者3x3的取最大值的操作,所以没有要训练的参数。

参考资料

  • 《深度学习原理与Pytorch实战(第二版)》,第5章手写数字识别器-认识卷积神经网络
盘点深度学习神经网络架构中的常用激活函数镜头成像的Lens Shading问题
Loading...