我觉得GPT老师的语言功底比大多数的博客主要好(包括我自己),阅读起来更易理解,而且哪里不明白还可以直接问gpt老师,孜孜不倦,尽心尽责,全天待命,究极贴心。有这么厉害的一个老师,不学习简直暴殄天物。
于是乎我准备立一个flag,挑战跟着GPT老师学习365天,每天我都会整理自己的学习心得和脉络(文字大部分都是GPT直接生成的,我觉得比我自己写肯定好多了)感谢gpt老师!跪谢
全系列文章:跟着GPT学习-AI系列
写在前面
本文基于:
cnn-explainer
https://d2l.ai/chapter_convolutional-neural-networks/why-conv.html
这些文章进行了翻译和细节补充讲解。
图像处理的不变性
在图像处理中,检测一个物体的精确位置不应成为识别的唯一关注点。系统应该能够识别物体而不论其位置。这种方法可以从“沃尔多在哪里”游戏中汲取灵感,即通过扫描图像的不同部分来检测目标物体。基于这一思想,许多物体检测和分割算法得以发展。卷积神经网络(CNN)系统化了这种空间不变性的思想,从而能够通过较少的参数学习有用的表示。

核心观点和设计指导原则
-
平移不变性(或平移等变性):
- 网络应该对图像中的同一个块在不同位置出现时做出类似的响应。
- 这种不变性是通过卷积层实现的,因为卷积层会在图像的不同位置应用相同的滤波器。
-
局部性原则:
- 网络的最初几层应该专注于图像的局部区域,而忽略远处区域的内容。
- 这使得网络能够有效地捕捉局部特征,如边缘、纹理等。
- 最终,这些局部特征可以聚合起来,形成对整个图像的全局理解。
-
更深层次的特征捕捉:
- 随着网络层数的增加,网络应该能够捕捉到图像中的更长距离特征。
- 这种层次结构类似于自然界中视觉系统的高级处理方式。
什么是卷积神经网络?
在机器学习中,分类器会为数据点分配类别标签。例如,图像分类器会为图像中存在的对象生成类别标签(例如,鸟、飞机)。卷积神经网络(简称 CNN)是一种分类器,它擅长解决此类问题!

CNN 是一种神经网络:一种用于识别数据模式的算法。神经网络通常由一组按层组织的神经元组成,每个神经元都有自己可学习的权重和偏差。让我们将 CNN 分解为其基本构建块。
- 张量可以看作是 n 维矩阵。在上述 CNN 中,除输出层外,张量都是 3 维的。
在CNN中,输入图像和中间特征图通常表示为三维张量。这三维分别代表:
- 高度(Height):图像或特征图的垂直维度。
- 宽度(Width):图像或特征图的水平维度。
- 通道数(Channels):图像的颜色通道数或特征图的深度。
假设我们有一个32x32像素的RGB图像:
- 高度:32 图像的垂直像素数
- 宽度:32 图像的水平像素数
- 通道数:3 (分别对应红色、绿色和蓝色通道)
因此,输入张量的形状为 (32, 32, 3)。
- 神经元可以被认为是一个接受多个输入并产生单个输出的函数。神经元的输出如上图所示,表示为红色→蓝色 激活图。
在卷积神经网络(CNN)中,激活图(ActivationMap)显示的是神经元在处理输入数据后的响应。图中的红色和蓝色激活图是指神经元对输入图像不同部分的响应强度。
红色和蓝色激活图的含义
- 红色激活:表示该区域的神经元激活较低或负值响应较强。一般情况下,红色代表负响应值。
- 蓝色激活:表示该区域的神经元激活较高或正值响应较强。蓝色通常代表正响应值。 激活图的生成过程 输入图像处理:
输入图像首先经过卷积层处理,生成特征图。这些特征图包含了输入图像的局部特征信息。 图像通常有多个通道(如RGB图像有3个通道)。
-
层只是具有相同操作的神经元的集合,包括相同的超参数。
-
核权重和偏差虽然对于每个神经元都是独一无二的,但在训练阶段会进行调整,并允许分类器适应提供的问题和数据集。它们在可视化中以黄色→绿色发散色阶进行编码。可以通过单击神经元或在卷积弹性解释视图中将鼠标悬停在核/偏差上来查看交互式公式视图中的特定值。
表示输入到 CNN 的图像。由于我们使用 RGB 图像作为输入,因此输入层有三个通道,分别对应于红色、绿色和蓝色通道,这些通道在此层中显示。单击网络详细信息图标上方的图标时使用颜色标尺可显示详细信息(关于此层和其他层)。
卷积层
卷积层是 CNN 的基础,因为它们包含学习到的内核(权重),这些内核可以提取区分不同图像的特征——这正是我们进行分类所需要的!当您与卷积层交互时,您会注意到先前的层和卷积层之间的链接。每个链接代表一个唯一的内核,用于卷积运算以生成当前卷积神经元的输出或激活图。
卷积神经元使用唯一核和前一层相应神经元的输出进行元素点积运算。这将产生与唯一核数量一样多的中间结果。卷积神经元是所有中间结果与学习到的偏差相加的结果。
例如,让我们看看上面的 Tiny VGG 架构中的第一个卷积层。请注意,此层中有 10 个神经元,但前一层只有 3 个神经元。在 Tiny VGG 架构中,卷积层是全连接的,这意味着每个神经元都连接到前一层的每个其他神经元。关注第一个卷积层最顶层卷积神经元的输出,当我们将鼠标悬停在激活图上时,我们会看到有 3 个独特的内核。

