圖像識別背后的卷積神經(jīng)網(wǎng)絡(luò):通俗解讀卷積神經(jīng)網(wǎng)絡(luò)如何看圖辨物
它们是啥?
你可能看过科幻侦探电影,里面的人物会用未来科技识别人脸,并有时会在头和身体周围画个框来方便破案。
或者你也见过自动驾驶车是怎么工作的。它们前面装着摄像头,用来识别前方道路并避开障碍。
这些技术都是通过卷积神经网络来实现的。
它们是如何工作的?它们通过使用滤镜或卷积核从图像中提取特征,并然后通过神经网络进行预测或输出。在深入了解卷积神经网络之前,让我们先详细了解图像的工作原理。
图片图像由称为像素的微小颗粒组成,就像原子构成宇宙一样。这些微小的颗粒是包含数字的单元格。是的,就像矩阵中的单元格一样。
实际上,图像就是由特定行数和列数的矩阵构成的,图像矩阵中的每个像素包含一个介于0和255之间的数字。当你看到一个1920 x 1080的图像时,实际上意味着这个图像是由1920列和1080行的矩阵构成的,每个像素的数值都在0到255之间。
下面这个矩阵图展示了图像在计算机眼中的真实面貌。[图片来源:作者]
给图像上色。如果你知道屏幕上的所有图片都是由红色、绿色和蓝色三种颜色构成的,你会相信吗?将它们混合在一起可以混合成白色或图像中的其他颜色。
你知道图像中的每个像素都有一个亮度值,这个值从0到255不等。0表示最暗的颜色,也就是黑色;255则代表最亮的颜色。
每个彩色图像实际上包含三个相同大小的矩阵。第一个矩阵代表红色,第二个矩阵代表绿色,第三个矩阵代表蓝色,每个矩阵中的值都在0到255之间,表示其颜色强度。如果每个矩阵中的值都是255,图像就会显示为白色;如果每个矩阵中的值都是0,图像就会显示为黑色。这三个矩阵分别代表红、绿、蓝三种颜色,我们称之为“通道”。
通道的图,展示图像中的通道。[图片由作者提供]
这三个矩阵就像透明纸叠在一起,每个像素里都有一个小灯泡,各自发出对应的光色。
展示如何将三个颜色通道叠加在上面的图。[作者提供的图片]
将每个矩阵中的数字从0改为255可以生成不同的颜色。例如,如果我把蓝色和绿色矩阵中的所有像素都改为0,把红色矩阵中的所有像素都改为255,图像就会完全变成红色。如果我把绿色和蓝色矩阵中的所有像素都改为0,而把红色矩阵中的所有像素都改为0,图像就会分别显示绿色和蓝色。
你们知道吗?但是,猜猜看,如果我把每个彩色矩阵中的几个像素值改成随机数,图像就会在这些像素值被改变的地方显示不同的颜色,比如棕色、黄色、橙色或其他类似的色调。
又回到卷积了!想象你正在解读一份3000年前的卷轴,其中包含了关于未来的秘密信息,这些信息可能有朝一日拯救世界;或者是一份2000年前的古籍,里面包含了一种古代大规模杀伤性武器的图纸。为了从这两份古籍中收集信息,你会用放大镜仔细观察,并将你所获取的所有信息慢慢记录在你的笔记本中。
卷积神经网络也以类似的方式工作。我们有一个像放大镜一样带有数字的矩阵。这个矩阵逐像素地滑动过图像,通过将矩阵中的数字与图像中对应像素相乘并将结果相加,从图像中提取信息。这个小矩阵也被称为滤波器或核。
一张示意图展示了图像作为矩阵,旁边展示了内核或滤镜。[图片由作者提供]
注意:
在我们开始卷积过程之前,我们还需要做一些事情。在代表每种颜色的三个矩阵或通道里,每个像素的值都在0到255之间。这些值对于机器学习模型来说太大,可能会导致训练变慢,并且还可能遇到诸如梯度爆炸等问题。
为了避免这种情况发生,我们需要将每个像素值从0到255的范围转换到0到1的范围。我们具体怎么做呢?我们将每个像素值除以255来将其转换到0到1之间。这一步通常被称为图像预处理,这是训练卷积神经网络时一个非常重要的前置步骤。
图像预处理步骤。将所有像素值除以255,使其在0到1之间。[图由作者提供]
这是对图像中所有3个通道执行的预处理步骤。
图片展示了经过预处理的图像通道。[图片由作者提供]
在这篇文章里,我们会用卷积神经网络来给图片分类。想象一下你有两张图片:一根热狗和一个比萨。卷积神经网络可以确定每张图片所属的类别。例如,一张比萨的图片会被归为比萨,而一张热狗的图片则会被归为热狗。
在这篇文章里,我们要训练一个卷积神经网络辨识两张图片,一张包含数字‘1’,另一张则包含数字‘2’。
这里有几个步骤:
详细解释会随后给出。
- 图像首先通过将所有像素值除以255来预处理,将其缩放到0和1之间。
- 图像通过与滤波器或卷积核进行滑动(卷积操作),每个重叠的像素相乘并求和它们相乘的结果以得到一个单一的数字。
- 每个颜色通道都有自己的滤波器。在获取了每个像素区域的结果后,来自每个通道的最终值被加在一起以生成一个单一的值,这个值将被放入一个名为特征图的单一输出矩阵中。
- 那个特征图被最大池化。最大池化包括在特定像素区域中提取最大值。例如,如果你有一个6x6的矩阵和一个2x2的最大池化层,在6x6的矩阵中,最大池化层将从6x6矩阵的每个2x2部分中提取最大值。这将在后面进行详细说明。
- 最大池化后的结果被展平为一维数组,然后通过一个普通的前馈神经网络来最终进行预测。
A. 预处理步骤.
首先,图像通过将每个像素值(三个通道中的每个像素)除以255来进行预处理,使其值落在0到1的范围内。为了简化,我们可以假设预处理后的图像是一个黑白图像。255表示白色,0表示黑色,所以255除以255得到1,0除以255得到0,分别表示白色和黑色。
黑白的6x6像素的图像,包含数字'1'。[图片由作者提供]
B. 卷积流程
将特征提取到一个 特征图 中。
特征图层是一个包含从经过预处理的输入图像中提取出来的特征的单个矩阵,就像我之前提到的那本日记一样。
为了从输入图像中提取特征,会使用一个随机滤波器或核,它实际上是一个装有随机数字的小矩阵,并将其滑过输入图像。输入图像的每一个通道都有自己对应的滤波器或核。计算过程中,将核中的像素值与输入图像中对应的像素值相乘。
例如,如果我们有一个 3x3 的卷积核,在 6x6 的图像上运行,3x3 的卷积核将首先放置在 6x6 图像的左上角,重叠在 6x6 图像的 3x3 区域上。由于卷积核的大小为 3x3,它只会覆盖实际输入图像的一个 3x3 部分,并且最开始重叠的两个像素会相乘。该过程会重复,直到处理完第九个像素。
显示输入图像和滤波器或核的图示。图源:作者
完成这些计算后,将所有这些乘法的结果加起来得到一个单一值。这个单一值会加到与卷积核相关的另一个值(称为偏置)上,偏置则被初始化为一个随机数,以此来增加CNN模型的多样性及其灵活性。
我们将对每个通道重复同样的过程,每个通道都会为其各自矩阵的左上角3x3部分生成自己的输出。比如说,红色通道可能输出3,绿色通道可能输出-1,蓝色通道可能输出2。
在下面这张图里,红色通道的输出结果是2。
示意图展示核与输入图像通道间矩阵计算。[作者提供]
每个核乘法的结果会加到相应的偏置上去。这个偏置是一个随机数,它的作用是增加模型的灵活性。红色通道的偏置为-2,该值将添加到红色通道第一个输出值2(左上角)上。
注:偏差是可调整的可训练参数,通过调整激活值来更好地适应训练数据。
图片由作者提供,
非常重要注意:
下面的图显示的是我们要计算的每个通道的卷积核和偏置项。
下面展示一下卷积。
这张图片是作者提供的
绿通道的卷积核有一个-1的偏置,这个-1将加到代表图像左上角3x3矩阵的第一个输出上,结果为0 + (-1)。
这(通过将0.9加到蓝通道的输出上)就是如何从图像中提取特征。蓝通道的核有一个0.9的偏置值。这个0.9会被添加到蓝通道的输出结果为(1+0.9)。
如上图所示,三个通道的计算结果。
红通道
(0x0)+(0x1)+(0x1)
(0x0)+(0x0)+(1x1)
(0x0)+(1x1)+(0x0)
= 2 + (−2) = 0
(红通道左上角)
绿色通道
(0x1)+(0x0)+(0x0)+
(0x1)+(0x1)+(0x0)+
(0x1)+(0x1)+(0x0) = 0
0 + (-1) = -1
绿色通道左上角的输出结果
蓝色通道
(0x0)+(0x0)+(0x1)+
(0x1)+(0x0)+(0x0)+
(0x0)+(0x1)+(0x1) = 1
1 + 0.9 = 1.9
(蓝色通道左上角的输出结果)
但是等等,特征图是一个单一的矩阵,而我们却有3个输出值。我们应该怎么做呢?我们需要把每个通道的三个输出值加起来,得到特征图的第一个值。由于各个通道左上角的值分别为0、-1和1.9,这样加起来的输出值就是0.9。
0.9会被放置在特征图(“FEATURE MAP”)内部,作为包含提取特征的单一输出,它会变成特征图左上角的一个像素,代表所有通道左上角的像素。换句话说,0.9会变成特征图左上角的一个像素,代表每个通道图像的左上角。
卷积核在列和行方向上移动的次数决定了特征图的大小。
显示卷积核在图像上滑动的特征图。[图由作者提供]
更详细的解释
在计算出特征图的第一个像素之后,每个通道的卷积核都会向右移动一像素,每次移动一列。这种移动方式的步长为1,表示每次移动一列。使用步长为1,表示每次移动一像素。
整个计算过程会重复一遍,生成一个新的特征图数值。使用2个步幅会导致卷积核在第一次计算后向右移动两列。
当内核到达边缘时,它会根据给定的步长向下移动。如果步长设置为1的话,每个通道的内核在到达边缘后,会往下移一行,然后开始计算以生成特征图的另一个值。
如果内核向下位移,特征图的下一个计算值也会出现在下方。内核在6x6的矩阵中向下移动了4次,直到达到边缘。因此,它在特征图中产生一行四个值。到达边缘后,内核会向下位移,开始新的一轮计算。
当这种情况出现时,新值会出现在旧值下方。最后,特征图会变成4行4列,这与之前提到的卷积核移动次数一致。
请看下面的图片
图片来自作者
该过程会重复进行,直到卷积核与图像的所有部分都滑过。在图像的所有部分都经过卷积计算后,将生成如下生成的特征图。
经过卷积操作后的最终特征图。[图片来自作者]
在得到最终的特征图之后,每个像素值都会通过ReLU激活函数处理。ReLU激活函数将所有负像素值变为0,保留所有正像素值。
让我们把所有正像素值变成1,这样更简单。注意:这并不是卷积的一部分。
最后,你会有一个只包含1和0的矩阵。这个新矩阵就变成了新的特征映射。见下图
作者所绘
C. 最大池化
最大池化通常紧跟在卷积层之后。它提取特定区域的最大值,并形成一个新矩阵。虽然最大池化层类似于卷积核,但它们自身不包含任何值。它们通过在特征图的特定区域提取最大值来减小特征图的空间尺寸。
就像卷积核那样,最大池化层会根据其大小在特征图上像放大镜一样移动。让我们来想象一下,我们有一个 2x2 的最大池化层。最大池化层首先会放在特征图的左上角,从这个 2x2 的区域中找到最大值。
特征图的尺寸是4x4像素,这意味着最大池化层会从特征图的第一个2x2区域中提取最大数值。
从特征图区域提取最大值的示意图。[图片来源:作者]
最大池化层的步长等于其大小,当然也可以使用其他的步长值。由于最大池化层的大小为2x2,它将在特征图上以2x2的区域滑动。这意味着它会每次移动2列,直到到达边缘,然后在提取边缘信息后向下移动2行。最终结果会是一个新的2x2矩阵。
2x2最大池化后的左上角对应于特征图的左上角。
D. 平整化
获取最大池化后的图像后,最大池化层的输出值需要通过一个标准的前馈神经网络,来进行分类和预测。
但我们从最大池化层得到的是一个2x2的矩阵(即二维矩阵),但是普通的前馈神经网络只接受一维数组。由于这个原因,我们需要将二维矩阵展平成一个一维向量。最大池化层的输出会转换成一个只有一行的一维数组,尽管下面的图看起来像一列数据。
显示最大池化层展平成1D数组的图片。(作者提供)
E. 前馈层。预测时间到了!
一个普通的前馈神经网络包含权重和偏置。如图所示,每个值都连接着一条线。这条线被称作权重,代表一个数值。每个权重都会与一维向量中的对应值相乘。
这些乘积会被汇总,加上一个偏置(该偏置也是一个随机数),然后输出会通过激活函数处理。激活函数可以是ReLU、Softmax或Sigmoid。
Sigmoid 激活函数将值转换到 0 到 1 的区间。它通常用于二分类,即仅用于区分两类。SoftMax 更适合用于多类别分类,能给出多个类别的概率分布。
这张图是作者的
经过激活函数处理的单一输出,如上图中所示,分别乘以两个不同的权重,加上对应的粉色偏置,分别生成两个输出值,对应两个输出神经元。
一个输出节点代表数字1,另一个代表数字2,这两个都是图像的种类。
不过,由于计算机处理的是数字而非字母,每个输出神经元的输出只能是1或0。如果代表第一类的神经元输出1(即黑白图像中含有数字1的图片),这样第一类就成为了预测结果;同样,如果另一个神经元输出1,则第二类成为预测结果。
非常重要的细节:
同样的流程也会对包含数字2的图像进行,使用相同的权重、偏置和核。在训练阶段,如果模型做出了错误的预测,所有的权重、偏置和核都将会被相应地调整,直到模型能够正确预测为止。这就是模型学习的过程。
摘要如下:- 首先对图像进行预处理,将所有像素值除以255,使它们的值在0到1之间。
- 对图像应用卷积核/滤波器,从中提取特征并将其放入名为特征图的另一个矩阵中。
- 特征图通过ReLU激活函数进行处理,将所有负值变为0,保持正值不变。
- 应用最大池化层以提取特定区域的像素中的最大值,其大小由最大池化层或矩阵的大小确定。
- 最大池化层的最终结果被转换为一维数组,然后输入前馈神经网络。
- 一个前馈神经网络包含权重和偏差,以及另一个激活函数,以做出最终预测,确定图像的类别。
做得好,船员!你终于完成了这份报告!
关注我以获取更多关于AI的深度内容,并阅读我之前关于大规模语言模型的论文,了解更多背后的数学和逻辑。
你可以在LinkedIn上找到我:Joshua Anang | LinkedIn
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章