Coursera吴恩达《卷积神经网络》课程笔记(1)-- 卷积神经网络基础

红色石头的我的网站:redstonewill.compython

《Convolutional Neural Networks》是Andrw Ng深度学习专项课程中的第四门课。这门课主要介绍卷积神经网络(CNN)的基本概念、模型和具体应用。该门课共有4周课时,因此我将分红4次笔记来总结,这是第一节笔记。web

1. Computer Vision

机器视觉(Computer Vision)是深度学习应用的主要方向之一。通常的CV问题包括如下三类:算法

  • Image Classification网络

  • Object detection机器学习

  • Neural Style Transferide

下图展现了一个神经风格转换(Neural Style Transfer)的例子:svg

这里写图片描述

使用传统神经网络处理机器视觉的一个主要问题是输入层维度很大。例如一张64x64x3的图片,神经网络输入层的维度为12288。若是图片尺寸较大,例如一张1000x1000x3的图片,神经网络输入层的维度将达到3百万,使得网络权重W很是庞大。这样会形成两个后果,一是神经网络结构复杂,数据量相对不够,容易出现过拟合;二是所需内存、计算量较大。解决这一问题的方法就是使用卷积神经网络(CNN)。函数

2. Edge Detection Example

对于CV问题,咱们在以前的笔记中介绍过,神经网络由浅层到深层,分别能够检测出图片的边缘特征 、局部特征(例如眼睛、鼻子等)、总体面部轮廓。性能

这里写图片描述

这一小节咱们将介绍如何检测图片的边缘。学习

最常检测的图片边缘有两类:一是垂直边缘(vertical edges),二是水平边缘(horizontal edges)。

这里写图片描述

图片的边缘检测能够经过与相应滤波器进行卷积来实现。以垂直边缘检测为例,原始图片尺寸为6x6,滤波器filter尺寸为3x3,卷积后的图片尺寸为4x4,获得结果以下:

这里写图片描述

上图只显示了卷积后的第一个值和最后一个值。

顺便提一下, 表示卷积操做。python中,卷积用conv_forward()表示;tensorflow中,卷积用tf.nn.conv2d()表示;keras中,卷积用Conv2D()表示。

Vertical edge detection可以检测图片的垂直方向边缘。下图对应一个垂直边缘检测的例子:

这里写图片描述

3. More Edge Detection

图片边缘有两种渐变方式,一种是由明变暗,另外一种是由暗变明。以垂直边缘检测为例,下图展现了两种方式的区别。实际应用中,这两种渐变方式并不影响边缘检测结果,能够对输出图片取绝对值操做,获得一样的结果。

这里写图片描述

垂直边缘检测和水平边缘检测的滤波器算子以下所示:

这里写图片描述

下图展现一个水平边缘检测的例子:

这里写图片描述

除了上面提到的这种简单的Vertical、Horizontal滤波器以外,还有其它经常使用的filters,例如Sobel filter和Scharr filter。这两种滤波器的特色是增长图片中心区域的权重。

这里写图片描述

上图展现的是垂直边缘检测算子,水平边缘检测算子只需将上图顺时针翻转90度便可。

在深度学习中,若是咱们想检测图片的各类边缘特征,而不只限于垂直边缘和水平边缘,那么filter的数值通常须要经过模型训练获得,相似于标准神经网络中的权重W同样由梯度降低算法反复迭代求得。CNN的主要目的就是计算出这些filter的数值。肯定获得了这些filter后,CNN浅层网络也就实现了对图片全部边缘特征的检测。

4. Padding

按照咱们上面讲的图片卷积,若是原始图片尺寸为n x n,filter尺寸为f x f,则卷积后的图片尺寸为(n-f+1) x (n-f+1),注意f通常为奇数。这样会带来两个问题:

  • 卷积运算后,输出图片尺寸缩小

  • 原始图片边缘信息对输出贡献得少,输出图片丢失边缘信息

为了解决图片缩小的问题,可使用padding方法,即把原始图片尺寸进行扩展,扩展区域补零,用p来表示每一个方向扩展的宽度。

这里写图片描述

