Code前端首页关于Code前端联系我们

一文看懂卷积神经网络(CNN):边界检测、结构组成

terry 2年前 (2023-09-27) 阅读数 83 #数据结构与算法

卷积神经网络(CNN)一文搞懂:边界检测、结构组成

卷积神经网络反正是我想不通的东西,主要是名字太“高级”,网上各种有关的文章介绍“什么是卷积”特别惊艳。听完吴恩达的网课,我恍然大悟,终于明白了什么是,为什么。我在这里可能会用 6-7 篇文章来解释 CNN 并实现一些有趣的应用。读完这篇文章后,你应该能够做一些你喜欢的事情。

1.简介:边界检测

让我们看一个最简单的例子:“边缘检测”。假设我们有一个像这样的 8×8 卷积神经网络 CNN:

卷积神经网络(CNN)一文搞懂:边界检测、结构组成

卷积神经网络 CNN 中的数字表示给定位置处像素的值。我们知道像素值越大,颜色越亮,因此为了清晰起见,我们将右侧的小像素画成黑色。图像中间两种颜色之间的分界线就是我们要检测的边界。

如何找到这个极限?我们可以设计这样一个过滤器(filter,也叫kernel),大小3×3:

卷积神经网络(CNN)一文搞懂:边界检测、结构组成

然后我们用这个filter来“覆盖”我们的卷积神经网络CNN,覆盖了像filter那么大的区域,对应的元素就是它们相乘然后相加。计算完一个区域后,移动到其他区域再计算,直到覆盖掉原来的卷积神经网络CNN的每个角落。这个过程就是“卷积”
(我们不需要担心运算的卷积在数学中意味着什么。我们需要知道它在CNN中是如何计算的。)
这里的“运动”包括步长。如果我们的步长为1,那么我们在覆盖空间后移动一个网格。很容易看出总共可以覆盖6×6个不同的区域。

然后我们将这6×6区域的卷积结果放入一个矩阵中:

卷积神经网络(CNN)一文搞懂:边界检测、结构组成

Eh? !发现了什么
这个卷积神经网络CNN中间是浅色,两边是深色。这说明我们原来的CNN卷积神经网络中间的边界在这里体现出来了!

从上面的例子中,我们发现我们可以通过设计一个特定的filter并让它与cnn卷积神经网络进行卷积来识别cnn卷积神经网络中的某些特征,例如边界。
上面的例子用于检测垂直边界。我们还可以建议检测水平边界,现在只需将filter旋转 90°。至于其他功能,理论上来说,只要我们精心设计,总能设计出一个合适的filter。

我们的CNN(卷积神经网络)主要是利用filter一一不断地提取特征,从局部特征到整体特征,来进行图像识别等功能。

那么问题是,我们怎么能设计出这么多不同类型的filter呢?首先,我们不一定知道需要为大型卷积神经网络CNN识别哪些特征。其次,即使我们知道有哪些特征,实际设计出相应的filter也可能并不容易。您需要知道函数的数量可能有数千个。

学完神经网络,我们其实知道这些儒家根本不需要我们去设计。每个filter中的数字只是参数。我们可以传递大量的数据,来,让机器自己“​​学习”这些参数。这就是CNN的原理。

2。 CNN基本概念

1.padding 填补空白
从上面的介绍我们可以知道,原始图像经过filter卷积后会缩小,从(8,8)缩小到(6,6)。假设我们再卷一次,大小就变成了(4,4)。

有什么问题吗? ?边缘点在卷积中计算的次数很少。在这种情况下,边缘信息很容易丢失。

为了解决这个问题,我们可以使用padding方法。每次卷积之前,我们先在卷积神经网络CNN周围填充一圈空的空间,这样在卷积之后,卷积神经网络CNN就和原来的大小一样了,同时,原来的边数也多了次。

卷积神经网络(CNN)一文搞懂:边界检测、结构组成

例如,如果我们将卷积神经网络CNN从(8,8)补充到(10,10),那么从(3,3)经过filter之后,(8,8)将保持不变。

上述“卷积后保持尺寸不变”的方法称为“相同”方法,而
不进行任何填充的填充方法称为❙❀方法。这是我们在使用一些框架时需要设置的超参数。

第2步step
我们前面介绍的卷积默认步长为1,但我们实际上可以将步长设置为其他值。
例如,对于输入(8,8),我们使用(3,3)中的filter,
如果step=1,则输出为(6,6);
如果step=2,则输出为(3,3); (这里的例子不太好,连续的话向下取整)

3.pooling 池化
这个池化是提取某个区域的主要特征,减少参数量,避免重新拟合模型。
比如下面的MaxPooling使用2×2的窗口,step=2:

卷积神经网络(CNN)一文搞懂:边界检测、结构组成

除了MaxPooling之外,还有AveragePooling,顾名思义,就是取这个区域的平均值。

4。多通道卷积神经网络CNN的卷积产品(重要!)
这个需要单独提一下。彩色图像一般具有三个 RGB 通道,因此输入数据一般具有三个维度:(长度、宽度、通道)
例如,28×28 RGBcnn 卷积神经网络的维度为(28,28,3)。

在前面的介绍中,CNN卷积神经网络的输入是2维(8,8),filter是(3,3),输出也是2维(6,6)。

如果输入的CNN卷积神经网络是三维的(即多加了一个通道)呢,比如(8,8,3),此时我们filter的维度就变成了(3,3,3 ),他的最后一个维度必须与输入通道的维度一致。
此时的卷积,是乘以后三个通道的所有元素之和,即之前是9次乘积之和,现在是27次乘积之和。因此,输出的尺寸不会改变。仍然(6.6)。

