深度卷积模型:案例研究
一、实例探究
经典的CNN网络:
- LeNet-5
- AlexNet
- VGG
除了CNN外,还有ResNet(残差网)
后面还会介绍Inception Neural Network
了解这些经典的网络,会对CNN的构建提供不错的想法。
二、经典网络
-
LeNet-5
LeNet-5可以用于识别手写数字,下图是一个LeNet-5的模型结构;LeNet-5包含卷积层、池化层和全连接层,使用的池化层都是average pool,总共包含了60k个参数,从左至右看,图片的宽度和高度都在减小,信道数量在增加。
这类模型如今还经常使用,即一个或多个卷积层后面跟着一个池化层,然后又是若干个卷积层再接一个池化层,然后是全连接层,最后是输出。
过去的人经常使用sigmoid和tanh函数,而不是relu;LeNet-5模型中使用的就是sigmoid和tanh函数。 -
AlexNet
下图是AlexNet的结构图,图中的same表示same convolutions。
AlexNet与LeNet有很多相似之处,不过AlexNet要大得多,AlexNet大约有60M个参数;AlexNet使用了relu激活函数,POOL使用的max pool。 -
VGG-16
VGG-16网络没有那么多超参数,这是一种只需要专注于构建卷积层的简单网络。结构如下图:
VGG-16网络总共包含约1.38亿个参数;随着网络的加深,图像的高度和宽度都在以一定的规律不断缩小,每次池化后刚好缩小一半,而通道数量在不断增加,而且刚好也是在每组卷积操作后增加一倍。也就是说,图像缩小的比例和通道数增加的比例是有规律的。
三、残差网络
-
非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。解决的方法之一是:跳跃连接(Skip connection),使用跳跃链接的网络被称为残差网络 (Residual Networks,ResNets)。
-
ResNets是由残差块(Residual block)构建的,什么是残差块呢?如下图两层的神经神经网络:
a[l]跳过一层直接连接到a[l+2]的输入,这就是跳跃连接,这两层的神经结点就叫做残差块。
所以构建一个ResNet网络就是将多个这样的残差块堆积在一起,形成一个深度神经网络。 -
下图是一个普通的神经网络(Plain network):
将此plain network变成ResNet的方法是每两层加上跳远连接,构成残差块,从而构成残差网:
当我们在训练普通神经网络时,随着网络深度的加深,
训练错误会先减少,然后增多
。而理论上,随着网络深度的加深,应该训练得越来越好才对。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练,训练错误会越来越多。
但ResNets就不一样了,即使网络再深,训练误差呈下降趋势,就算是训练深达100层的网络也不例外。这种方式确实有助于解决梯度消失和梯度爆炸问题
,让我们在训练更深网络的同时,又能保证良好的性能。
四、残差网络为什么有用?
如下图,在原有的神经网络上加上一个残差块,假设使用的激活函数是ReLU且a[l]≥0。当w[l+2]和b[l+2](可以通过正则化或者权重衰减可以将w和b约等于0)约等于0时,可以推导出a[l+2]=a[l]。
也就是说,加上了残差块后的深层模型有着和原始模型不逊色的功能;若当网络多的两层是不合理的,残差网可以通过学习得到a[l+2]=a[l]这个等式,变成原来的网络。
另一方面,假设很深的时候梯度消失了,加了残差层的网络可以退回到梯度消失之前。
- 还有一点值得注意
(1)ResNets使用了许多same卷积保证a[l]和a[l+2]维度相同
(2)当a[l]和a[l+2]维度不相同时,如a[l+2]维度时256,而a[l]维度是128,可以通过添加维度是256 * 128 的ws矩阵与a[l]相乘,将a[l]维度变成256。
ws不用设置,是网络通过学习得到的参数。
- 下图显示了如何将CNN转换成ResNets:
网络中使用了大量的3 * 3same卷积,确保a[l]和a[l+2]维度相同
五、Networks in Networks and 1x1 Convolutions
- 为什么要做1x1的卷积?
对于单个1x1的卷积,意义相当于乘积:
对于多个filter,意义就不同了。如下图,卷积过程就是输入数据nc维度上的数据与filter相乘再相加,可以看作输入数据nc维度的全连接层,w就是filter。然后filter可以有多个,也就相当于有多个全连接的神经节点了。
所以1×1卷积可以从根本上理解为对这32个不同的位置都应用一个全连接层,全连接层的作用是输入32个数字(在36个单元上重复此过程),输出结果是6×6×#filters(filter数量),以便在输入层上实施一个非平凡(non-trivial)计算。 - 1x1的卷积的应用:
可以使用1x1的卷积在不减少nH和nW的情况下压缩通道数
(nC),如下图:
当然也可以保持nC的维度依然是192,如此1×1卷积只是添加了一层非线性函数,让网络学习更复杂的函数。
六、谷歌Inception网络简介
Inception网络的作用是代替人工来确定卷积层中的过滤器类型,或者确定是否需要创建卷积层或池化层
,虽然网络架构会因此变得更加复杂,但表现却非常好。
-
Inception网络可以在单层网络上
使用多个不同尺寸的filter,进行same卷积操作,再将卷积结果拼接起来
。此外,还可以将CONV layer与POOL layer混合,同时实现各种效果。
与其它只选择单一尺寸和功能的filter不同,Inception Network使用不同尺寸的filters并将CONV和POOL混合起来,将所有功能输出组合拼接,再由神经网络本身去学习参数并选择最好的模块。 -
但是Inception Network计算量很大,如下图中的计算:
这里需要进行(28x28x32)x(5x5x192)≈1.2亿次乘法计算【有(28x28x32)个结果,每个结果需要(5x5x192)次乘法运算】
但可以引入1x1 Convolutions来减少计算量
,通常我们把该1x1 Convolution称为“瓶颈层”(bottleneck layer)如下图:
注意上面两幅图输出的维度都是一样的,但只需要进行(28x28x16)x(1x1x192)+(28x28x32)x(5x5x16)≈1204万次乘法运算,计算成本下降了十分之一,由此可见,1x1 Convolutions还可以有效减少CONV layer的计算量
。
七、Inception网络
将上图的Inception网络使用x1 Convolutions来减少计算量的流程可由下图表示:
- 截取某篇论文里面的Inception网络图:
【图源】
下面的一些分支所做的就是通过隐藏层来做出预测,分支和后面的输出是一样的,通过几个FC,然后通过softmax函数做出预测;这确保了即便是隐藏单元和中间层也参与了特征计算,它们也能预测图片的分类。它在Inception网络中,起到一种调整的效果,并且能防止网络发生过拟合
。
八、迁移学习
-
如果要做一个计算机视觉的应用,相比于从头训练权重,或者说从随机初始化权重开始,如果你下载别人已经训练好网络结构的权重,你通常能够进展的相当快,用这个作为
预训练(pre training)
,然后转换到你感兴趣的任务上。 -
例如要做一个猫咪分类器,可以去GitHub下载框架和
训练好后的权重
,之后可以将softmax输出层换掉,只训练换掉后的输出层的权重
即可,其他层的权重看作是“冻结”的。
通过pre training,即使手里的数据集不多,也能达到很好的效果。
大多数深度学习框架都支持这种操作,有的框架会有trainableParameter=0这样的参数来“冻结”那些不需要训练权重的层。 -
“冻结”前面的层次还有一个好处,因为前面的冻结层都是固定的,所以可以先用X乘以训练好的权重,得到A(映射后的特征向量),然后把A当做新的网络的输入X,训练这个小的新的网络。【既然不训练softmax前的参数,那么就把softmax的输入值保存,下次直接输入,避免每次输入都要算一遍】
-
当手里的数据很充足时,可以只冻结一部分层,训练不冻结层的权重,也可以用自己的隐藏层替换不冻结层。
-
有一个规律,如果你有越来越多的数据,需要冻结的层数越少,能够训练的层数就越多。
(1)数据少,只训练输出层(小规模);
(2)数据中等,训练其中几层(中等规模);
(3)数据充足,pre trian再训练整个网络。
数据扩充
-
镜像
-
随机裁剪
-
旋转、扭曲、局部弯曲
-
色彩变化:
给R、G、B三通道加上不同的失真值
颜色失真或者是颜色变换方法,这样会使得学习算法对照片的颜色更改更具鲁棒性。 -
PCA color augmentation(PCA颜色增强):
也就是对图片颜色进行主成分分析,对主要的通道颜色进行增加或减少,可以采用高斯扰动做法。这样也能增加有效的样本数量。
比如如果图片呈现紫色,即主要含有红色和蓝色,绿色很少,PCA颜色增强算法就会对红色和蓝色增减很多,绿色变化相对少一点,使总体的颜色保持一致。
十一、计算机视觉现状
对象检测:数据量较少;图片识别:中等数据量;语言识别:大量数据。
对于大量数据的项目,可以使用简单的网络和很少的hand-engineering(人工工程)就可以实现目标;对于少数据项目,需要很多的hand-engineering,对现有的数据进行处理。
所以可以认为知识来源于:1、大量的数据;2、hand-engineering/网络框架。
因为计算机视觉领域数据通常不够,所以较为依赖手工工程,这也是计算机视觉领域发展相当复杂网络架构地原因。
在模型研究或者竞赛方面,有一些方法能够有助于提升神经网络模型的性能:
- 集成:独立训练多个网络并平均其输出。
- Multi-crop at test time: 对测试图像的多个版本运行分类器并平均结果。
如下图:10-crop,对图片进行翻转和裁剪,然后进行测试,测试结果取均值作为输出。
这两种方法计算成本较大,一般不适用于实际项目开发。