卷积神经网络 - 卷积层(具体例子)

devtools/2025/3/19 12:31:59/

为了更一步学习卷积神经网络之卷积层,本文我们来通过几个个例子来加深理解。

一、灰度图像和彩色图像的关于特征映射的例子

下面我们通过2个例子来形象说明卷积层中“特征映射”的概念,一个针对灰度图像,一个针对彩色图像。

例子 1:灰度图像的特征映射

假设

  • 输入:一幅 5×5 的灰度图像,像素值如下
  • 卷积核(滤波器):一个简单的边缘检测核

过程

  1. 卷积核在图像上以一定步幅滑动(这里采用步长为1),每次取出 3×3 的局部区域。
  2. 对每个局部区域,将该区域的像素与卷积核中对应的权重逐元素相乘,再求和,得到一个输出值。
  3. 所有输出值排列成一个新的矩阵,这个矩阵就是该卷积核对输入图像生成的“特征映射”。例如,如果在某个区域上存在明显的水平边缘,那么这个局部区域经过卷积后会产生较大的正值或负值,从而在特征映射中形成明显的响应。

直观理解

  • 这个卷积核专门检测左右方向上(水平)的亮度差异,能“捕捉”到边缘信息。
  • 在输出的特征映射中,响应值较大的位置表示原始图像中在这些位置出现了该卷积核关注的特征(例如边缘)。

例子 2:彩色图像的特征映射

假设

  • 输入:一张 32×32 的彩色图像(RGB),其形状为 32×32×3。这里每个像素有红、绿、蓝三个通道的值。
  • 卷积层:采用一个 3×3 的卷积核,但由于输入有三个通道,卷积核的尺寸为 3×3×3。例如,我们设计一个检测边缘的滤波器,其三个通道的权重可能相同,也可能不同(设计者可以根据任务调整)。假设我们用下面的核来检测垂直边缘:

过程

  1. 卷积核同时在三个通道上执行卷积操作。具体来说,对于图像上某个局部区域,将三个通道分别与对应的 3×3 核进行逐元素乘积求和,然后将三个通道的结果相加,再加上偏置(如果有)并通过激活函数,生成该位置上的输出值。
  2. 输出的结果是一个二维的特征图,其每个值表示该局部区域中是否存在垂直边缘这一特征。
  3. 如果卷积层有多个卷积核(例如16个),则会产生16个不同的特征映射,每个映射对应一个卷积核提取的不同特征。

直观理解

  • 跨通道信息整合:卷积核的每个通道参数结合了红、绿、蓝三种颜色信息,帮助网络同时考虑颜色和形状特征。
  • 局部特征检测:与灰度图像的情况类似,每个卷积核只关注图像的一小块区域,并产生该区域的特征响应,这些响应通过不同核的堆叠构成了丰富的特征表示,供后续层进一步抽象和分类。

总结

  • 灰度图像:输入只有一个通道,卷积核在每个局部区域产生一个数值(例如边缘强度),所有这些数值构成一个二维矩阵,即特征映射。
  • 彩色图像:输入有RGB三个通道,卷积核尺寸为3×3×3,它会同时处理三个通道信息,并将它们组合成一个响应值,从而得到二维特征图;多个卷积核可以生成多个特征映射,进一步丰富图像特征的表达。

这种特征映射的思想是卷积层的核心:通过局部、可重复的运算自动提取输入数据中具有判别意义的特征,从而为后续的分类或检测任务提供基础。

二、卷积层输出 𝑃 个特征映射的例子

我们可以通过一个具体的二维卷积示例来说明卷积层输出 PPP 个特征映射时的三维结构表示和过程。下面以一个简单的灰度图像为例,假设我们希望通过卷积层输出 P=2P=2P=2 个特征映射,也就是使用两个不同的卷积核来提取不同的局部特征。

示例设置

输入图像:
我们有一幅 5×5 的灰度图像 I:

这里每个元素表示一个像素的灰度值。

