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

卷积神经网络(第二周上半部分)


2.2 经典网络


这节课来看下几个经典的神经网络结构,分别是LeNet-5、AlexNet、VGGNet。

一、LeNet-5网络

先看下LeNet-5网络,假设你有一张32 * 32 * 1 的图片,LeNet-5可以识别图片中的手写数字,比如下面的手写数字7,LeNet-5是针对灰度图像训练的,所以图片的大小只有32 * 32 * 1,实际上LeNet-5的结构和我们上周讲的最后一个范例非常相似,第一层使用了6个5 * 5的过滤器 步幅为1,由于使用了6个过滤器,步幅为1,padding = 0,输出的结果为28 * 28 * 6,图像尺寸从32 * 32缩小到28 * 28,然后进行池化操作,在这篇论文写成的那个年代人们更喜欢使用平均池化,而现在,我们可能使用最大池化更多些。在这个例子中我们先使用平均池化,过滤器的宽度为2(f = 2,即2 * 2),步幅为2,图像的尺寸、高度和宽度都缩小了2倍,此时输出结果是一个14 * 14 * 6的图像(下图中并不是按照比例绘制的,如果是正确的比例应该是原图像的一半),接下来是卷积层我们用一组16个5 * 5的过滤器新的输出结果有16个信道,LeNet-5网络论文是1998年写的当时并不使用padding和有效卷积,这就是为什么每进行一次卷积,图像的高度和宽度都会缩小,所以这个图像从14 * 14缩小到了10 * 10,然后又是池化层,高度和宽度再缩小一半,输出图像是5 * 5,将所有数字相乘5 * 5 * 16乘积是400,下一层是全连接层,在全连接层中有400个节点,每个节点有120个神经元,图中已经有了第一个全连接层(120)但是有时还会从这400个节点中抽取一部分节点构建另一个全连接层,像这样有2个全连接层最后一步就是利用这84个特征得到最后的输出。
我们还可以在这里再加一个节点用来预测y^的值, y^有10个可能的值,对应识别0 - 9这10个数字。在现在的版本中则使用softmax函数输出10种分类结果。而在当时LeNet-5网络在输出层使用了另外一种现在很少用的分类器。相比现代版本这里得到的神经网络会小一些只有约6万个参数,而现在我们经常看到含有一千万到一亿个参数的神经网络比这大1000倍的神经网络也不在少数。
在这里插入图片描述
不管怎样,上图中我们从左往右看,随着网络越来越深,图像的高度和宽度在缩小从最初的32 * 32 到14 * 14 最后到5 * 5,与此同时随着网络层次的加深,信道数量一直在增加从1个增加到6个再到16个。
这个神经网络中还有一种模式至今仍然经常用到,那就是一个或者多个卷积层后面跟着一个池化层,然后又是若干个卷积层再接一个池化层,然后是全连接层,最后是输出,这种排列方式很常用,但是在前人的论文中会发现过去人们使用Sigmoid函数和Tanh函数,而不是ReLu函数。LeNet-5网络这篇论文中正是使用了Sigmoid函数和Tanh函数,这种网络结构的特别之处还在于各网络层之间是有关联的,你有一个nH * nW * nC的网络,有nC个信道,使用尺寸为 f * f * nC的过滤器,每个过滤器的信道数和它上一层的信道数相同,这是由于在当时计算机的运算速度非常慢,为了减少计算量和参数,经典的LeNet-5网络使用了非常复杂的计算方式,每个过滤器都采用和输入模块一样的信道数量,论文中提到的这些复杂细节,现在一般都不用了,我认为当时所进行的最后一步其实到现在也还没有真正完成,就是经典的LeNet-5网络在池化后进行了非线性函数处理,在这个例子中池化层之后使用了Sigmoid函数。所以如果你真的去读这篇论文,这会是最难理解的部分之一,我们会在后面的课程中讲到。图片中的内容大部分来源于论文中的第二段和第三段。原文的后几段介绍了另一种思路,文中提到的图形变形网络并没有得到广泛应用,所以在读这篇论文时,建议精读第二段,这段重点介绍了这种网络结构。

二、AlexNet

