第四门课 卷积神经网络(Convolutional Neural Networks)
2.1为什么要进行实例探究(Why look at case studies?)
Classic networks:
- LeNet-5
- AlexNet
- VGG
ResNet
Inception
2.2经典网络(Classic networks)
LeNet-5 :[LeCun et al . 1998. Gradient-based learning applied to document recognition]
AlexNet:[Krizhevsky et al . 2012. ImageNet classification with deep convolutional neural networks]
AlexNet与LeNet有很多相似之处,不过AlexNet大得多。LeNet-5约有6万个参数,AlexNet约6000万个参数。当用于训练图像和数据集时,AlexNet能够处理非常相似的基本构造模块,这些模块往往包含着大量的隐藏单元或数据,这一点AlexNet表现出色。AlexNet比LeNet表现更为出色的另一个原因是它使用了ReLu激活函数。经典的AlexNet结构还有另一种类型的层,叫作“局部响应归一化层”(Local Response Normalization),即LRN层,这类层应用得并不多。
VGG:[Simonyan & Zisserman 2015. Very deep convolutional networks for large-scale image recognition]
VGG-16网络没有那么多超参数,是一种只需要专注于构建卷积层的简单网络。16指在网络中包含16个卷积层和全连接层,总共包含约1.38亿个参数。VGG-16网络结构很规整,都是几个卷积层后面跟着可以压缩图像大小的池化层,池化层缩小图像的高度和宽度。卷积层的过滤器数量变化也存在一定的规律,64-128-256-512,在每一组卷积层进行过滤器翻倍操作。缺点是需要训练的特征数量非常巨大。
2.3残差网络ResNets(Residual Networks)
跳跃连接(Skip connection)可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。可以利用跳跃连接构建能够训练深度网络的ResNets,有时深度能够超过100层。ResNets是由残差块(Residual block)构建的。
信息流从
a
[
l
]
a^{[l]}
a[l]到
a
[
l
+
2
]
a^{[l+2]}
a[l+2]需要经过图中绿色线所有步骤,即这组网络层的主路径。在残差网络中将
a
[
l
]
a^{[l]}
a[l]的信息直接到达神经网络的深层,不再沿着主路径传递,这就意味着最后这个等式(
a
[
l
+
2
]
=
g
(
z
[
l
+
2
]
)
a^{[l+2]}=g(z^{[l+2]})
a[l+2]=g(z[l+2]))去掉了,取而代之的是另一个ReLU非线性函数:
a
[
l
+
2
]
=
g
(
z
[
l
+
2
]
+
a
[
l
]
)
a^{[l+2]}=g(z^{[l+2]}+a^{[l]})
a[l+2]=g(z[l+2]+a[l]),也就是加上的这个
a
[
l
]
a^{[l]}
a[l]产生了一个残差块。
使用残差块能够训练更深的神经网络。所以构建一个ResNet网络就是通过将很多这样的残差块堆积在一起,形成一个很深神经网络。图示为一个普通网络(Plain network),这个术语来自ResNet论文。
把它变成ResNet的方法是加上所有跳跃连接,每两层增加一个捷径,构成一个残差块。如图5个残差块连接在一起构成一个残差网络。
如果使用标准优化算法训练一个普通网络,如梯度下降法,或者其它热门优化算法,训练错误会先减少,然后增多。而理论上,随着网络深度的加深,应该训练得越来越好才对。但有了ResNets就不一样了,即使网络再深,训练的表现却不错。
2.4残差网络为什么有用(Why ResNets work?)
残差块学习这个恒等式函数并不难,跳跃连接很容易得出
a
[
l
+
2
]
=
a
[
l
]
a^{[l+2]}=a^{[l]}
a[l+2]=a[l]。这意味着即使给神经网络增加了这两层,它的效率也并不逊色于更简单的神经网络,因为学习恒等函数对它来说很简单。所以给大型神经网络增加两层,不论是把残差块添加到神经网络的中间还是末端位置,都不会影响网络的表现。残差网络起作用的主要原因就是这些残差块学习恒等函数非常容易,你能确定网络性能不会受到影响,很多时候甚至可以提高效率。
将Plain network转换为ResNet只需添加跳跃连接,需要调整矩阵
W
s
W_s
Ws的维度。如果输入和输出有不同维度需要增加一个矩阵
W
s
W_s
Ws,不需要对
W
s
W_s
Ws做任何操作,它是网络通过学习得到的矩阵或参数,是一个固定矩阵。
2.5网络中的网络以及1×1卷积(Network in Network and 1×1 convolutions)
1×1卷积,有时也被称为Network in Network。1×1卷积层实现了一些重要功能的(doing something pretty non-trivial),它给神经网络添加了一个非线性函数,从而减少或保持或增加输入层中的通道数量。
2.6谷歌Inception网络简介(Inception network motivation)
Inception网络或Inception层的作用是代替人工来确定卷积层中的过滤器类型,或者确定是否需要创建卷积层或池化层。基本思想是Inception网络由网络自行确定这些参数,可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合。
瓶颈层(batlleneck layer)表示网络中最小的部分,合理构建瓶颈层既可以显著缩小表示层规模,又不会降低网络性能,从而节省了计算。
2.7Inception网络(Inception network)
多个Inception module组成了Inception network
Inception网络是由Google公司的作者所研发的,被叫做GoogleLeNet,这个名字是为了向LeNet网络致敬。
我们需要走的更深(We need to go deeper)
2.8使用开源的实现方案(Using open-source implementations)
ResNets实现的GitHub地址:https://github.com/KaimingHe/deep-residual-networks
NG此处使用的是linux系统的bash命令行,对于win10系统,可以开启linux子系统功能,然后在win10应用商店下载ubuntu安装,运行CMD,输入命令bash即可进入linux的bash命令行。
git clone https://github.com/KaimingHe/deep-residual-networks.git
进入到克隆的目录并查看:
cd deep-residual-networks
dir
进入prototxt,就是存放这些网络文件的地方:
cd prototxt
查看ResNet里101层的详细配置:
more ResNet-101-deploy.prototxt
2.9迁移学习(Tranfer Learning)
当训练集很小时,从网上下载一些神经网络开源的实现,包括下载代码和权重,去掉Softmax层,创建自己的Softmax单元。就网络而言,把所有的层看作是冻结的,冻结网络中所有层的参数,只需要训练和自己的Softmax层有关的参数。通过使用其他人预训练的权重,你很可能得到很好的性能,即使只有一个小的数据集。取决于用的框架,它也许会有trainableParameter=0这样的参数。为了不训练这些权重,有时也会有freeze=1这样的参数。不同的深度学习编程框架有不同的方式,允许指定是否训练特定层的权重。
如果有越来越多的数据,需要冻结的层数越少,能够训练的层数就越多。这个理念就是,如果你有一个更大的数据集,也许有足够多的数据,不要单单训练一个softmax单元,而是考虑训练中等大小的网络,包含你最终要用的网络的后面几层。
如果有大量数据,用开源的网络和它的权重,把所有的权重当作初始化,然后训练整个网络。需要自己的softmax输出层来输出你要的标签。极端情况下,可以用下载的权重只作为初始化,用它们来代替随机初始化,接着可以用梯度下降训练,更新网络所有层的所有权重。
2.10数据增强(Data augmentation)
数据扩充是经常使用的一种技巧来提高计算机视觉系统的表现。数据扩充方法:
- 垂直镜像对称Mirroring
- 随机裁剪Random Cropping
- 旋转Rotation
- 剪切Shearing
- 局部变形Local warping
- 彩色转换Color shifting
一种影响颜色失真的算法是PCA,即主成分分析。
常用的实现数据扩充的方法是使用一个线程或者多线程,这些可以用来加载数据,实现变形失真,然后传给其他的线程或其他进程,可以并行实现。与训练深度神经网络的其他部分类似,在数据扩充过程中也有一些超参数,比如说颜色变化了多少,以及随机裁剪的时候使用的参数可以使用开源实现参数调整。
2.11计算机视觉现状(The state of computer vision)
在机器学习或者深度学习中,一般更崇尚更少的人工处理,而手工工程(hand-engineering)更多依赖人工处理。当没有足够的数据时,手工工程对一个项目来说贡献就很大。当有很多数据时就不会花时间去做手工工程,会花时间去建立学习系统。一般学习算法有两种知识来源:
- Labeled data
- Hand engineered features/network architecture/other components
Benchmark 基准测试是一个评价方式,在整个计算机领域有着长期的应用。Benchmark在计算机领域应用最成功的就是性能测试,主要测试负载的执行时间、传输速度、吞吐量、资源占用率等。维基百科上解释:
As computer architecture advanced, it became more difficult to compare the performance of various computer systems simply by looking at their specifications.Therefore, tests were developed that allowed comparison of different architectures.
下面是一些有助于在基准测试中表现出色的小技巧:
- Ensembling集成:
Train several networks independently and average their outputs - Multi-crop at test time
Run classifier on multiple versions of test images and average results
错题
Inception 块通常使用1x1的卷积来减少输入卷积的大小,然后再使用3x3和5x5的卷积