吴恩达《卷积神经网络》(第一周下半部分)

卷积神经网络(第一周下半部分)


1.7 单层卷积网络


那么如何构建卷积神经网络的卷积层,下面来看一个例子,上部分已经讲过如何通过两个过滤器卷积处理一个三维图像,并输出两个不同的4 * 4 的矩阵,假设使用第一个过滤器进行卷积得到第一个4 * 4 的矩阵,使用第二个过滤器进行卷积得到另外一个4 * 4 的矩阵,最终各自形成一个卷积神经网络层,然后增加偏差(一个实数b1),通过python的广播机制,给这16个元素都加上同一偏差,然后应用非线性函数(这里指激活函数一般是ReLU),此时输出一个4 * 4 的矩阵。对于第二个4 * 4 的矩阵,我们加上不同的偏差,它也是一个实数b2,16个数字都加上同一个实数,然后应用非线性函数(激活函数),最终得到另一个4 * 4 的矩阵,此时再把两个输出的矩阵堆叠起来,最终得到一个 4 * 4 * 2的矩阵。

我们通过计算,从一个6 * 6 * 3 的输入推导出一个4 * 4 * 2 的输出,它是卷积神经网络的一层,若把它映射到标准神经网络中四个卷积层中的某一层,或者非卷积神经网络中。我们知道前向传播其中一个操作就是Z[1] = W[1]*a[0] + b[1](这里的a[0]其实就是X),再执行非线性函数得到a[1]即a[1] = g(z[1]),那么在这个例子中,我们就将这些过滤器用变量W[1]表示,在卷积过程中,我们对这27个数进行操作,其实是27 * 2,因为我们用了两个过滤器,我们取这些数做乘法,实际上执行了一个线性函数得到一个4 * 4 的矩阵,它的作用类似是我们做的线性运算W[1]a[0],然后加上一个偏差b其实就是我们之前所说的Z值,这一部分就是应用激活函数ReLU之前的值,在这之后就是将Z值传进激活函数中得到的这个最后的堆叠之后的4 * 4 * 2 矩阵,这就是神经网络的下一层,也就是激活层。整个上面的过程是从a[0]到a[1]的演变过程。
吴恩达《卷积神经网络》(第一周下半部分)_第1张图片
首先执行线性函数,所有元素相乘做卷积,再加上偏差,然后应用激活函数ReLU通过神经网络的一层,把一个6 * 6 * 3 的维度a[0]演化为一个4 * 4 * 2 的维度a[1],这就是神经网路的一层。

示例中我们有两个过滤器,也就是有两个特征,因此我们最终才得到一个4 * 4 * 2的输出。为了加深印象,下面做一个练习,假设你有10个过滤器,而不是2个,神经网络的一层是3 * 3 *3 ,那么这一层有多少个参数呢?
吴恩达《卷积神经网络》(第一周下半部分)_第2张图片
每层都是一个3 * 3 *3 的图像,因此每个过滤器有27个参数,也就是27个数,然后加上一个偏差,用参数b表示,(此时参数个数为28),现在有10个过滤器,加在一起也就是28 * 10 = 280 个参数,注意一点,不论输入的图片有多大,1000 * 1000也好, 5000 * 5000也好,参数始终都是280个,即使图片很大,参数却很少,这就是卷积神经网络的一个特点,叫做“避免过拟合”,用这10个过滤器来提取特征,如垂直边缘,水平边缘和其他特征。 你已经知道如何提取10个特征,可以应用到大图片中,而参数数量固定不变,此例中只有28个相对较少。
最后我们总结一下用于描述卷积神经网络中的一层,也就是卷积层的各种标记,这一层(目前假设第l层)是卷积层:
用f[l]表示过滤器大小,过滤器的大小用f * f 表示
上标[l]表示l层中过滤器大小为f * f ,通常情况下,上标[l]用来标记l层
p[l]标记padding的数量,padding数量可以指定为一个有效卷积,即无padding,或是同一个卷积选定padding值
s[l]标示步幅
输入值(input)中n的上标[l - 1]表示的是输入值为上一层的激活值
输出值(output)中上标即为[l],输出图像中的通道数就是神经网络中这一层所使用的过滤器的数量
那么如何确定过滤器的大小呢?
它等于f[l] * f[l] * x,这个x怎么得到,我们知道卷积一个6 * 6 * 3 的图片需要一个3 * 3 * 3的过滤器,因此过滤器中的通道数量必须与输入中通道的数量一致。
因此输出通道数量就是输入通道数量,所以过滤器的大小为:f[l] * f[l] * n_c[l -1]
应用偏差和非线性函数(激活函数)之后,这一层的输出等于它的激活值a[l]
a[l]是一个三维体,即n[l] * n[l] * n_c[l],当执行批量梯度下降或者小批量梯度下降时,如果有m个例子,就是有m个激活值的集合,那么输出A[l]等于M * n[l] * n[l] * n_c[l],如果采用批量下降,变量的排列顺序如上。