这些内核的大小是网络架构设计者指定的超参数。为了产生卷积神经元的输出(激活图),我们必须对前一层的输出和网络学习到的唯一内核进行元素点积运算。在 TinyVGG 中,点积运算使用 1 的步幅,这意味着内核每进行一次点积就会移动 1 个像素,但这是一个超参数,网络架构设计者可以调整它以更好地适应他们的数据集。我们必须对所有 3 个内核执行此操作,这将产生 3 个中间结果。

然后,执行包含所有 3 个中间结果以及网络已学习到的偏差的元素总和。此后,生成的二维张量将成为上面界面上可查看的第一个卷积层最顶层神经元的激活图。必须应用此相同操作来生成每个神经元的激活图。
通过一些简单的数学运算,我们可以推断出第一个卷积层应用了 3 x 10 = 30 个独特的内核,每个内核的大小为 3x3。卷积层与前一层之间的连接是构建网络架构时的设计决策,这将影响每个卷积层的内核数量。单击可视化效果以更好地了解卷积层背后的操作。看看你是否能理解上面的例子!
理解超参数
在卷积神经网络中,卷积操作会导致输入张量的空间维度发生变化。这种变化主要受卷积核的大小、步幅(stride)和填充(padding)方式的影响。我们来解释一下图中从 (64, 64) 到 (62, 62) 的尺寸变化是如何发生的。
-
当内核超出激活图时,通常需要填充。填充可保留激活图边界处的数据,从而提高性能,并且有助于保留输入的空间大小,从而使架构设计人员能够构建更深、性能更高的网络。存在许多填充技术,但最常用的方法是零填充,因为它具有性能、简单性和计算效率。该技术涉及在输入的边缘对称地添加零。许多高性能 CNN(例如AlexNet)都采用了这种方法。
-
内核大小,通常也称为过滤器大小,指的是输入上滑动窗口的尺寸。选择此超参数对图像分类任务有很大影响。例如,较小的内核大小能够从输入中提取包含高度局部特征的大量信息。如您在上面的可视化图中看到的,较小的内核大小也会导致层尺寸的减少较少,从而允许更深的架构。相反,较大的内核大小提取的信息较少,这会导致层尺寸减少更快,通常会导致性能下降。大内核更适合提取更大的特征。归根结底,选择合适的内核大小将取决于您的任务和数据集,但通常,较小的内核大小可以为图像分类任务带来更好的性能,因为架构设计者能够将越来越多的层堆叠在一起以学习更多、更复杂的特征!
-
步幅表示内核每次应移动多少个像素。例如,如上文卷积层示例所述,Tiny VGG 对其卷积层使用步幅 1,这意味着对输入的 3x3 窗口执行点积以产生输出值,然后在每次后续操作中将其向右移动一个像素。步幅对 CNN 的影响类似于内核大小。随着步幅的减小,由于提取了更多数据,因此可以学习更多特征,这也会导致输出层更大。相反,随着步幅的增加,这会导致特征提取更加有限,输出层尺寸更小。架构设计师的职责之一是确保在实现 CNN 时内核对称地在输入上滑动。使用上面的超参数可视化来改变各种输入/内核维度上的步幅,以了解此约束!