但是,一般情况下我们使用多个filter同时进行卷积。例如,如果我们同时使用4个filter,那么输出维度将是(6,6,4)

为了说明上面的过程,我特意画了下图:

卷积神经网络(CNN)一文搞懂:边界检测、结构组成

图中的输入图片是(8,8,3),有4张filter图片,大小分别是(3,3,3) 。结果输出为 (6,6,4)。
我觉得这张图画得很清楚,也展示了3和4这两个关键数字是怎么来的,所以我就不啰嗦了(这张图画了我至少40分钟)。

其实如果我们用之前学过的神经网络符号来看CNN的话,

  • 我们的输入cnn卷积神经网络是X,shape=(8,8,3);
  • 4filter的s其实是深金网络第一层W1参数,shape=(3,3,3,4),4表示有4个filter;
  • 我们的输出是Z1,shape =(6,6,4);
  • 其实后面应该有一个激活函数,比如relay。激活后,Z1变成A1,shape=(6,6,4);

所以在前面的图中,我添加了激活函数,并用符号标记了相应的部分,如下:

卷积神经网络(CNN)一文搞懂:边界检测、结构组成 [个人觉得这么好的图不收集就太可惜了】

3. CNN 组成的结构

上面我们已经知道了卷积、池化和填充是如何完成的。接下来我们看一下CNN的整体结构,它包含3种类型的层(layer):

1。卷积层(卷积层—CONV)
由filter滤波器和激活函数组成。
一般来说,要设置的超参数包括计数、大小、filter步长以及填充是否“有效”或“相同”。当然,还包括选择哪种激活函数。

2。池化层 (POOL)
我们不需要学习任何参数,因为我们在这里设置了所有参数,Maxpooling 或 Averagepooling。
要指定的超参数包括最大值或平均值、窗口大小和步长。
我们平时使用Maxpooling的时候比较多,一般使用大小为(2,2)、步长为2的filter。这样经过池化后,输入的长宽都会减少2倍,并且渠道将保持不变。

3。全连接层(FC)
这个前面就不提了,因为这是我们最熟悉的。 这是我们之前学过的最常见的神经网络。一层是一排神经元。由于本层的每个单元都与上一层的每个单元相连,因此称为“全连接”。
这里指定的超参数无非就是神经元数量和激活函数。

接下来我们看一个随机的CNN,稍微了解一下CNN:

卷积神经网络(CNN)一文搞懂:边界检测、结构组成

上面的CNN是我随便想到的。其结构可表示为:
X→CONV(relu)→MAXPOOL→CONV(relu)→FC(relu)→FC(softmax)→Y

这里需要说明的是,经过多次卷积和池化,我们最终“比较”多维数据,,即(高度,宽度,通道)数据被压缩为一维数据长高×宽×通道的维数组再与FC层组合,与普通神经网络没有什么不同

从图中可以看到,随着网络越来越深,我们的图片(准确来说,中间的不能称为图片,但是为了方便,就这么说吧)越来越小,渠道变得越来越小。更大。图中的表现是面向我们的长方体的面越来越小,但长度却越来越长。

4。卷积神经网络 vs 卷积神经网络传统神经网络

其实现在回想起来,CNN和我们之前研究的神经网络并没有太大的区别。
传统神经网络实际上是多个FC层的堆叠
CNN无非是FC到CONV和POOL的改变,即将传统的由神经元组成的层改为由filter组成的层。

那为什么会变成这样呢?有什么好处
具体来说有两点:

1。参数共享机制(参数共享)
我们来对比一下传统神经网络的层数和filter组成的CONV层:
假设我们的图像是8×8,即64个像素,假设我们使用全连接层9 个单元:

卷积神经网络(CNN)一文搞懂:边界检测、结构组成

这一层需要多少个参数?需要 64×9 = 576 个参数 (忽略偏置项 b)。由于每个链接都需要一个权重w。

那么我们来看看filter长什么样子,它也有9个单位:

卷积神经网络(CNN)一文搞懂:边界检测、结构组成

你其实不用看那么多就知道了,是参数,所以有9个参数总计

因为我们在不同的领域共享相同的filter,所以我们共享相同的参数集。
这也有道理。从前面的解释,我们知道filter是用来检测元素的,一般这个元素很可能出现在不止一个地方,比如“垂直边框”,它可能会在形象,那么我们不仅同filter是合理的,而且也是我们应该做的事情。

可以看出,参数共享机制大大减少了我们网络的参数数量。这样我们就可以用更少的参数训练出更好的模型,通常会事半功倍,并且可以有效避免过度拟合
同样,得益于filter参数共享,即使卷积神经网络CNN进行一定的平移操作,我们仍然可以识别特征。这称为 “平移不变性”。因此,该模型更加稳健。

2。连接的稀疏性
从卷积运算来看,输出图像中的任何单元仅与输入图像的部分相关:

卷积神经网络(CNN)一文搞懂:边界检测、结构组成

在传统神经网络中,因为它们都是全连接的,所以任何输出单元受所有输入单位的影响。这实际上降低了图像的识别效果。相比之下,每个区域都有自己独特的属性,我们不希望它受到其他区域的影响。

正是得益于上述两个主要优点,CNN 克服了传统的 NN,开启了神经网络的新时代。

作者:SimpleAI by Beyond

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门