1. 图像基础知识

简单理解: 图像是由像素点组成的, 每个像素点的取值范围为: [0, 255], 像素值越接近于0, 颜色越暗, 接近于黑色: 像素值越接近于255, 颜色越亮, 接近于白色.

2. 卷积神经网络介绍

卷积神经网络专门用于处理图像, 视频, 语音等数据的神经网络. 是含有卷积层的神经网络, 卷积层的作用就是用来自动学习, 提取图像的特征.

CNN网络主要由三部分构成: 卷积层, 池化层全连接层构成:

  1. 卷积层负责提取图像中的局部特征.
  2. 池化层用来大幅降低参数量级(降维).
  3. 全连接层类似人工神经网络的部分, 用来输出想要的结果.

3. 卷积层

卷积层的主要作用如下:

  1. 特征提取: 卷积层的主作用是从输入图像中提取低级特征, 通过多个卷积层的堆叠, 网络能够逐渐从低级特征到高级特征进行学习.
  2. 权重共享: 在卷积层中, 同一个卷积核在整个输入图像上共享权重, 这使得卷积层的参数数量大大减少, 减少了计算量并提高了训练效率.
  3. 局部连接: 卷积层的每个神经元仅与输入图像的一个小局部区域相连, 这成为局部感受野, 这种局部连接方式更符合图像的空间结构, 有助于捕捉图像中的局部特征.
  4. 空间不变性: 由于卷积操作是局部的并且采用权重共享, 卷积层在处理图象时具有平移不变性, 也就是说, 不论物体出现在图像的哪个位置, 卷积层都能有效检测到这些物体的特征.

3.1 卷积计算

在这里插入图片描述

  1. input 表示输入的图像.
  2. filter 表示卷积核, 也叫做滤波器(滤波矩阵).
  3. output 叫作特征图.
  4. 原理: 卷积运算本质上就是在滤波器和输入数据的局部区域间做点积.
    在这里插入图片描述
    按照上面的计算方法可以得到最终的特征图为:
    在这里插入图片描述

3.2 Padding (填充)

Padding操作是一种用于在输入特征图的边界周围添加额外像素(通常是零, 等于几就是添加几).

Padding的主要作用:

  1. 保持空间维度: 如果不使用 padding,每次卷积操作后,特征图的尺寸都会缩小。多次卷积后,特征图会变得非常小,可能会丢失重要的边缘信息。Padding可以帮助维持输出特征图的尺寸与输入相同或接近相同。
  2. 保留边缘信息: 图像边缘的像素在卷积过程中参与的计算次数较少,这意味着边缘信息在特征提取过程中容易丢失。Padding通过在边缘添加额外的像素,增加了边缘像素的参与度,从而更好地保留了边缘信息。
  3. 提高性能: Padding有助于避免由于特征图尺寸快速缩小而导致的信息丢失,从而提高模型的性能,尤其是在处理较小的图像或需要进行多层卷积时。
    在这里插入图片描述

3.3 Stride (步长)

Stride 值的是卷积核在图像上滑动时的步伐大小, 即每次卷积时卷积核在图像中向右(或向下)移动的像素数. 步长直接影响卷积操作后输出特征图的尺寸, 以及计算量和模型的特征提取能力.

Stride的作用:

  1. 降低计算复杂度: 大的步长意味着卷积核移动的次数更少,从而减少了计算量,并加快了训练和推理速度。
  2. 减小特征图尺寸: 步长越大,生成的特征图尺寸越小。这类似于池化的降维效果。
  3. 增大感受野: 虽然更大的步长会减小特征图的尺寸,但它同时也会增大每个神经元在输入数据上的感受野。这意味着每个神经元能够捕捉到更大范围的输入信息(通俗理解就是 stride变大 每移动一次 卷积核覆盖的新特征变多了)。

Stride = 1:
在这里插入图片描述
Stride = 2:
在这里插入图片描述

3.4 多通道卷积计算

在这里插入图片描述