下面例子是讲AlexNet,首先是一张227 * 227 * 3 的图片作为输入(实际上这篇原论文中使用的图像是224 * 224 * 3)但是尝试一下发现227 * 227这个尺寸会更好一些,第一层我们使用了96个11 * 11的过滤器,步幅为4,图像缩小到55 * 55,然后用一个3 * 3的过滤器构建最大池化层,f = 3 步幅为2卷积层尺寸缩小为27 * 27 * 96,接着再执行一个5 * 5的卷积,padding之后输出的结果是27 * 27 * 256(276),然后再进行最大池化,尺寸缩小到13 * 13。再执行一次与上一步相同的卷积,相同的padding,得到的结果是13 * 13 * 384384个过滤器。再做一次相同的3 * 3的卷积,再做一次同样的操作,最后再进行一次最大池化,尺寸缩小到 6 * 6 * 256,6 * 6 * 256 = 9216将其展开为9216个单元,然后是一些全连接层,最后使用softmax函数输出识别的结果看它究竟是1000个可能的对象中的哪一个。

在这里插入图片描述
实际上这种神经网络与LeNet-5有很多相似之处,不过AlexNet要大的多,正如前面讲到的LeNet-5或者LeNet-5大约有6万个参数,而AlexNet包含6000万个参数,当用于训练图像和数据集时AlexNet能够处理非常相似的基本构造模块,这些模块往往包含大量的隐藏单元或数据,这一点另AlexNet表现的出色。

AlexNet比LeNet-5表现更为出色的另一个原因是它使用了ReLu激活函数,论文中提到经典的AlexNet结构还有另一种类型的层叫作“局部响应归一化层”即LRN层,这类层应用的并不多,LRN层的基本思路是:假如这是网络中的一块(图中底部红色笔画的)它的尺寸是上面这些尺寸中的某一个比如是13 * 13 * 256,LRN要做的就是选取一个位置(图中红色圆圈)从这个位置穿过整个信道能得到256个数字并进行归一化,进行局部响应归一化的动机是对于这张13 * 13的图像中的每个位置来说我们可能并不需要太多的高激活神经元,但是后来研究者发现LRN起不到太大的作用,而且我们现在并不用LRN来训练网络。AlexNet的网络结构看起来相对复杂包含大量参数。

三、VGG - 16

最后一个范例,值得注意的一点是VGG - 16网络没有那么多超参数,这是一种只需要专注于构建卷积层的简单网络,首先用3 * 3,步幅为1的过滤器构建卷积层,padding参数为same,然后用一个2 * 2 步幅为2的过滤器构建最大池化层,因此VGG网络的一大优点是它的确简化了神经网络结构。
下面我们具体讲讲这种网络结构,假设要识别这样一个图像,在最开始的2层用64个3 * 3的过滤器对输入的图像进行卷积输出结果是224 * 224,因为进行了相同的卷积信道数量也一样,VGG - 16其实是一个很深的网络,这里我并没有把所有的卷积层都画出来,右上角的小图尺寸是224 * 224 * 3进行第一个卷积之后得到224 * 224 * 64的特征图这个图要厚一些接着还有一层224 * 224 * 64,得到这样2个厚度为64的卷积层意味着我们用64个过滤器进行了两次卷积,正如前面提到的这里采用的都是大小为3 * 3 ,步幅为1的过滤器,并且同样都进行卷积,所以这里就不把所有层都画出来了,只用一串数字代表这些网络。接下来创建一个池化层,池化层将输入的图像进行压缩从224 * 224 * 64缩小到多少呢?没错减少到112 * 112 * 64然后又是若干个卷积层(使用120个过滤器)以及一些相同的卷积操作输出112 * 112 * 128然后进行池化,可以推到出池化后的结果是 56 * 56 * 128,接着再用256个同样的过滤器进行三次卷积操作然后再池化再卷积三次再池化如此进行几轮操作后将最后得到的7 * 7 * 512的特征图进行全连接操作,得到4096个单元然后进行softmax激活输出从1000个对象中识别的结果。

在这里插入图片描述
VGG - 16的这个数字16就是指在这个网络包含16个卷积层和全连接层确实是个很大的网络总共包含约1.38亿个参数是非常大的网络,但是VGG - 16的结构并不复杂这是一个优点,而且这种网络结构很工整,都是几个卷积层后面跟着可以压缩图像大小的池化层,池化层缩小图像的高度和宽度,同时卷积层的过滤器数量也存在一定的变化规律,从64个然后翻倍成128个再到256和512个,作者可能认为512已经足够大了所以后面的几层就不再翻倍了,无论如何,每一步都进行翻倍(或者说在每一组卷积层进行过滤器翻倍操作)。而它的缺点是需要训练的特征数量非常巨大。
随着网络的加深,图像的高度和宽度都在以一定的规律不断缩小每次池化后刚好缩小一半,而信道数量在不断增加,而且刚好也是在每组卷积操作后增加一倍,也就是说图像的缩小比例和信道增加的比例是有规律的。