吴恩达《卷积神经网络》(第一周下半部分)_第3张图片
最后该如何确定权重参数W呢?过滤器的维度已知它等于 f[l] * f[l] *n_c[l -1],这只是一个过滤器的维度,有多少个过滤器呢?权重也就是所有过滤器的集合再乘以过滤器的总数量。
最后就是偏差:每一个过滤器都有一个偏差参数,也就是一个实数
以上就是最常用的卷积符号。


1.8 简单卷积网络示例


下面是一个深度神经网络的具体实例,练习一下上面提到的标记方法。
假设有一张图片,你想做图片分类或图片识别。把这张图片输入定义为X,然后辨别图片中有没有猫,用0 或1表示,这样看来这是一个分类问题。我们来构建适用于这项任务的卷积网络。针对这个示例,我用了一张比较小的图片,大小是39 * 39 * 3这样设定可以使其中一些数字效果更好,高度与宽度都等于39,通道数量是3(这是输入图片记为第0层)。假设第一层我们用一个3 *3 的数据来提取特征,那么f[1] = 3,因为过滤器是3 * 3的矩阵,让s[1] = 1 p[1] = 0,如果有10个过滤器神经网络下一层的激活值大小为37 * 37 * 10(这里是10因为我们用了10个过滤器),37是公式((n + 2p - f)/ s) + 1 的计算结果,它是一个有效卷积,这是输出结果的大小。所以第一层的维度大小为37 * 37 * 10。假设你还有另外一层,这次我们采用的过滤器是5 * 5 的矩阵,在标记法中,神经网络下一层的f等于5即f[2] = 5,步幅为2即s[2] = 2 p[2] = 0,其输出结果会是一张新图像,那么这次的输出结果是17 * 17 * 20,这次由于步幅是2,维度缩小的很快,大小从37 * 37减少到17 * 17减少了一半还多,过滤器是20个,所以通道数量也是20, a[2]表示激活值的维度。同样的方法构建最后一个卷积层,假设过滤器还是5 * 5,用了40个过滤器,步幅s[2] = 2 padding[2] = 0,最后的输出为7 *7 * 40。

吴恩达《卷积神经网络》(第一周下半部分)_第4张图片

以上便是这张39 * 39 * 3 的输入图像就处理完毕了,为图片提取了7 * 7 * 40个特征,计算出来就是1960个特征,然后对该卷积层进行处理,可以将其平滑或展开成1960个单元,平滑处理后输出一个向量,其填充内容是logistic回归单元还是softmax回归单元,完全取决于我们是想识别图片上有没有猫,还是想识别K种不同对象中的一种,用y^表示最终神经网络的预测输出,明确一点,最后这一步是处理所有数字(即全部1960个数字把它们展开成一个很长的向量)为了预测最终的输出结果,我们把这个长向量填充到softmax回归函数中,这是神经网络的一个典型范例。
设计神经网络时,确定这些超级参数比较费工夫,要决定过滤器的大小 步幅padding ,以及使用多少个过滤器,在以后会针对选择参数的问题提供讲解。
而这节的主要掌握点是,随着神经网络计算深度的不断加深,通常开始的图像也要更大一些,初始值是39 * 39,随着网络深度的加深而逐渐减小,从39到37到17再到7,而通道数量在增加从3到10到20再到40,在许多其他卷积神经网络中,你也可以看到这种趋势。
吴恩达《卷积神经网络》(第一周下半部分)_第5张图片
一个典型的卷积网络通常有三层:卷积层(Conv) 池化曾(PooL)全链接层(FC)
虽然仅用卷积层也有可能构建出很好的神经网络,但大部分架构师还是会添加池化层与全链接层,不过池化层与全链接层比卷积层更好设计。


1.9 池化层


除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,我们来看一看,先举一个池化层的例子,再讨论池化层的必要性。假如输入的是一个4 * 4的矩阵,用到的池化类型是最大池化,执行最大池化的输出是一个2 * 2的矩阵,执行过程就是讲输入图分成4大区域,在各个区域中取得最大值元素到对应的2 * 2的矩阵中。