计算方法:

  1. 当输入有多个通道(Channel), 例如RGB三个通道, 此时要求卷积核需要拥有相同的通道数(图像有多少通道,每个卷积核就有多少通道).
  2. 每个卷积核通道与对应的输入图像的各个通道进行卷积.
  3. 将每个通道的卷积结果按位相加得到最终的特征图.
    在这里插入图片描述

3.5 多卷积核卷积计算

上面的例子里我们只使用一个卷积核进行特征提取, 实际对图像进行特征提取时, 我们需要使用多个卷积核进行特征提取. 这个多个卷积核可以理解为从不同的视角、不同的角度或不同的子空间对图像特征进行提取.
在这里插入图片描述

计算方式: 将输入图像分别按照多通道卷积计算的方式计算, 各得到一张特征图, 然后将这些特征图组合成一个完整的特征图, 由几个小特征图组成它的通道数就是几(和卷积核数量一致).

在这里插入图片描述

3.6 特征图大小

输出特征图的大小与size 卷积核大小, padding 填充, stride 步长 嘻嘻相关.(嘿嘿😎)

计算方式:

  1. 输入图像大小: W * W.
  2. 卷积核大小: F * F.
  3. Stride: S.
  4. Padding: P.
  5. 输出图像大小: N * N (不能整除需向下取整).
    在这里插入图片描述

3.7 Pytorch卷积层API

conv = nn.Conv2d(in_channels, out_channels, kernel_size, strid, padding)
# in_channels: 输入通道数, RGB图片一般是3.
# out_channels: 输出通道数, 也可以理解为卷积核kernel的数量.
# kernel_size: 卷积核的高和宽设置.
# strid: 卷积核移动的步长. (整数stride=2, 表示在所有维度上使用相同步长, 元组stride=(2, 1), 表示在水平方向步长为2, 垂直方向上步长为1.
# padding: padding=0 不进行填充, padding=1 在每个维度上填充1个像素.

4. 池化层

池化层(Pooling Layer)是用于降低输入数据的空间维度(例如图像的高度和宽度),从而减少计算量、减少内存消耗,并提高模型的鲁棒性。

池化层通常位于卷积层之后,它通过对卷积层输出的特征图进行下采样,保留最重要的特征信息,同时丢弃一些不重要的细节。

池化层的主要作用如下:

  1. 降维和计算量减少:池化层通过减少特征图的尺寸,从而降低了计算量,特别是在多层网络中,随着层数的增加,池化能够显著减少计算资源的消耗。
  2. 提高鲁棒性: 池化操作可以使得特征对小的变换、平移和旋转变得更加不敏感。这样,模型在面对噪声或图像的轻微变化时,依然能够稳定工作。
  3. 防止过拟合: 通过池化减少了特征图的大小,减少了模型的复杂度,从而有助于防止过拟合,尤其是在较小的数据集上。
  4. 抽象特征: 通过池化层的操作,可以提取更为抽象和高层次的特征,使得网络能够学习到更具泛化能力的表示。

4.1 池化层计算

最大池化(Max Pooling) :通过池化窗口进行最大池化,取窗口中的最大值作为输出
在这里插入图片描述
平均池化(Avg Pooling)取窗口内的所有值的均值作为输出
在这里插入图片描述

池化层也有padding和stride, 原理和卷积层一致, 这里就省略了.

4.2 多通道池化计算

在处理多通道输入数据时, 池化层对每个输入通道分别池化, 而不是像卷积层那样各自通道的输入相加, 这意味着池化层的输出和输入的通道数是相等的.
池化只在宽高维度上池化, 在通道上不发生池化, 池化前后通道数量不变.
在这里插入图片描述

4.3 PyTorch池化层API

# 最大池化.
nn.MaxPool2d(kernel_size=2, stride=2, padding=1)
# 平均池化.
nn.AvgPool2d(kernel_size=2, stride=1, padding=0)
# kernel_size: 核的高和宽.
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