2.3 残差网络


非常非常深的网络是很难训练的,因为存在梯度消失和梯度爆炸的问题,下面学习跳远连接,它可以从某一网络层获取激活值然后迅速反馈给另外一层,甚至是神经网络的更深层,我们可以利用跳远连接构建能够训练深度网络的ResNets,有时深度能到超过100层。

ResNets是由残差模块构建的,解释一下残差块如下图这是一个两层神经网络,在L层进行激活得到a[l + 1]再次进行激活,两层之后得到a[l + 2]。
在这里插入图片描述
计算过程从a[l]开始,首先进行线性激活,通过图中的等式a[l]算出z[l + 1],即a[l]乘以权重再加上偏差因子。然后通过ReLu非线性激活函数得到 a[l + 1],由于a[l + 1] = g(z[l + 1])计算得出,接着再次进行线性激活依据的等式是这个z[l + 2] = W[l + 2]a[l + 1] + b[l + 2]这个等式和图中左边的等式非常相似,最后依据这个等式再次进行ReLu非线性激活,这里的g是指ReLu非线性激活函数得到的结果就是a[l + 2]。
在这里插入图片描述
换句话说信息流从a[l]到a[l + 2],需要经过以上所有步骤即这组网络的主路径,在残差网络中有一点变化,我们将a[l]直接向后(图中紫色线条)拷贝到神经网络的深层,在ReLu非线性激活函数前加上a[l],这是一条捷径,a[l]的信息直接到达神经网络的深层不再沿着主路径传递,这就意味着最后这个等式去掉了(即a[l + 2] = g(z[l + 2]))。
取而代之的是另一个ReLu非线性函数仍然对z[l + 2]进行g函数处理,但这次要加上a[l],即
a[l + 2] = g(z[l + 2] + a[l])也就是加上的这个a[l],产生了一个残差块。
我们也可以画一条捷径直达第二层,实际上这条捷径是在进行ReLu非线性激活之前加上的,而这里的每一个节点都执行了线性函数和ReLu激活函数,所以a[l]插入的时机是在线性激活之后ReLu激活之前。除了捷径你还会听到另一个术语“跳远连接”,就是指a[l]跳过一层或者好几层,从而将信息传递到神经网络的更深层,ResNets的发明者们发现使用残差块能够训练更深的神经网络,所以构建一个ResNets网络就是通过将很多这样的残差块堆积在一起,形成一个深度神经网络。
在这里插入图片描述
下面是另一个网络,这并不是一个残差网络而是一个普通网络,把它变成一个ResNets的方法是加上所有的跳远连接,正如前面讲的那样,每两层增加一个捷径,构成一个残差块。如下图所示5个残差块连接起来构成一个残差网络。
在这里插入图片描述

如果我们使用标准优化算法训练一个普通网络,比如梯度下降或者其他优化算法,如果没有多余的残差(没有这些捷径(跳远连接)),凭经验你会发现随着网络深度的加深,训练错误会先减少然后增多,而理论上随着网络深度的加深应该训练的越来越好才对,也就是说网络的深度越深越好,但实际上如果没有残差网络,对于普通网络来说,深度越深意味着用优化算法越难训练,实际上随着网络深度的加深,训练的错误会越来越多。但是看下面
在这里插入图片描述
但是有了ResNets就不一样了,即使网络再深,训练的表现却不错,比如说错误会减少,就算是训练深度达100层的网络也不例外,有人甚至在1000多层的神经网络中做过实验。
在这里插入图片描述
但是对 x 的激活或者这些中间的激活能够达到网络的更深层,这种方式确实有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时又能保证良好的性能。也许从另外一个角度看,随着网络的加深,网络连接会变得臃肿,但是ResNets确实在训练深度网路方面非常有效。


2.4 残差网络为什么有用?