卷积核:
我们设计两个 3×3 的卷积核(不考虑翻转问题,此处直接使用交叉相关运算):

  • 卷积核 K1:

    这个核通常用于检测图像中垂直边缘(例如:当局部区域从左到右有较大变化时,输出值会较大)。

  • 卷积核 K2:

    这个核用于检测水平边缘,即当图像上方和下方的像素值有明显差异时会产生较大的响应。

卷积方式:
采用无填充(valid convolution)和步幅为1。由于输入尺寸为5×5,卷积核尺寸为3×3,输出尺寸为 (5−3+1)×(5−3+1)=3×3。

计算过程

对于 K1​ 得到的特征映射 O1

我们逐个计算 O1(i,j) 的值。

  1. 输出 (1,1)
    取图像的子矩阵(行1–3,列1–3):

    卷积计算:

  2. 输出 (1,2)
    子矩阵(行1–3,列2–4):

    计算:

  3. 输出 (1,3)
    子矩阵(行1–3,列3–5):

    计算:

  4. 输出 (2,1)
    子矩阵(行2–4,列1–3):

    计算:

  5. 输出 (2,2)
    子矩阵(行2–4,列2–4):

    计算:

  6. 输出 (2,3)
    子矩阵(行2–4,列3–5):

    计算:

  7. 输出 (3,1)
    子矩阵(行3–5,列1–3):

    计算:

  8. 输出 (3,2)
    子矩阵(行3–5,列2–4):

    计算:

  9. 输出 (3,3)
    子矩阵(行3–5,列3–5):

    计算:

所以,卷积核 K1 生成的特征映射 O1 为:

对于 K2​ 得到的特征映射 O2

同样计算,使用卷积核 K2​:

类比K1的算法,同理可以得出,卷积核 K2​ 生成的特征映射 O2 为:

3. 输出的三维结构表示

由于我们有两个卷积核,最终卷积层的输出由两个特征映射组成,可以将它们堆叠在一起形成一个三维张量。假设这两个特征映射分别为 O1​ 和 O2,那么输出张量形状为:

3×3×2,

其中前两个维度表示空间尺寸,第三个维度(通道数)即为特征映射的个数 P=2。

4. 总结

  • 目的:通过卷积层,我们希望利用多个卷积核分别提取输入图像中不同类型的局部特征,每个卷积核产生一个特征映射。
  • 例子说明:我们用一个 5×5 灰度图像和两个 3×3 卷积核做了具体计算,得到两个 3×3 的特征映射 O1 和 O2。将它们堆叠后就形成了一个 3×3×2 的输出张量。
  • 直观理解:每个特征映射都是卷积核在整个输入上滑动计算得到的局部响应图,它们共同构成了卷积层的输出,提供了丰富的特征信息供后续网络层进一步处理。

这种示例不仅展示了卷积运算的计算过程,也帮助理解卷积层如何通过多个滤波器输出多个特征映射,从而捕捉图像中多样化的局部模式。

三、卷积层中的切片举例

在卷积神经网络中,“切片”通常指的是从输入张量中按照卷积核大小提取出局部区域(即局部感受野)的操作。换句话说,当卷积核在输入上滑动时,我们实际上是在“切出”一个个小块,每个小块就是一个“切片”,然后用该切片与卷积核做逐元素乘积和求和。

通俗解释

  • 局部感受野:想象你有一张大照片,而你用一个固定大小的“窗口”在照片上扫描。每次你把窗口移动到照片的某个部分,这个窗口内的区域就是一个“切片”。卷积操作就是在每个切片上进行计算(乘积求和),检测该区域内是否存在某种特定模式。

  • 多通道情况:如果图像是彩色的(例如RGB图像),每个切片不仅包含空间区域的信息,还包含多个通道的数据。假设输入图像尺寸为 H×W×C,当你用大小为 k×k 的卷积核时,每个切片实际上是一个 k×k×C 的小块。卷积核也会有相同的深度,然后对每个切片进行计算。

