吴恩达深度学习课程笔记(四):卷积神经网络2 实例探究
2.1 为什么要进行实例探究
学以致用。
学习经典CNN后,会对如何构建有效的CNN更有感觉。
- 经典网络:
- LeNet-5
- AlexNet
- VGG
- ResNet
- Inception
2.2 经典网络
LeNet-5
- 针对灰度图;
- 现代版本使用Relu;
- 现代版本最后是softmax层;
- 建议只读原论文的第二部分和第三部分,因为大部分都已过时,但网络结构仍有参考价值,即conv - pool - conv - pool - FC - FC 。
AlexNet
AlexNet与LeNet在很多地方很相似,但是要大很多。LeNet-5大概6万个参数。而AlexNet大概6000万个参数。
AlexNet(比LeNet-5)表现出色的原因:
- 当用于训练图像和数据集的时候,AlexNet能够处理非常相似的基本构造模块。这些模块往往包含着大量的隐藏单元或数据。
- 使用Relu激活函数。
看论文可以绕过的点:
- 在写AlexNet论文的时候,GPU速度还很慢。所以采用了很复杂的方法在两个GPU上训练。
- 所使用的局部响应归一化层(LRN层:local response normalization)后续研究发现起不到作用,也没人用,可以不看。
该论文是深度学习进入计算机视觉领域的开端。从这篇论文开始,计算机视觉的研究者开始重视深度学习,最后使得深度学习在其他领域也发扬光大。
VGG-16
一种没有很多超参数,只需要专注于构建卷积层的简单网络。VGG-16简化了神经网络结构。
VGG-16,即有16层网络的VGG,有13个CONV和3个FC。一共1.38亿个参数。
虽然是个大网络,但结构简单,规整,过滤器数量变化存在规律(64 - 128 - 256 - 512 - 512)。
缺点是:需要训练的特征数量非常巨大。
2.3 残差网络(ResNets:Residual Networks)
非常非常深的网络存在梯度消失和梯度爆炸问题,因此很难训练。
跳远连接(skip connections)可以从某一网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。
利用跳远连接构建能够训练深度网络的ResNets。
残差块(Residual block)
跳远连接(skip connections),又叫捷径(short cut),用来构建残差块,而残差块可以训练更深的神经网络。
将 除了主路以外,直接在 的激活函数前输入。
也就是 。
构成一个残差块。
ResNet网络就是由很多这样的残差块构成。
残差网络 (Residual Network)
上图,普通网络(plain network)使用跳远连接,构成5个残差块,生成了一个残差网络。
随着网络层数的增加,理论上训练误差应该越来越小;但在普通网络上却不是这样;而残差网络可以做到。
2.4 残差网络为什么有用?
深度网络存在退化问题,即随着深度的加深,训练误差反而加大。
给一个普通网络加入残差块,如图所示。
整个网络使用Relu激活函数,那么,所有的激活值a>=0。
如果使用 正则化或者权重衰减,会压缩 的值。
如果对 使用权重衰减,也可以达到相同效果。
如果 ,为方便分析,假设此时 ,那么 。
以上分析表明:
残差块可以很容易地学习到恒等式函数。
即,skip connection 使网络很容易得到 这个恒等式。
这意味着,即使给神经网络增加了两层,也没有使得网络的性能降低。因为学习恒等式函数对残差块来说很简单。尽管多了两层,但是也只是把 的值赋给 。
所以,不论是把残差块添加到神经网络的中间还是末端位置,都不会影响网络的性能。
但我们的目标不是仅仅在保持网络性能的条件下单纯的增加层数(要深还要好)。
如果我们新添加的隐藏单元能够学习到一些有用信息,那么它可能比学习到恒等式函数表现的更好(深,好)。
如果是没有残差块的深度普通网络,当网络不断加深时,其仅仅选择学习恒等式函数的参数都很困难。所以增加层数最后的表现不但不能变好,反而更糟。
总结:残差块学习恒等函数非常容易。所以可以很肯定的说,增加残差块不会使得网络的性能受到影响。很多时候,这些增加的残差块还可以提升网络的性能(如果残差块学习到有用信息的话)。反过来说,增加残差块至少不会降低网络的性能。
细节:
中,假设
和
相同维度。
所以,ResNets使用了很多same convolutions。
如果
和
维度不相同,那么,给
添加参数
。
比如, 是256X1, 是128X1。
那么, 这个参数就是256X128,并且是网络去自动学习参数。
2.5 网中网以及 1×1 卷积
在图像信道数ch=1的时候,1 1卷积核就是一个数字,没有什么意义。
在图像信道数ch>1的时候,1 1卷积核会和输入矩阵构成网中网。
如上图所示,在输入中切出一个1
1
32的部分,和一个卷积核卷积,卷积核的32个数字就是一个网络的权重,如下图所示:
现在网络中会存在多个1
1$过滤器,对于输入图像中的一个像素点(有多个通道)来说,和一个过滤器卷积,产生一个输出,和多个过滤器卷积,产生多个输出。如下图所示:
假设,图像的一个像素点为1 1 32,而1 1 32的卷积核有16个,那么最终产出就是1 1 16。
通过这一个像素点和多个1 1卷积核生成的就是一个网中网,在本来的神经网络中,通过1 1卷积操作产生的小神经网络。
一副6 6的图像有36个像素点,就是这个网中网的36个输入。
用途:
- 压缩信道数量
。
- 池化层只能压缩图像的高度和宽度。
- 应该叫改变信道数量,即增加信道、保持和减小。但一般都是用来压缩信道数量。
上图中,如果选择192个过滤器,那就不是压缩信道数量。这时候,卷积核中带有的非线性函数,可以让网络学习更复杂的函数。
ps:卷积核卷积之后带有非线性函数。不光是1 1卷积核。
2.6 Inception 网络简介
当构建网络时,你需要决定卷积核的大小(1 1、3 3、5 5等),以及是否添加池化层。
这些 Inception 网络都可以自动选择决定。 即代替人工来决定卷积层中过滤器的类型,或者确定是否需要创建卷积层或池化层。
即 Inception 层将不同的卷积核以及池化层罗列出来(注意输出的高度和宽度要保持一致,卷积和池化都需要做到)。
存在的问题是,5 5卷积非常耗费算力。
计算成本问题:
上图,对个这个5
5卷积,需要1.2亿次乘法运算。
为了缩减这个算力成本,用1\times$1卷积来压缩信道数量。压缩信道的这一层就叫做瓶颈层(bottleneck large)。
加入瓶颈层,改变网络架构后,需要1240万次乘法运算。
运算成本下降了十分之一。
瓶颈层的作用就是降低运算成本。
大幅压缩信道数量会不会影响网络性能?
只要合理选择瓶颈层大小,就可以显著缩小表示层规模的同时,不降低网络的性能。