为什么ResNet能有如此好的表现,我们来看一个例子,它解释了其中的原因。至少可以说明如何在构建更深层次的ResNet的同时还不降低它们在训练集上的效率,希望你已经通过第三课了解到,通常来讲网络在训练集上表现好才能在Hold - Out交叉验证集或dev集和测试集上有好的表现,至少在训练集上训练好ResNet是第一步,先看下面例子:
上节我们提到一个网络越深,它在训练集上训练网络的效率会有所减弱,这也是有时候我们不希望网络加深的原因。而事实并非如此,至少在训练ResNet网络时并不完全如此。
举个例子下图中,假设有一个大型神经网络其输入为 x 输出激活值 a[l] ,如果你想增加这个神经网络的深度那么用Big NN表示的输出还为a[l],再给这个网络额外添加两层,依次添加两层最后输出为a[l + 2]。
在这里插入图片描述
可以把这两层看作一个ResNet块即具有跳远连接的残差块,为了方便说明假设我们在整个网络中使用ReLu激活函数,所有激活值都 >= 0包括输入 x 的非零异常值,因为ReLu激活函数输出的数字要么是0要么是正数。
我们来看下输出的值a[l + 2]也就是上节课讲过的表达式即a[l + 2] = g(z[l + 2] + a[l]),添加项a[l]是刚添加的跳远链接的输入。展开这个表达式结果如下图所示。

在这里插入图片描述
注意一点,如果使用L2正则化或权重衰减它会压缩W[l + 2]的值,如果对b应用权重衰减,亦可达到同样的效果。尽管在实际应用中,你有时会对b应用权重衰减有时不会,这里的W是关键项,如果W[l + 2] = 0,为了方便起见,假设b也等于0,那么W[l + 2] * a[l + 1] + b[l + 2]就没有了,因为它们的值为0。

ReLu激活函数的形式如下:
在这里插入图片描述
最后a[l + 2] = g(a[l]) = a[l] (因为a[l]是l层激活之后的值本身>= 0,再进行g()函数激活(这里指ReLu函数)之后仍然是a[l])。
在这里插入图片描述

结果表明,残差块学习这个恒等式函数残差块并不难,跳远连接使我们很容易得出a[l + 2] = a[l],这意味着即使给神经网络增加了这两层,它的效率也并不逊色于更简单的神经网络,因为学习恒等函数对它来说很简单,尽管它多了两层也只是把a[l]的值赋给a[l + 2]。所以给大型神经网络增加两层,不论是把残差块添加到神经网络的中间还是末端位置。都不会影响网络的表现。

当然,我们的目标不仅仅是保持网络效率还是要提升它的效率,想象一下如果这些隐层单元学到一些有用信息那么它可能比学习恒等函数表现得更好。而这些不含有残差块或跳远连接的深层普通网络情况就不一样了,当网络不断加深时,就算是选择用来学习恒等函数的参数,也是很困难的。所以很多层最后的表现不但没有更好反而更糟。

残差网络起作用的主要原因是这些残差块学习恒等函数非常容易,你能确定网络性能不会受到影响很多时候甚至可以提高效率或者说至少不会降低网络效率,因此创建类似残差网络可以提升网络性能。

除此之外,关于残差网络另一个值得探讨的细节是假设z[l + 2]与a[l]具有相同的维度,所以ResNets使用了许多相同卷积,所以这个a[l]的维度等于这个输出层的维度,因而实现了这个跳远连接,因为同一个卷积保留了维度所以很容易得出这个短连接并输出这两个相同维度的向量。
在这里插入图片描述
如果输入和输出有不同的维度,比如输入的维度是128,a[l] 的维度是256,再增加一个矩阵,这里标记为Ws是一个256 * 128的矩阵,那么这个新增项Ws * a[l]则是256维度的向量,,不需要对Ws做任何操作它是网络通过学习得到的矩阵或参数,它是一个固定矩阵。

最后,我们来看看ResNets的图片识别,它有多个卷积层,最后输出一个Softmax,如何把它转化为ResNets呢?只需要添加跳远连接这里讨论几个细节,这个网络有很多层3 * 3卷积,而且它们大多都是相同的这就是添加等维特征向量的原因,所以这些都是卷积层而不是全连接层(因为它们是相同的卷积,维度不变,这也解释了添加项z[l + 2]+a[l])。
ResNets类似于其它很多网络,也会有很多卷积层其中偶尔会有池化层或者类似池化层的层,你都需要调整矩阵Ws的维度。普通网络与ResNets网络常用的结构是卷积层、卷积层、卷积层…、池化层…依次重复直到最后,有一个Softmax进行预测的全连接层。