具体例子

假设有一幅灰度图像(单通道),尺寸为5×5,如下:

使用一个3×3的卷积核 K:

切片操作示例

  • 当卷积核滑动到图像左上角时,它覆盖的子矩阵就是:

    在这一步,计算卷积核与这个切片的元素逐一乘积之和,就得到输出特征映射中(1,1)的位置上的值。

  • 当卷积核继续向右移动一格,提取新的切片:

    同样进行乘积求和,得到输出特征映射中(1,2)的位置的值。

最终,卷积核在整个图像上滑动,提取出多个 3×3 的切片,每个切片都参与计算,最终形成一个输出矩阵(特征映射)。

对于彩色图像的情况: 假设输入是一幅彩色图像,尺寸为 32×32×3,使用一个 3×3 卷积核(实际尺寸为 3×3×3),每次提取的切片是一个包含RGB三个通道的3×3块。对这个切片,卷积核在每个通道做逐元素乘积求和,再将三个通道的结果加在一起(通常再加上偏置和经过激活函数),生成该位置的输出值。

总结

“切片”是指卷积过程中,从输入图像中按卷积核大小提取局部区域的操作。每个提取出来的小区域都被称为一个切片,然后与卷积核进行运算得到一个输出值,这些输出值排列起来就形成了整个卷积层的特征映射。这一过程保留了输入的空间结构,同时通过局部运算提取出了有用的特征信息。


http://www.ppmy.cn/devtools/168337.html

相关文章

K8S学习之前站五:清理docker的overlay2 目录

overlay2 是 Docker 默认使用的存储驱动,用于管理容器和镜像的存储。随着容器和镜像的增多,overlay2 目录可能会占用大量磁盘空间。清理 overlay2 目录需要谨慎操作,以避免误删正在使用的容器或镜像。 以下是清理 overlay2 目录的步骤和方法…

pytorch小记(十四):pytorch中 nn.Embedding 详解

pytorch小记(十四):pytorch中 nn.Embedding 详解 PyTorch 中的 nn.Embedding 详解1. 什么是 nn.Embedding?2. nn.Embedding 的基本使用示例 1:基础用法示例 2:处理批次输入 3. nn.Embedding 与 nn.Linear 的…

4.从GitHub拉取远程分支到本地

要从GitHub拉取远程分支到本地,可以按以下步骤操作: 1. 方法一:直接拉取并切换到分支 适用场景 远程分支已存在(例如 feature/new-ui),需拉取到本地并自动跟踪。 拉取所有远程分支信息(确保本…

AI+遥感:农作物病虫害实时预警新突破!

引言:一场静悄悄的田间革命 在河南省周口市的麦田里,一架搭载多光谱相机的无人机正在低空盘旋。远在2000公里外的北京国家农业大数据中心,AI系统突然发出警报:北纬33.76、东经114.63区域出现条锈病早期感染迹象,感染面…

【Redis】Redis的数据删除(过期)策略,数据淘汰策略。

如果问到:假如Redis的key过期之后,会立即删除吗? 其实就是想问数据删除(过期)策略。 如果面试官问到:如果缓存过多,内存是有限的,内存被占满了怎么办? 其实就是问:数据的淘汰策略。…

中电金信25/3/18面前笔试(需求分析岗+数据开发岗)

部分相同题目在第二次数据开发岗中不做解析,本次解析来源于豆包AI,正确与否有待商榷,本文只提供一个速查与知识点的补充。 一、需求分析 第1题,单选题,Hadoop的核心组件包括HDFS和以下哪个? MapReduce Spark Storm…

android开发:组件事件汇总

在 Android 开发中,Java 文件中有许多组件事件可以处理用户交互。以下是一些常见的组件事件及其用途和示例: 1. 点击事件 (Click) 用于处理用户点击控件的操作。 示例代码: Button button findViewById(R.id.button); button.setOnClickL…

【GNN】GAT

消息传递 层数越多,聚合更多的消息