英文原文:https://www.analyticsvidhya.com/blog/2017/06/architecture-of-convolutional-neural-networks-simplified-demystified/
对原文的表达有部分改动
介绍:
今天,我将向您展示如何使用卷积神经网络并对其进行研究。我将引导您完成整个旅程,以便您可以更深入了解 CNN 的工作原理。在本文中,我将讨论卷积神经网络背后的架构,该架构旨在解决图像识别和分类问题。我假设您对神经网络的工作原理有基本的了解。
计算机视角下的图像
人脑是一个非常强大的机器。我们每秒能够看到(捕获)多个图像并处理它们,但人们常常没有意识到这些处理是如何完成的。但机器并非如此,图像处理的第一步是要确定如何表示图像以便机器可以读取它
简单来说,每张图像都是由特殊顺序排列的点(一个像素)组成的。如果您更改像素的顺序或颜色,图像也会随之更改。假设您想存储和读取上面写有数字 4 的图像。机器基本上会将这个图像分解成一个像素矩阵,并在每一个像素的位置存储每个像素的颜色代码。在下面的表示中,数字 1 是白色,而 256 是最深的绿色阴影(为了简单起见,我将示例限制为只有一种颜色)。
以这种格式存储图像后,下一步就是让我们的神经网络理解它的排列和模式。
如何帮助神经网络识别图像
假设我们尝试使用全连接(Fully Connected)的网络来识别它。一个全连接的网络会将这张图像作为一个数组,将其展平(Flatten)并将像素值视为特征来预测数值。此时的网络很难理解底层发生的事情。
即使是人类也无法识别这是数字 4 的表示,此时我们已经完全丧失了像素的空间排列。不妨让我们尝试从原始图像中提取特征,以便保留其空间排列。
Case 1
这里我们使用了一个权重 3 来乘以初始像素值。
Case 2
现在我们可以看到,扁平化图像完全破坏了它的排列。我们需要设计一种方法来将图像发送到网络,而无需将它们展平,从而保留其空间排列。我们需要发送像素值的 2D/3D 排列。
让我们尝试一次取图像的两个像素值,而不是只取一个。这将使网络引入相邻像素的关系。现在我们一次取两个像素,此时需要设置两个权重值。
图像现在从最初的 4 列变成了 3 列。因为我们现在一次移动两个像素(像素在每次移动中共享)。我们仍然可以认出它是数字4。此外,要意识到的一个重要事实是我们采用了两个连续的水平像素,因此这里只考虑水平排列。
这是从图像中提取特征的一种方法。我们能够很好地看到左侧和中间部分,但右侧不太清楚。这是因为以下两个问题——
- 图像的最左最右列只乘以一次权重。
- 因为权重值高,左侧部分仍然保留,而右侧部分由于权重过低而略有丢失。
Case 3
让我们来解决图像的最左最右列只乘以一次权重
我们有一个简单的解决方案来解决这个问题。在权重移动的两侧放置零。
您可以看到,通过添加零,角落的信息得以保留。图像也拥有更大的尺寸。这可用于我们不希望图像尺寸减小的情况。
Case 4
剩下的问题是右侧的较小权重值会降低其像素值,从而使我们难以识别。我们能做的是,我们在一个回合中取多个权重值并将它们放在一起。(1, 0.3) 的权重值给了我们以下形式的输出:
而 (0.1,5) 的权重值会给我们一个形式的输出:
这两个图像的组合版本将为我们提供非常清晰的图片。因此,我们所做的只是使用多个权重而不是一个权重来保留有关图像的更多信息。最终输出将是上述两个图像的组合版本。
Case 5
到目前为止,我们研究了水平的权重。但在大多数情况下,我们需要保留水平和垂直方向的空间排列。我们可以将权重视为一个 2D 矩阵,它将水平和垂直方向的像素组合在一起。另外,请记住,由于我们同时进行了权重的水平和垂直移动,因此输出在水平和垂直方向上都少了一个像素。
总结
我们上面所做的是尝试通过图像的空间排列来从图像中提取特征。网络能够理解像素的排列方式对于图像识别是非常重要的。我们上面所做的正是卷积神经网络所要完成的。我们可以获取输入图像,定义一个权重矩阵,然后对输入进行卷积以从图像中提取特定特征,而不会丢失有关其空间排列的信息。
这种方法的另一个巨大好处是它减少了图像中的参数数量。正如您在上面看到的,与原始图像相比,卷积图像的像素更少。这大大减少了我们需要为网络训练的参数数量。
定义卷积神经网络
我们需要三个基本组件来定义一个基本的卷积网络。
- 卷积层
- 池化层(可选)
- 输出层
卷积层
在这一层中,发生的事情正是我们在上面的 case 5 中看到的。假设我们有一个大小为 6*6 的图像。我们定义了一个权重矩阵,它从图像中提取某些特征我们已将权重初始化为 3*3 矩阵。这个权重现在应该穿过图像,使得所有像素至少被覆盖一次,以提供卷积输出。上面的值 429 是通过将权重矩阵的元素乘法与输入图像的突出显示的 3*3 部分相加获得的值而获得的。
6*6 图像现在转换为 4*4 图像。当权重矩阵沿图像移动时再次使用的像素值,这基本上实现了卷积神经网络中的参数共享。
让我们看看它在真实图像中的样子。
权重矩阵的作用类似于图像中的过滤器,从原始图像中提取特定信息。过滤器可能是为了提取边缘,或者是提取特定颜色,亦或是模糊化不需要的噪声。
权重矩阵从原始图像中提取有助于网络正确预测图像的特征。当我们有多个卷积层时,初始层提取更多的通用特征,而随着网络的深入,权重矩阵提取的特征越来越复杂,更适合特定的问题。
stride 和 padding
正如我们在上面看到的,权重矩阵在整个图像上移动,一次移动一个像素。我们可以像超参数一样定义它,关于我们希望权重矩阵如何在图像上移动。如果权重矩阵一次移动 1 个像素,stride = 1。让我们看看 stride = 2 的样子。
如您所见,随着 stride 的增加,图像的大小不断减小。用零填充输入图像解决了这个问题。如果步幅值更高,我们还可以在图像周围添加一层以上的零:
我们可以看到在用零填充图像后如何保留图像的初始形状。这被称为 same padding ,因为输出图像与输入具有相同的大小。
中间的 4*4 像素是一样的。这里我们保留了更多来自边界的信息,也保证了图像的大小不变。
多个过滤器
权重的维度深度将与输出图像的维度深度相同。因此,使用单个权重矩阵进行卷积将导致具有单个深度维度的卷积输出。在大多数情况下,我们将多个相同维度的过滤器一起应用,而不是单个过滤器(权重矩阵)。
每个过滤器的输出堆叠在一起形成卷积图像的维度深度。假设我们有一个大小为 32*32*3 的输入图像。我们应用了 10 个大小为 5*5*3 的过滤器,并带有 valid padding。输出的尺寸为 28*28*10。你可以把它想象成:
池化层(The Pooling layer)
有时,当图像太大时,我们需要减少需训练参数的数量。这时需要在后续的卷积层之间周期性地引入池化层。池化的唯一目的是减少图像的空间大小。池化是在每个深度维度上独立完成的,因此图像的深度保持不变。通常应用的最常见的池化层形式是最大池化(MaxPooling)。
这里我们将 stride 设为 2,而池化大小也设为 2。MaxPooling 操作应用于卷积输出的每个深度维度。可以看到,经过 MaxPooling 操作后,4*4的卷积输出变成了2*2。
如您所见,对复杂的图像应用了MaxPooling。MaxPooling 的图像仍然保留它是街道上的汽车的信息。如果仔细观察,图像的尺寸已经减半。这有助于在很大程度上减少需训练的参数。
类似地,也可以应用其他形式的池化,例如平均池化或 L2 范数池化。
输出维度
理解每个卷积层末尾的输入和输出维度可能会让您有点困惑。我决定用这几点来让你能够识别输出的维度。三个超参数将控制输出音量的大小。
- The number of filters - 输出的深度将等于过滤器的数量。
- Stride – 当 Stride 为 1 时,我们将横向和纵向移动一个像素。当使用更高的Stride,我们一次移动大量像素,因此产生更小的输出量。
- Zero padding——这有助于我们保持输入图像的大小。
输出层
卷积层和池化层只能从原始图像中提取特征并减少参数数量。然而,为了生成最终输出,我们需要应用一个全连接层来生成一个与我们需要的维度相等的输出。仅使用卷积层就很难达到这个数字。卷积层生成 3D 激活图,而我们只需要输出图像是否属于特定类别。输出层有一个类似于分类交叉熵的损失函数,用于计算预测误差。一旦前向传播完成,反向传播开始更新权重和偏差以减少错误和损失。
总览
- 我们将输入图像传递给第一个卷积层。卷积输出作为激活图获得。卷积层中应用的滤波器从输入图像中提取相关特征以进一步传递。
- 每个过滤器应提供不同的特征以帮助正确的类别预测。如果我们需要保留图像的大小,我们使用 same padding ,否则使用 valid padding,因为它有助于减少特征的数量。
- 添加池化层以进一步减少参数数量
- 在进行预测之前添加了几个卷积和池化层。卷积层有助于提取特征。与提取的特征更通用的浅层网络相比,随着我们在网络中深入研究,会提取出更具体的特征。
- 前面提到的 CNN 中的输出层是一个全连接层,其中来自其他层的输入被 Flatten 并发送,以便将输出转换为网络所需的形式。
- 计算损失函数的值
- 反向传播误差以更新过滤器(权重)和偏差值。
- 一个训练周期在一次向前和向后传递中完成。