卷积神经网络

点击量:200

从本文开始我将会总结Coursera-Deep Learning第四课的内容:Convolutional Neural Networks,卷积神经网络。

引言

先看下这门课的大纲,分为以下四个部分:

  • Week1: Foundations of Convolutional Neural Networks
  • Week2: Deep convolutional models: Case Studies
  • Week3: Object detection
  • Week4: Special applications: Face recognition & Neural style transfer

看了大纲之后,与其说这门课讲的是卷积神经网络,不如说是在讲深度学习在计算机视觉(Computer Vision)中的应用。因为CNN的知识并没有那么多,一周时间的讲解就足够了。而后面的三周课则会先介绍几个当下比较流行的卷积神经网络模型,比如AlexNet,VGG,ResNet等。最后两周则会介绍如何通过一些高效算法去实现目标检测(Object Detection)和人脸识别(Face Recognition)这两个最常见的计算机视觉应用。所以,这门课除了讲解卷积神经网络的基础知识外,还覆盖了很多计算机视觉领域的前沿知识,因此是很有价值的。此外,因为这节课出来的比较晚,所以在这之前我已经看过各种不同版本的文章了,网上关于卷积神经网络的介绍实在是太多了,随便一搜就有一大堆。但在我看来,很多文章把卷积神经网络解释的太复杂了(CNN本没有那么复杂)。本文的目的只是按照自己的思路把这一部分知识再梳理一遍,所以一切的前提都是以我自己的知识储备为准。因此,如果你读的云里雾里可以参考下其他文章的解释。好了,废话不多说了,下面切入正题:Week1:卷积神经网络基础(Foundations of Convolutional Neural Networks)。

什么是卷积神经网络?

卷积神经网路(Convolutional Neural Network, CNN),顾名思义,就是卷积神经网络。卷积(Convolution)指的是图像处理领域中一种图像处理算法,而后者就是我们所熟悉那个传统的神经网络。所以,本质上它还是一种前馈神经网络,只不过在结构上相比于传统的神经网络做了一些改变。具体地,它的结构如下(图片出处):

Imgur
这张图揭示了CNN的结构主要分为以下两部分:

  • 卷积层(Convolution + Pooling Layers )
  • 全连接层( Fully Connected Layers)

知道这一点对理解CNN至关重要。全连接层( Fully Connected Layers)就是一个传统的神经网络,我们已经很熟悉了,所以理解CNN的重点就在于理解卷积层。

卷积层(Convolutional Layer)

什么是图像卷积?

首先,你要知道图像在计算机中是如何被表达的?
在计算机里,数字图像是以像素的形式存在的,每个像素点都有一个灰度值(Gray Scale)或者RGB数值,它们在程序里则被表示成一个大小为\(n_h \times n_w \times n_c\)的3D矩阵。其中,\(n_h\)表示图像的高度,\(n_w\)表示图像的宽度,\(n_c\)表示的则是图像的通道数(Number of Channels);高度和宽度很好理解,那什么是通道数呢?很简单,如果是灰度图,那么它的通道数就是1,取值范围一般从0到255,白色为255,黑色为0;如果是彩色图,则通道数就是3,分别是R(red)、G(green)、B(blue)。
Imgur
讲完图像表达之后,我们开始讲讲什么是图像卷积。
所谓的图像卷积操作,指的就是通过一个滤波器(也有人称之为核或者算子),比如一个3×3的矩阵,对图像中的每一个像素点做相关运算,具体算法会有很多,最常见的是线性滤波器。它的算法是:每一次卷积都是把原图片中黄色区域的每一个元素与其相对应的滤波器中的元素相乘,然后累加。对于一个单通道的图像(黑白图片),它的运算过程如下图所示:
imgur

对于一个三通道的图像,它的卷积操作也类似:每一个通道分别做卷积,然后三通道累加。
Imgur

多核卷积