在这里插入图片描述
以上是ResNets的内容。


2.5 网络中的网络以及1 * 1卷积


在架构内容设计方面,其中一个比较有帮助的想法是使用1 * 1的卷积,也许你会很好奇,1 * 1的卷积能做什么呢?不就是乘以数字么,听上去有点好笑但结果却并非如此,我们来具体看看,过滤器为1 * 1,这里是数字2,输入的是一张6 * 6 * 1的图片,然后对它做卷积,其过滤器大小为1 * 1 * 1,结果相当于把这个图片乘以数字2,所以右边输出图像中前三个单元格分别是2 ,4 , 6。
在这里插入图片描述

用1 * 1的过滤器进行卷积,似乎用处不大,只是对输入矩阵乘以某个数字,但这仅仅是对6 * 6 * 1的信道图片来说1 * 1的卷积效果不佳,如果是一张6 * 6 * 32 的图片,那么使用1 * 1的过滤器进行卷积效果更好,具体来说,1 * 1卷积所实现的功能是遍历这36个单元格计算左图中32个数字和过滤器中32个数字的元素智能乘积然后应用ReLu非线性激活函数,我们以其中一个单元格为例,它是这个输入层上的某个切片。用这36个数字乘以这个输入层上1 * 1的切片,得到一个实数像这样把它画在输出中。这个1 * 1* 32过滤器中的32个数字可以这样理解,一个神经元的输入是32个数字乘以相同高度和宽度上某个切片上的32个数字,这32个数字具有不同的信道,乘以32个权重,然后应用ReLu非线性函数(图中手绘的黄色圈圈)在这里输出相应的结果。一般来说,如果过滤器不止一个,而是多个就好像有多个输入单元,其输入内容为一个切片上所有数字,输出结果是6 * 6 * 过滤器数量的堆叠(如下图)。所以1 * 1的卷积可以从根本上理解为这32个单元都应用了。

在这里插入图片描述
一个全连接神经网络,全连接层的作用是输入32个数字和过滤器数量标记为nc[l + 1],在36个单元上重复此过程,输出结果是6 * 6 * 过滤器数量,以便在输入层上实施一个非平凡计算,这种方法通常称为1 * 1卷积,有时也称为网络中的网络(Network in Network)在(林敏、陈强、杨学成的论文中有详细描述),虽然论文中关于架构的详细内容并没有得到广泛应用,但是1 * 1卷积或Network in Network的理念却很有影响力,很多神经网络架构都受到它的影响包括下节要讲的inception网络。

举个1 * 1卷积的例子,假设这是一个28 * 28 * 129的输入层,你可以使用池化层压缩它的高度和宽度,但是如果信道数量很大该如何把它压缩成28 * 28 * 32维度的层呢?你可以用32个大小为1 * 1的过滤器,严格来讲每个过滤器的大小都是1 * 1 * 192维,因为过滤器中的信道数量必须与输入层中的信道数量保持一致。因此使用32个过滤器输出层为28 * 28 * 32,这就是压缩nc的方法。
在这里插入图片描述

然而对于池化层,我只是压缩了这些层的高度和宽度,接下来我们看看在某些网络中1 * 1卷积是如何压缩信道数量并减少计算的,当然如果你想保持信道数量192不变,这也是可行的,1 * 1卷积只是添加了非线性函数当然也可以让网络学习更复杂的函数,比如我们再添加一层其输入为28 * 28 * 192,输出为28 * 28 * 192,1 * 1卷积层就是这样实现了一些重要功能它给神经网络添加了一个非线性函数,从而减少或保持输入层中的信道数量不变,后面你会发现这对构建inception网络很有帮助。

在这里插入图片描述


2.6 谷歌Inception网络简介


构建卷积层时你要决定过滤器的大小是1 * 1、3 * 3还是5 * 5,或者要不要添加池化层而Inception网络的作用就是代替你来做决定,虽然网络架构因此变得更加复杂,但网络表现却非常好,我们来看下,例如这是28 * 28 * 192维度的输入层,Inception网络或Inception层的作用就是代替人工来确定卷积层中的过滤器类型或者确定是否需要创建卷积层或者池化层。
如果使用1 * 1的卷积输出结果会是28 * 28 * 某个值,假设输出是28 * 28 * 64,并且这里只有一层,如下图。
在这里插入图片描述
如果用128个3 * 3的过滤器 ,padding = 1,那么输出是28 * 28 * 128,然后我们把第二个值堆积到第一个值上,为了匹配维度,和输入维度相同即高度和宽度相同,这里是28 * 28 * 128。
在这里插入图片描述

