(4-1)卷积神经网络 | 卷积神经网络基础

目录

计算机视觉

卷积运算

Padding

卷积步长

三维卷积

单层卷积网络

简单卷积网络实例

池化层

卷积神经网络示例

使用卷积的原因


计算机视觉

计算机视觉(Computer Vision)涉及许多不同类别的问题,如图片分类、目标检测、图片风格迁移等等。

对于小尺寸的图片问题,也许我们用深度神经网络的结构可以较为简单的解决一定的问题。但是当应用在大尺寸的图片上,输入规模将变得十分庞大,难以获得足够的数据来防止神经网络发生过拟合和竞争需求,要处理包含几十亿参数的神经网络,这样巨大的内存需求让人不太能接受。

但对于计算机视觉应用来说,我们肯定不想它只处理小图片,而是希望它同时也能处理大图。因此,我们需要进行卷积计算,它是卷积神经网络中非常重要的一块。

卷积运算

卷积运算是卷积神经网络最基本的组成部分,这里以边缘检测为例来介绍卷积运算。

如下图所示,如果我们想让电脑搞清楚这张照片里有什么物体,做的第一件事可能是检测图片中的垂直边缘。在这张图片中的栏杆就对应垂直线,并且这些行人的轮廓线某种程度上也是垂线,这些线是垂直边缘检测器的输出。同样,我们可能也想检测水平边缘,图片中的栏杆就是很明显的水平线。所以我们应该如何在图像中检测这些边缘呢?

如图所示,我们以 6×6 的灰度图像为例,为了检测图像中的垂直边缘,我们可以构造一个 3×3 矩阵(也称为过滤器/卷积核),对这个 6×6 的图像进行卷积运算,卷积运算用“∗”来表示。过滤器不断地和其大小相同的部分做对应元素的乘法运算并求和,最终得到的数字相当于新图片的一个像素值,如右矩阵所示,最终得到一个 4*4 大小的图片。

补充,各种不同编程框架中卷积运算使用的函数:

  1. python:conv_forward
  2. tensorflow: tf.conv2d
  3. Keras: Conv2D
  • 边缘检测原理

以如图所示的 6×6 图像为例,它左边的一半是 10,右边一半是 0。如果把它当成一个图片,因为像素值 10 是比较亮的像素值,所以左边那部分会是白色的,相比较而言,右边像素值会比较暗。因此,图片中会有一个特别明显的垂直边缘在图像中间。当用一个 3×3 过滤器进行卷积运算后,在中间会有段亮一点的区域,对应检查到这个 6×6 图像中间的垂直边缘。

  • 边缘过渡

正边和负边的区别其实就在于是由亮到暗还是由暗到亮,也就是边缘的过渡。如下图所示,将左边较亮,右边较暗的图片进行翻转,得到左边较暗,右边较亮的图片。如果用它与相同的过滤器进行卷积,中间的过渡部分被翻转了,之前的 30 翻转成了-30,表明是由暗向亮过渡, 而不是由亮向暗过渡(30)。

  • 更多边缘检测

一个垂直边缘过滤器是一个 3×3 的区域,它的左边相对较亮,而右边相对较暗。相似的,水平边缘过滤器也是一个 3×3 的区域,它的上边相对较亮,而下方相对较暗。计算机视觉的研究者们还会使用其它的数字组合,如Sobel过滤器,它的优点在于增加了中间一行元素的权重,这使得结果的鲁棒性会更高一些;又比如 Scharr 过滤器,它有着和之前完全不同的特性,实际上也是一种垂直边缘检测,如果将其翻转 90 度,也能得到对应水平边缘检测。

    

对于复杂的图片,我们可以直接将过滤器 中的数字直接看作是需要学习的参数,并且在之后可以使用反向传播算法,让模型在数据中去学习这9个参数,将其应用于整个图片,输出其提取到的所有有用的特征。相比於单纯的水平和垂直检测器,其可以学习更好更复杂的过滤器,训练的过滤器也许可以检测出更多不同角度的边缘。

  • 卷积和互相关

在数学定义上,矩阵的卷积(convolution)操作为首先将卷积核同时在水平和垂直方向上进行翻转(如下图所示),构成一个卷积核的镜像,然后使用该镜像再和前面的矩阵进行移动相乘求和操作。