吴恩达《卷积神经网络》(第一周下半部分)_第6张图片
为了计算出右侧这4个元素值,我们需要对输入矩阵做最大值运算,这就像是应用了一个规模为2的过滤器,因为我们选用的是2 *2区域,步幅是2(这就是最大池化的超级参数),这是对最大池化功能的直观理解。你可以把这个4 * 4输入看作是某些特征的集合,数字大意味着可能提取了某些特定特征。左上象限(最大元素值为9)具有这个特征,实际处理中它可能是一个垂直边缘、一只眼睛或是大家害怕遇到的CAP特征,显然左上象限中存在这个特征,这个特征可能是一个猫眼检测器,右上象限并不存在这个特征,最大化操作的功能就是只要在任何一个象限内提取到某个特征,它都会保留在最大池化的输出里,最大化运算的实际作用是如果在过滤器中提取到某个特征,那么保留其最大值,如果没有提取到这个特征,可能在右上象限中不存在这个特征,那么其中的最大值也还是很小,这就是最大池化的直观理解。必须承认,人们使用最大池化的主要原因是在很多实验中效果都很好。最大池化还有一个特点是,它的一组超级参数,但是并没有超级参数需要学习。实际上,梯度下降没什么可学的,一旦确定了f和s,它就是一个固定运算,梯度下降无需改变任何值。

我们看下有若干个超级参数的例子,输入是一个5 * 5的矩阵,我们采用最大池化法,它的过滤器参数为3 * 3即f = 3 步幅s = 1输出矩阵是3 * 3。之前讲的计算卷积层输出大小的公式同样适用于最大池化,由此可以得到输出的矩阵大小,此例是计算3 * 3输出的每个元素,这是一个3 * 3区域,因为有3个过滤器。第一个左上象限取得的最大值是9,然后向右移动一个元素,因为步幅是1。依次移动最后结果如下:
超级参数f = 3,步幅s = 1
吴恩达《卷积神经网络》(第一周下半部分)_第7张图片
以上是二维的,如果输入图像是三维的,那么输出也是三维的。比如若输入是5 * 5 *2的,那么输出便是3 * 3 * 2的。也就是第二个通道做相同的最大池化操作。
还有另外一种就是平均池化,选取的不是最大值而是平均值。下面例子中的超级参数是f = 2 ,s = 2也可以选取其他超级参数,目前来说最大池化比平均池化更常用。但也有例外就是深度很深的神经网络,可以用平均池化来分解规模为7 * 7 * 1000的网络表示层,在整个空间内求平均值得到1 * 1 * 1000。
吴恩达《卷积神经网络》(第一周下半部分)_第8张图片
总结一下,池化的超级参数包括过滤器大小 f 和步幅 s ,常用的参数值为 f = 2,s = 2,应用频率非常高,其效果相当于表示层的高度和宽度缩减一半,也有使用 f = 3, s= 2的情况,至于其他的超级参数就要看用的是最大池化还是平均池化了,也可以根据意愿增加表示padding的其他超级参数,最大池化时,往往很少用到超级参数padding,需要注意一点是,最大池化过程中,没有需要学习的超级参数。执行反向传播时,反向传播没有参数适用于最大池化,只有上面说的设置过的超级参数,可以是手动设置,也可以是通过交叉验证设置的,最大池化只是计算神经网络某一层的静态属性,没什么参数需要学习的,它只是一个静态属性。

吴恩达《卷积神经网络》(第一周下半部分)_第9张图片


1.10 卷积神经网络示例


构造全卷积神经网络的构造模块已经掌握的差不多,下面是一个例子,假设有一张大小为32 * 32 *3的输入图片,这是一张RGB模式的图片,想做的是手写数字识别,32 * 32的RGB图片中含有某个数字,比如7,你想识别它是从0 - 9 这10个数字中的哪一个,我们构建神经网络来实现这个功能,下面用的这个网络模型和经典网络LeNet-5非常相似(并不是),灵感也来源于此。许多参数选择都与LeNet-5相似。
输入的是一个32 * 32 * 3的图像,假设第一层使用的过滤器大小为5 * 5,步幅为1,padding = 0,过滤器的个数是6,那么输出为28 * 28 * 6,将这层标记为CONV1,它用了6个过滤器,增加了偏差,应用了非线性函数可能是ReLu非线性函数,最后输出CONV1的结果,然后构建一个池化层,这里我选用最大池化参数 f = 2 s = 2 padding = 0,现在开始构建池化层,最大池化使用的过滤器为2 * 2,步幅为2,表示层的高度和宽度会减少一半,因此28 * 28变成了14 * 14,信道数保持不变,所以最终输出为14 * 14 * 6,将该输出标记为POOL1。