实际上,上面这些示例都是单核卷积,也就是说只有一个滤波器。然而为了提升性能,在实际操作中,我们往往会同时使用多个滤波器对图像进行卷积,也就是多核卷积。它的计算步骤如下:
Imgur
值得注意的是,每一个卷积核都是一个三维的矩阵,所以多核卷积的卷积核的大小应该是:\(f^{[l]} \times f^{[l]} \times n_c^{[l-1]} \times n_c^{[l]}\),其中,\(f^{[l]}\)表示当前层的卷积核的大小;\(n_c^{[l-1]}\)和\(n_c^{[l]}\)分别表示上一层和当前层的卷积核数量。

Padding(填充)和Stride(步长)

这两个是图像卷积中涉及到的概念,具体地,

  • Padding
    观察上面的动图我们发现,一个6×6的图像经过3×3的滤波器卷积之后得到了一个大小为4×4的卷积层,图像尺寸就变小了。那么,如何使得图像在多次卷积之后仍然保持原来的大小呢?我们可以在原图的周围再扩充一层,把原图包裹起来。这样就能保证在卷积后得到的图片尺寸不变了。一般而言这些包裹层的数值都是0,所以也称为zero-padding(零填充)。

  • Stride
    我们从上面的动图中可以发现,卷积的计算顺序是每次向右移动一格,然后再向下移动一格,如此往复。那么这里说的“一格”其实就是步长(Stride),我们可以指定这个值的大小,比如让它每一步移动两格。

介绍完这两个概念之后,我们来总结一下它们之间的关系。对于一个大小为\(n \times n\)的图片,我们采用一个大小为\(f \times f\)的卷积核,填充层的大小为\(p\),卷积步长为\(s\),那么卷积后的图像的大小为:

$$
\left \lfloor \frac{n+2p-f}{s} + 1\right \rfloor \times \left \lfloor \frac{n+2p-f}{s} + 1\right \rfloor
$$

为什么要对图像作卷积?

在数字图像处理领域,卷积的主要作用是它能够检测图像中的点,线,边缘等特征。比如,我们用下如下的卷积核可以进行多个方向的线检测(line detection):
Imgur

而从神经网络的角度来说,卷积的主要作用是特征提取。举个例子,假设你有一张图片,它可能是人或者猴子。卷积层的作用就相当于先识别出这张图片中哪些是眼睛,哪些是嘴,哪些是鼻子。然后再把这些特征输入到神经网络中去训练,再去判定这到底是个人还是个猴子。那么很明显地,这样做的效果肯定比直接训练一张图片更好。而且,更神奇的是,这些卷积核的参数并不是手动选取的,而是通过学习获得的。当输入不再是一个图片,而是这个图片的特征时,它就能很好的解决图片不变性(旋转,平移,尺寸不变形等)问题,更直观更详细的解释可以看这里

Pooling(池化层)

在卷积层之后往往还会有一个池化操作,一般是max pooling(虽然也有average-pooling)。那什么是max-pooling呢?很简单,跟卷积的操作类似,只不过具体的算法不一样。
如下图所示,我们把图像分成四个部分(用四种不同的颜色表示),那么对于每一个部分而言我们都选取其中最大的元素作为代表生成右边的图像,这就是max pooling。那么相应地,average pooling则是选取那部分元素的平均值。
Imgur
max pooling其实是一种向下采样(down sampling)或者子采样(subsampling)的方法,它选取一些最能代表那部分的元素,其余的都舍弃了,这样做的好处是不仅保留了卷积出来的特征,还能减少数据量,加速训练。

总结

到这边为止,卷积神经网络的主要内容该说的都说完,我们接下来再看一张结构图从整体上再次理解下CNN(图片出处):
Imgur
找这张图主要是想说明两点:

  • 一个卷积神经网络可以有多个卷积层,此图以LeNet-5为例,有两个卷积层
  • 在卷积之后还会运用非线性操作,一般是ReLU

总结一下,最基本的卷积神经网络的流程一般是这样的:
Input->Convolution->Nonlinear(ReLU)->Pooling(Downsampling)->FCL->Output

发表评论

电子邮件地址不会被公开。 必填项已用*标注