在深度学习中,我们称为的卷积运算实则没有卷积核变换为镜像的这一步操作,因为在权重学习的角度,变换是没有必要的。深度学习的卷积操作在数学上准确度来说称为互相关

Padding

从前面的内容我们可以看到,如果我们将一个 6×6 的图像用一个 3×3 的过滤器卷积,最后会得到一个 4×4 的图像。这背后的数学解释是如果我们有一个𝑛 × 𝑛的图像,用𝑓 × 𝑓的过滤器做卷积,那么输出的维度就是(𝑛 − 𝑓 + 1) × (𝑛 − 𝑓 + 1)。而这样做会有两个缺点:

  1. 每次卷积操作,图像会缩小;
  2. 边缘位置的像素进行卷积运算的次数少,会丢失图像边缘位置的许多信息。

为了解决上述的两个缺点,我们可以在卷积操作之前填充这幅图像。如图所示,我们可以沿着图像边缘再填充一层像素(习惯上用0填充),这样 6×6 的图像就被填充成了 8×8 的 图像。用p来表示填充的数量,输入n*n大小的图片,卷积后得到的图片大小为 (𝑛 + 2𝑝 − 𝑓 + 1) × (𝑛 + 2𝑝 − 𝑓 + 1),为使图片大小保持不变,需根据过滤器的大小来调整p的值。

  • Valid / Same卷积

Valid 卷积:不填充,也就是p = 0,如果𝑛 × 𝑛的图像,用一个𝑓 × 𝑓的过滤器卷积,就可得到(𝑛 − 𝑓 + 1) × (𝑛 − 𝑓 + 1)维的图像。

Same卷积:填充后输出大小和输入大小一样。如果𝑛 × 𝑛的图像,用𝑝个像素填充边缘,就可得到(𝑛 + 2𝑝 − 𝑓 + 1) × (𝑛 + 2𝑝 − 𝑓 + 1)维的图像,因为输入输出大小相同,那么𝑝 = (𝑓 − 1)/2。(注意:习惯上,计算机视觉中,𝑓通常是奇数)

卷积步长

卷积步长是构建卷积神经网络的一个基本的操作。在之前的卷积操作中,步长是为1,如图所示,我们将步长设置为2进行卷积:

s表示stride的大小,那么在进行卷积运算后,图片的变化为:

注意,在当pading不为1时,若移动的窗口落在图片外面,则不要再进行相乘的操作,丢弃边缘的数值信息,所以输出图片的最终维度为向下取整。

三维卷积

对于灰色图像中,卷积核和图像均是二维的。而应用于彩色图像中,因为图片有R、G、B三个颜色通道,所以此时的卷积核应为三维卷积核。如图所示,我们用一个3×3×3的过滤器对6x6x6的图像(第一个6 代表图像高度,第二个6代表宽度,3 代表通道数)进行卷积,可以得到一个4x4的图像。

如下图所示,如果我们将6x6x6的图像同时和两个过滤器(一个垂直边缘检测器,一个水平边缘检测器)进行卷积,就可以得到 两个不同的 4×4 的输出,然后我们将这两个输出堆叠在一起, 这样就得到了一个 4×4×2 的输出立方体,这里的 2 其实来源于我们用了两个不同的过滤器。

总结:输入一个𝑛 × 𝑛 × 𝑛𝑐 (通道数)的输入图像,用𝑓 × 𝑓 × 𝑛𝑐的过滤器(卷积核与输入图像的通道数必须相同),就可得到(𝑛 − 𝑓 + 1)× (𝑛 − 𝑓 + 1) × 𝑛𝑐′的图像(𝑛𝑐′为下一层的通道数,也就是用的过滤器个数)。

单层卷积网络

普通的神经网络单层前向传播是先由输入和权重及偏置做线性运算,然后将得到的结果输入一个激活函数中。卷积神经网络的前向传播与其类似,不同的是,卷积神经网络中的权重和输入进行的是卷积运算。

在一个卷积层中,假设我们有10个 3x3x3 大小的卷积核,再加上每个卷积核对应的一个偏置参数,那么对于一个卷积层,我们一共10 x (3x3x3+1) = 280 个参数。可以看出,无论图片大小是多少,该例子中的卷积层参数个数一直都是280个,相对于普通的神经网络,卷积神经网络的参数个数要少很多。