吴恩达《卷积神经网络》(第一周下半部分)_第10张图片

人们发现在卷积网络文献中,卷积有两种分类,这与所谓层的划分存在一致性。一类卷积是一个卷积层和一个池化层一起做为一层这就是神经网络的Layer1。另一类卷积是把卷积层做为一层,而池化层单独做为一层。其实人们在神经网络有多少层时通常统计具有权重和参数的层,因为池化层没有权重和参数,只有一些超级参数,这里我们把CONV1和POOL1共同做为一个卷积,并标记为Layer1。

虽然你在阅读网络文章或研究报告时,可能会看到卷积层和池化层各位一层的情况,这只是两种不同的标记术语,一般我在统计网络层数时,只计算具有权重的层,也就是把CONV1和POOL1作为Layer1,POOL1也被划分在Layer1中,因为它没有权重,得到的输出是14 * 14 * 6,这时我们再为它构建一个卷积层,过滤器大小为5 * 5,步幅为1,这次我们用10个过滤器,最后输出一个10 * 10 * 10的矩阵,标记为CONV2。然后接着做一个最大池化,超级参数 f = 2,s = 2,你大概可以猜出结果,高度和宽度会减半,最后输出为5 * 5 * 10, 标记为POOL2,这些就是神经网络的第二个卷积层即Layer2。

吴恩达《卷积神经网络》(第一周下半部分)_第11张图片

如果对Layer1(POOL1之后的输出14 * 14 * 6)的输出(当做输入进入另一个卷积层)应用另一个卷积层,过滤器为5 * 5,即 f = 5,步幅是1,padding = 0,过滤器是16个,此时CONV2的输出为10 * 10 * 16,此时再继续执行最大池化计算参数 f = 2 , s = 2,这时对10 * 10 * 16的输入执行最大池化计算,参数 f = 2 , s = 2高度和宽度减半结果为 5 * 5 * 16,信道数量和之前一样,标记为POOL2,这是一个卷积即Layer2。
吴恩达《卷积神经网络》(第一周下半部分)_第12张图片

5 * 5 * 16的矩阵包含400个元素,现在将POOL2平整化为一个大小为400的一维向量,我们可以把平整化结果想象成像这样一个神经元集合,然后利用这400个单元构建下一层,下一层含有120个单元这就是我们第一个全链接层标记为FC3,这400个单元与120个单元紧密相连,这就是全链接层(它很像我们在第一和第二套课程中讲过的单神经网络层),这是一个标准的神经网络它在120 * 400的维度上具有一个权重矩阵W[3],这就是所谓的全链接,因为这400个单元与这120个单元中的每一个相连接,还有一个偏差参数,最后输出120个维度,因为有120个输出。然后我们对这120个单元再添加一个全连接层,这层更小假设它含有84个单元标记为FC4最后用这84个单元填充一个softmax单元,如果我们想通过手写数字识别来识别手写的0 - 9这10个数字,这个softmax就会有10个输出。此例中的卷积神经网络很典型。

看上去它有很多超级参数,关于如何选定这些参数,后面会提供建议,常规做法是尽量不要自己设定这些超级参数,而是查看文献中别人采用了哪些超级参数,选一个在别人任务中效果很好的架构,那么它有可能适用于你自己的应用程序(下周讲)。

随着网络层数的增加,高度和宽度会逐渐减少,而信道数量会增加,从3 到 6 到16不断增加,然后得到一个全链接层。
在神经网络中,另一种常见的模式就是一个或多个卷积层后面跟随一个池化层然后是几个全链接层最后一个是softmax。
吴恩达《卷积神经网络》(第一周下半部分)_第13张图片

下面来说说神经网络的激活值形状、激活值大小、参数数量。输入为32 * 32 * 3,这些数做乘法结果为3072,激活值a[0]有3072维激活矩阵为32 * 32 * 3,计算其他层的时候,试着自己算出激活值,这些都是网络中不同层的激活值形状和激活值大小,有几点要注意:
一、池化层和最大池化层没有参数
二、卷积层的参数相对较少
其实许多参数都存在于神经网络的全连接层,随着神经网络的加深,激活值会逐渐变小,如果激活值下降太快,也会影响网络性能,示例中激活值在第一层是6000,然后减少到1600慢慢减少到84,最后输出softmax结果。