通过padding以后,原始图片尺寸为(n+2p) x (n+2p),filter尺寸为f x f,则卷积后的图片尺寸为(n+2p-f+1) x (n+2p-f+1)。若要保证卷积先后图片尺寸不变,则p应知足:

p = f 1 2

没有padding操做, p = 0 ,咱们称之为“Valid convolutions”;有padding操做, p = f 1 2 ,咱们称之为“Same convolutions”。

5. Strided Convolutions

Stride表示filter在原图片中水平方向和垂直方向每次的步进长度。以前咱们默认stride=1。若stride=2,则表示filter每次步进长度为2,即隔一点移动一次。

这里写图片描述

咱们用s表示stride长度,p表示padding长度,若是原始图片尺寸为n x n,filter尺寸为f x f,则卷积后的图片尺寸为:

n + 2 p f s + 1   X   n + 2 p f s + 1

上式中, 表示向下取整。

值得一提的是,相关系数(cross-correlations)与卷积(convolutions)之间是有区别的。实际上,真正的卷积运算会先将filter绕其中心旋转180度,而后再将旋转后的filter在原始图片上进行滑动计算。filter旋转以下所示:

这里写图片描述

比较而言,相关系数的计算过程则不会对filter进行旋转,而是直接在原始图片上进行滑动计算。

其实,目前为止咱们介绍的CNN卷积实际上计算的是相关系数,而不是数学意义上的卷积。可是,为了简化计算,咱们通常把CNN中的这种“相关系数”就称做卷积运算。之因此能够这么等效,是由于滤波器算子通常是水平或垂直对称的,180度旋转影响不大;并且最终滤波器算子须要经过CNN网络梯度降低算法计算获得,旋转部分能够看做是包含在CNN模型算法中。总的来讲,忽略旋转运算能够大大提升CNN网络运算速度,并且不影响模型性能。

卷积运算服从结合律:

( A B ) C = A ( B C )

6. Convolutions Over Volume