卷积层的各种标记总结(以𝑙层为例):

简单卷积网络实例

如图所示为卷积神经网络的一个典型范例,在设计卷积神经网络时,确定超参数会比较费工夫,要决定过滤器的大小、步幅、padding 以及使用多少个过滤器。一般来说,开始时的图像会更大一些,随着神经网络计算深度不断加深,高度和宽度会逐渐减小,而通道数量会逐渐增加。

一个典型的卷积神经网络通常有三层:卷积层( CONV)、池化层(POOL)和全连接层(FC)。虽然仅用卷积层也有可能构建出很好的神经网络,但大部分神经网络架构师依然会添加池化层和全连接层,并且池化层和全连接层比卷积层更容易设计。

池化层

除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。

  • Max pooling

最大池化功能就是只要在任何一个象限内提取到某个特征,它都会保留在最大化的池化输出里。也就是说,如果在过滤器中提取到某个特征,那么保留其最大值。值得注意的一点是,一旦确定了𝑓和𝑠,最大池化就是一个固定运算,梯度下降无需改变任何值。如下图所示为二维输入的最大池化,如果输入是三维的,那么输出也是三维的,也就是说池化操作不改变通道数。

  • Average pooling

平均池化与最大池化唯一不同的是其选取的是小区域内的均值来代表该区域内的值,这种方法并不常用。

总结:池化的超级参数包括过滤器大小𝑓和步幅𝑠,常用的参数值为𝑓 = 2,𝑠 = 2, 应用频率非常高,其效果相当于高度和宽度缩减一半。最大池化时,往往很少用到超参数 padding。需要注意的一点是,池化过程中没有需要学习的参数,只有这些设置过的超参数,可能是手动设置的,也可能是通过交叉验证设置的。

卷积神经网络示例

假设32×32×3 的 RGB 图片中含有某个数字,我们想构建一个神经网络来识别这个数字是 0-9 中的哪一个,如下图所示。在卷积神经网络文献中,卷积有两种分类,一类卷积是一个卷积层和一个池化层一起作为一层,另一类是把卷积层作为一层,而池化层单独作为一层。这里,我们把 CONV1 和 POOL1 共同作为一个卷积,并标记为 Layer1。 两次卷积后输出的5×5×16 矩阵包含 400 个元素,将POOL2平整化为一个大小为 400 的一维向量,将平整化结果想象成这样的一个神经元集合,然后利用这 400 个单元构建下一层,下 一层含有 120 个单元,这 400 个单元与 120 个单元紧密相连,最后输出 120 个维度,这就是第一个全连接层,标记为 FC3。然后对这个 120 个单元再添加一个全连接层,这层更小,假设它含有 84 个单元, 标记为 FC4。最后,用这 84 个单元填充一个 softmax 单元(输出层使用softmax激活函数) ,softmax 就会有 10 个输出(识别0-9 这10 个数字)。 

根据下表可以看出,第一,随着神经网络深度的加深,提取的特征图片的高度𝑛𝐻 和宽度𝑛𝑊 通常都会减少,但同时通道数量应随之增加;第二,在卷积神经网络的参数中,卷积层仅有少量的参数,且逐渐减少,池化层没有参数,但全连接层存在大量的参数;第三,随着神经网络的加深,激活值尺寸会逐渐变小。

使用卷积的原因

与普通的全连接神经网络相比,卷积神经网络的参数更少,主要原因有两个:

  • 参数共享:一个特征检测器(filter)对图片的一部分有用的同时也有可能对图片的另外一部分有用;
  • 连接的稀疏性:在每一层中,每个输出值只取决于少量的输入。

神经网络可以通过上述两种机制减少参数,以便我们用更小的训练集来训练它,从而预防过度拟合。另外,卷积神经网络善于捕捉平移不变,神经网络的卷积结构使得即使移动几个像素, 这张图片依然具有非常相似的特征,我们用同一个过滤器生成各层中图片的所有像素值,希望网络通过自动学习变得更加健壮,以便更好地取得所期望的平移不变属性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章