1.11为什么使用卷积?


第一周的最后一节课,来分析一下卷积在神经网络中如此受用的原因,然后对如何整合这些卷积,如何通过一个标注过的训练集训练卷积神经网络做个简单的概括,和只用全链接层相比,卷积层的两个主要优势在于参数共享和稀疏连接,举例说明一下假设有一张32 * 32 *3 的维度图片,这是上节课的示例假设用了6个大小为5 * 5 的过滤器,输出的维度为28 * 28 * 6。32 * 32 *3 = 3072,28 * 28 * 6 = 4704,我们构建一个神经网络,其中一层含有3072个单元,下一层含有4074个单元,两层中的每个神经元彼此相连然后计算权重矩阵,它等于3072 * 4704约等于1400万,所以要训练的参数很多。虽然以现在的技术,我们可以用1400多万个参数来训练网络,因为这张32 * 32 * 3 的图片非常小,训练这么多参数没有问题。但如果这是一张1000 * 1000的图片,权重矩阵就会变得非常大。下面我们看看这个卷积层的参数数量,每个过滤器都是5 * 5,一个过滤器有25个参数,再加上偏差参数。那么每个过滤器就有26个参数,一共有6个过滤器所以参数共计156个,参数数量还是很少的。

吴恩达《卷积神经网络》(第一周下半部分)_第14张图片

卷积网络映射这么少参数有两个原因:
一、参数共享
(观察发现特征检测如垂直边缘检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域,也就是说,如果你用一个3 * 3的过滤器检测垂直边缘,那么图片的左上角区域以及旁边的各个区域都可以使用这个3 * 3的过滤器每个特征检测器以及输出都可以在输入图片的不同区域中使用同样的参数以便提取垂直边缘或其他特征,它不仅适用于边缘特征这样的低阶特征同样适用于高阶特征例如提取脸上的眼睛,猫或者其他特征对象。即使减少参数个数,这9个参数也同样能计算出16个输出,直观感觉是一个特征检测器如垂直边缘检测器用于检测图片左上角区域的特征,这个特征很可能也适用于图片的右下角区域,因此在计算图片的左上和右下角区域时,你不需要添加其他特征检测器)
二、稀疏连接
假如有一个这样的数据集,其左上角和右下角可能有不同分布,也可能稍有不同,但是很相似整张图片共享特征检测器,提取效果也好。卷积网络减少参数的第二种方法是使用稀疏连接(解释一下,这个0(图中绿色圈圈画的)是通过3 * 3的卷积计算得到的它只依赖于这个3 * 3的输入单元格。)右边这个输出单元仅与36个输入特征中的9个相连接,而且其他像素值不会对输出产生任何影响,这就是稀疏连接的概念。
再看30(图中红色圈圈画的)这个输出仅仅依赖于这9个特征(左边输入图像红色区域),看上去只有这9个输入特征与输出相连接,其他像素对输出没有任何影响。

神经网络可以通过这两种机制减少参数以便我们用更小的训练集来训练它,从而预防过度拟合。

吴恩达《卷积神经网络》(第一周下半部分)_第15张图片卷积神经网络善于捕捉平移不变,通过观察发现向右移动两个像素,图片中的猫依然清晰可见,因为神经网络的卷积结构,即使移动几个像素,这张图片依然具有非常相似的特征,应该属于同样的输出标记。实际上,我们用同一个过滤器生成各层中,图片的所有像素值希望网络通过自动学习变得更加健壮,以便更好地取得所期望的平移不变属性,这就是卷积或卷积网络在计算机视觉任务中表现良好的原因。

最后,我们把这些层整合起来,看看如何训练这些网络。比如我们构建一个猫咪检测器我们有下面这个标记训练集 x 表示一张图片,y^是二进制标记或某个重要标记,我们选定了一个卷积神经网络,输入图片增加卷积层和池化层,然后添加全链接层,最后输出softmax即 y^。卷积层和全连接层有不同的参数w和偏差b,我们可以用任何参数集合来定义代价函数(损失函数),并随机初始化其参数w和b,CostJ等于神经网络对整个训练集的预测的损失总和再除以m,所以训练神经网络,要做的就是使用梯度下降法或者其他算法,例如含冲量的梯度下降含RMSProp或其它因子的梯度下降来优化神经网络中的所有参数以减少损失函数的值。通过上述操作你可以构建一个高效的猫咪检测器或其他检测器。

吴恩达《卷积神经网络》(第一周下半部分)_第16张图片

你可能感兴趣的:(深度学习)