在此时你可能会说希望提升网络的表现,用32个5 * 5的过滤器或许更好,那此时padding = 2,输出就变成了28 * 28 * 32,保持维度不变。
或许你不想使用卷积层那么就用池化操作,得到一些不同的输出结果我们把它也堆积起来,这里池化输出是28 * 28 * 32,为了匹配所有维度我们需要对最大化池使用padding,它是一种特殊的池化形式因为输入的高度和宽度为28 * 28则输出的相应维度也是28 * 28然后再进行池化,padding不变 步幅为1 。
在这里插入图片描述
这个操作非常有意思后面继续看,下面会再实现这个池化。有了这样的Inception模块就可以输入某个值,因为它累加了所有数字,这里最终的输出为32 + 32 + 128 + 64 = 256,Inception模块的输入为28 * 28 * 192,输出为28 * 28 * 256。这就是Inception网络的核心内容。

在这里插入图片描述
基本思想就是Inception网络不需要人为决定使用哪个过滤器,或是否需要池化,而是由网络自行确定这些参数,你可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数采用哪些过滤器组合。不难发现以上描述的Inception层有一个问题就是计算代成本,下面我们就来计算这个5 * 5过滤器在该块中的计算成本,我们主要来看5 * 5的过滤器上,仍然是28 * 28 * 192的输入,执行一个5 * 5的卷积它有32个过滤器,输出为28 * 28 * 32。

在这里插入图片描述
我们来计算一下这个28 * 28 * 32输出的计算成本,它有32个过滤器因为输出有32个信道。每个过滤器的大小为5 * 5 * 32,因为输出为28 * 28 * 32。所以要计算这28 * 28 * 32个数字,对于输出的每个数字来说都需要执行5 * 5 * 192次乘法运算,所以乘法运算的总次数 = 输出值的个数 * 每个输出值所需要的乘法运算次数 (28x28x32 x 5x5x192),把这些数相乘结果等于1.2亿。可以看出这个数值比较大,即使在现代用计算机执行1.2亿次乘法运算成本也是相当高。

下面我们会看下 1 * 1 卷积的应用(上节内容提过)

为了降低计算成本,我们用计算成本除以因子10,结果它从1.2亿减小到原来的十分之一,请记住120这个数字(要和下一页做对比)。
还有另外一种架构,其输入为28 * 28 * 192,输出为28 * 28 * 32。其结果是这样的对于输入层使用1 * 1卷积把输入值从192个信道减少到16个信道。然后对这个较小层运行5 * 5卷积得到最终输出,注意输入和输出的维度依然相同,输入是28 * 28 * 192,输出是28 * 28 * 32。
但我们要做的就是把左边这个大的输入层压缩成较小的中间层(28 * 28 * 16),它有16个信道而不是192个信道。有时这被称为瓶颈层,瓶颈通常是某个对象最小的部分,假如你有这样一个玻璃瓶,瓶颈就是瓶子的最小部分,同理瓶颈层也是网络中的最小部分。我们先缩小网络表示,然后再扩大它。
接下来我们看下这个的计算成本,应用1 * 1卷积过滤器个数是16,每个过滤器大小是1 * 1 * 192,那么28 * 28 * 16这个层的计算成本是输出28 * 28 * 192中的每个元素都做192次乘法(因为是1 * 1 * 192),相乘结果约等于240万,240万只是第一个卷积层的计算成本,那么第二个卷积层呢?输出为28 * 28 * 32,其中对于每个输出值,应用一个5 * 5 * 16维度的过滤器,计算结果是1000万,所以所需乘法运算的总次数是这两层的计算成本之和也就是1240万,此时与上面的1.2亿相比降到了原来的十分之一即1240万,所需的加法运算与乘法运算的次数近似相等,所以我们只统计乘法运算的次数。
在这里插入图片描述

总结:如果在构建神经网络时,不确定池化层是使用1 * 1、3 * 3还是5 * 5的过滤器时那Inception模块就是最好的选择,我们可以应用各种类型的过滤器,只需把输出连接起来,之后我们讲到计算成本的问题,学习了如何通过使用1 * 1卷积来构建瓶颈层从而大大降低了计算成本。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值