对于3通道的RGB图片,其对应的滤波器算子一样也是3通道的。例如一个图片是6 x 6 x 3,分别表示图片的高度(height)、宽度(weight)和通道(#channel)。

3通道图片的卷积运算与单通道图片的卷积运算基本一致。过程是将每一个单通道(R,G,B)与对应的filter进行卷积运算求和,而后再将3通道的和相加,获得输出图片的一个像素值。

这里写图片描述

不一样通道的滤波算子能够不相同。例如R通道filter实现垂直边缘检测,G和B通道不进行边缘检测,所有置零,或者将R,G,B三通道filter所有设置为水平边缘检测。

为了进行多个卷积运算,实现更多边缘检测,能够增长更多的滤波器组。例如设置第一个滤波器组实现垂直边缘检测,第二个滤波器组实现水平边缘检测。这样,不一样滤波器组卷积获得不一样的输出,个数由滤波器组决定。

这里写图片描述

若输入图片的尺寸为n x n x n c ,filter尺寸为f x f x n c ,则卷积后的图片尺寸为(n-f+1) x (n-f+1) x n c 。其中, n c 为图片通道数目, n c 为滤波器组个数。

7. One Layer of a Convolutional Network

卷积神经网络的单层结构以下所示:

这里写图片描述

相比以前的卷积过程,CNN的单层结构多了激活函数ReLU和偏移量b。整个过程与标准的神经网络单层结构很是相似:

Z [ l ] = W [ l ] A [ l 1 ] + b

A [ l ] = g [ l ] ( Z [ l ] )

卷积运算对应着上式中的乘积运算,滤波器组数值对应着权重 W [ l ] ,所选的激活函数为ReLU。

咱们来计算一下上图中参数的数目:每一个滤波器组有3x3x3=27个参数,还有1个偏移量b,则每一个滤波器组有27+1=28个参数,两个滤波器组总共包含28x2=56个参数。咱们发现,选定滤波器组后,参数数目与输入图片尺寸无关。因此,就不存在因为图片尺寸过大,形成参数过多的状况。例如一张1000x1000x3的图片,标准神经网络输入层的维度将达到3百万,而在CNN中,参数数目只由滤波器组决定,数目相对来讲要少得多,这是CNN的优点之一。

最后,咱们总结一下CNN单层结构的全部标记符号,设层数为 l

  • f [ l ] = filter size

  • p [ l ] = padding

  • s [ l ] = stride

  • n c [ l ] = number of filters

输入维度为: n H [ l 1 ] x n W [ l 1 ] x n c [ l 1 ]

每一个滤波器组维度为: f [ l ] x f [ l ] x n c [ l 1 ]

权重维度为: f [ l ] x f [ l ] x n c [ l 1 ] x n c [ l ]

偏置维度为:1 x 1 x 1 x n c [ l ]

输出维度为: n H [ l ] x n W [ l ] x n c [ l ]

其中,

n H [ l ] = n H [ l 1 ] + 2 p [ l ] f [ l ] s [ l ] + 1

n W [ l ] = n W [ l 1 ] + 2 p [ l ] f [ l ] s [ l ] + 1

若是有m个样本,进行向量化运算,相应的输出维度为:m x n H [ l ] x n W [ l ] x n c [ l ]

8. Simple Convolutional Network Example

下面介绍一个简单的CNN网络模型:

这里写图片描述

该CNN模型各层结构如上图所示。须要注意的是, a [ 3 ] 的维度是7 x 7 x 40,将 a [ 3 ] 排列成1列,维度为1960 x 1,而后链接最后一级输出层。输出层能够是一个神经元,即二元分类(logistic);也能够是多个神经元,即多元分类(softmax)。最后获得预测输出 y ^

值得一提的是,随着CNN层数增长, n H [ l ] n W [ l ] 通常逐渐减少,而 n c [ l ] 通常逐渐增大。

CNN有三种类型的layer:

  • Convolution层(CONV)

  • Pooling层(POOL)

  • Fully connected层(FC)

CONV最为常见也最重要,关于POOL和FC咱们以后再介绍。

9. Pooling Layers

Pooling layers是CNN中用来减少尺寸,提升运算速度的,一样能减少noise影响,让各特征更具备健壮性。

Pooling layers的作法比convolution layers简单许多,没有卷积运算,仅仅是在滤波器算子滑动区域内取最大值,即max pooling,这是最经常使用的作法。注意,超参数p不多在pooling layers中使用。

这里写图片描述

Max pooling的好处是只保留区域内的最大值(特征),忽略其它值,下降noise影响,提升模型健壮性。并且,max pooling须要的超参数仅为滤波器尺寸f和滤波器步进长度s,没有其余参数须要模型训练获得,计算量很小。

若是是多个通道,那么就每一个通道单独进行max pooling操做。

除了max pooling以外,还有一种作法:average pooling。顾名思义,average pooling就是在滤波器算子滑动区域计算平均值。

这里写图片描述

实际应用中,max pooling比average pooling更为经常使用。

10. CNN Example

下面介绍一个简单的数字识别的CNN例子:

这里写图片描述

图中,CON层后面紧接一个POOL层,CONV1和POOL1构成第一层,CONV2和POOL2构成第二层。特别注意的是FC3和FC4为全链接层FC,它跟标准的神经网络结构一致。最后的输出层(softmax)由10个神经元构成。

整个网络各层的尺寸和参数以下表格所示:

这里写图片描述

11. Why Convolutions

相比标准神经网络,CNN的优点之一就是参数数目要少得多。参数数目少的缘由有两个:

  • 参数共享:一个特征检测器(例如垂直边缘检测)对图片某块区域有用,同时也可能做用在图片其它区域。

  • 链接的稀疏性:由于滤波器算子尺寸限制,每一层的每一个输出只与输入部分区域内有关。

除此以外,因为CNN参数数目较小,所需的训练样本就相对较少,从而必定程度上不容易发生过拟合现象。并且,CNN比较擅长捕捉区域位置偏移。也就是说CNN进行物体检测时,不太受物体所处图片位置的影响,增长检测的准确性和系统的健壮性。

更多AI资源请关注公众号:红色石头的机器学习之路(ID:redstonewill)
这里写图片描述