卷积操作的基本公式
对于一个输入张量 (I) 和一个卷积核 (K),卷积操作输出张量 (O) 的尺寸可以通过以下公式计算:
O
h
=
(
I
h
−
K
h
+
2
P
)
S
+
1
O_h = \frac{(I_h - K_h + 2P)}{S} + 1
Oh=S(Ih−Kh+2P)+1
O
w
=
(
I
w
−
K
w
+
2
P
)
S
+
1
O_w = \frac{(I_w - K_w + 2P)}{S} + 1
Ow=S(Iw−Kw+2P)+1
其中:
- O h O_h Oh 和 O w O_w Ow 分别是输出张量的高度和宽度。
- I h I_h Ih和 I w I_w Iw 分别是输入张量的高度和宽度。
- K h K_h Kh 和 K w K_w Kw 分别是卷积核的高度和宽度。
- P P P 是填充(padding)的大小。
- S S S是步幅(stride)。
例子分析
根据图中的信息,我们可以推测卷积操作使用了如下参数:
- 输入张量尺寸:64 x 64
- 输出张量尺寸:62 x 62
- 卷积核尺寸:3 x 3
- 步幅:1
- 填充:0(即 “valid” 填充)
计算过程
我们代入公式进行计算:
- 输入张量尺寸:64 x 64
- 卷积核尺寸:3 x 3
- 步幅:1
- 填充:0
根据公式计算输出尺寸:
O
h
=
(
64
−
3
+
2
⋅
0
)
1
+
1
=
61
1
+
1
=
62
O_h = \frac{(64 - 3 + 2 \cdot 0)}{1} + 1 = \frac{61}{1} + 1 = 62
Oh=1(64−3+2⋅0)+1=161+1=62
O
w
=
(
64
−
3
+
2
⋅
0
)
1
+
1
=
61
1
+
1
=
62
O_w = \frac{(64 - 3 + 2 \cdot 0)}{1} + 1 = \frac{61}{1} + 1 = 62
Ow=1(64−3+2⋅0)+1=161+1=62
因此,卷积操作后,输出张量的尺寸变为 62 x 62。
填充的影响
填充(padding)是指在输入张量的边缘添加额外的像素以控制输出张量的尺寸。常见的填充方式有:
- Valid 填充:无填充,导致输出张量尺寸减少。
- Same 填充:在输入张量的边缘添加足够的像素,使得输出张量尺寸与输入张量相同。
若使用 “same” 填充,输出尺寸计算公式中的 (P) 会调整为合适的值,以保证输出张量的高度和宽度与输入张量相同。
激活函数
线性整流器
神经网络在现代技术中非常流行——因为它们非常准确!当今性能最高的 CNN 由大量层组成,这些层能够学习越来越多的特征。这些突破性的 CNN 能够实现如此高的准确度,部分原因在于它们的非线性。ReLU 将急需的非线性应用于模型中。非线性是产生非线性决策边界所必需的,因此输出不能写为输入的线性组合。如果没有非线性激活函数,深度 CNN 架构将退化为单个等效卷积层,其性能将远不如前者。ReLU 激活函数专门用作非线性激活函数,与其他非线性函数(如Sigmoid )不同,因为经验表明,使用 ReLU 的 CNN 比同类 CNN 训练速度更快。
ReLU激活函数是一对一的数学运算:

此激活函数逐元素应用于输入张量的每个值。例如,如果对值 2.24 应用 ReLU,结果将为 2.24,因为 2.24 大于 0。您可以通过单击上面网络中的 ReLU 神经元来观察此激活函数的应用方式。在上述网络架构中的每个卷积层之后执行整流线性激活函数 (ReLU)。请注意此层对整个网络中各种神经元的激活图的影响!

Softmax

softmax 操作有一个关键目的:确保 CNN 输出总和为 1。因此,softmax 操作可用于将模型输出缩放为概率。单击最后一层可显示网络中的 softmax 操作。请注意,展平后的 logit 未在 0 到 1 之间缩放。为了直观地显示每个 logit(未缩放的标量值)的影响,它们使用浅橙色→深橙色颜色标度进行编码。经过 softmax 函数后,每个类现在都对应一个适当的概率!
您可能想知道标准规范化和 softmax 之间的区别是什么——毕竟,两者都在 0 和 1 之间重新调整 logit。请记住,反向传播是训练神经网络的一个关键方面——我们希望正确答案具有最大的“信号”。通过使用 softmax,我们可以有效地“近似”argmax,同时获得可微分性。重新调整不会使最大值的权重明显高于其他 logit,而 softmax 会。简而言之,softmax 是一个“更软”的 argmax——看看我们在那里做了什么?

池化层
不同 CNN 架构中池化层的类型有很多,但它们的目的都是逐渐减小网络的空间范围,从而减少网络的参数和整体计算量。上图 Tiny VGG 架构中使用的池化类型是 Max-Pooling。
最大池化操作需要在架构设计期间选择内核大小和步长。选择后,该操作会将具有指定步长的内核在输入上滑动,同时仅从输入中选择每个内核切片的最大值以产生输出值。单击上方网络中的池化神经元即可查看此过程。
在上面的 Tiny VGG 架构中,池化层使用 2x2 内核和 2 的步幅。具有这些规格的此操作会导致丢弃 75% 的激活。通过丢弃如此多的值,Tiny VGG 的计算效率更高,并且避免了过度拟合。

展平层
此层将网络中的三维层转换为一维向量,以适应全连接层的输入以进行分类。例如,5x5x2 张量将转换为大小为 50 的向量。网络的先前卷积层从输入图像中提取了特征,但现在是时候对特征进行分类了。我们使用 softmax 函数对这些特征进行分类,这需要一维输入。这就是为什么 flatten 层是必要的。可以通过单击任何输出类来查看此层。


5110

被折叠的 条评论
为什么被折叠?



