参考来源:
https://blog.csdn.net/red_stone1/article/details/78769236
https://blog.csdn.net/koala_tree/article/details/78531398
有关CNN典型架构的发展:
https://blog.csdn.net/kangroger/article/details/56522132#googlenet
https://blog.csdn.net/darkprince120/article/details/53024714
https://blog.csdn.net/qianqing13579/article/details/71076261
讲述了CNN的几种典型架构,并给出了网络训练的学习方案。(下图为参考博客qianqing13579)
典型的CNN模型包括:
LeNet-5
AlexNet
VGG
除了这些性能良好的CNN模型之外,我们还会介绍Residual Network(ResNet)。其特点是可以构建很深很深的神经网络(目前最深的好像有152层)。
另外,还会介绍Inception Neural Network。接下来,我们将一一讲解。
2. Classic Networks
(1)LeNet-5主要针对灰度图像设计,所以其输入较小,为32*32*1
(2)LeNet-5模型总共包含了约6万个参数。值得一提的是,当时Yann LeCun提出的LeNet-5模型池化层使用的是average pool,而且各层激活函数一般是Sigmoid和tanh。现在,我们可以根据需要使用max pool和激活函数ReLU。
(3)在LetNet中存在的经典模式:
由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同提出,直接对彩色的大图片进行处理,其结构如下所示:
在AlexNet中存在的经典模式:
VGG-16模型包含16个conv与pool层,专注于构建卷积层,没有大量的超参数。
一般情况下,其CONV layer和POOL layer设置如下:
CONV = 3x3 filters, s = 1, same
MAX-POOL = 2x2, s = 2
结构如下所示:
优点:简化了神经网络结构,使网络结构更加规整;
缺点:需要训练的特征数量大,(VGG-16的参数多达1亿3千万);
特点:每一步过滤器的数量都翻倍,可以明显看到随网络深度增加,图像缩小与信道数量的增加。
如果神经网络层数越多,网络越深,源于梯度消失和梯度爆炸的影响,整个模型难以训练成功。解决的方法之一是人为地让神经网络某些层跳过下一层神经元的连接(跳远连接),隔层相连,弱化每层之间的强联系。从而构建能够训练深层网络的Residual Networks(ResNets)。
Residual Networks由许多隔层相连的神经元子模块组成,称之为Residual block。
Residual block:
上图中红色部分就是“skip connection”或“short cut”,而ResNet块将信息流的传播过程增加了一个从a[l]直接到z[l+2]的连接。
a[l]直接隔层与下一层的线性输出后,非线性Relu激活函数前相连,与z[l+2]共同通过激活函数(ReLU)输出a[l+2]。
其前向传播的计算步骤为:
该模型由Kaiming He, Xiangyu Zhang, Shaoqing Ren和Jian Sun共同提出。由多个Residual block组成的神经网络就是Residual Network。实验表明这种模型结构对于训练非常深的神经网络效果很好。另外为便于区分,我们把非Residual Networks称为Plain Network。
Residual Network的结构
从下面两张图的对比中可以看出:
下面用个例子来解释为什么ResNets能够训练更深层的神经网络。
下图所示的是CNN中ResNets的结构:
残差网络作用:残差块学习恒等函数非常容易,能确定网络性能不会影响,甚至可以提高效率。
Min Lin, Qiang Chen等人提出了一种新的CNN结构,即1x1 Convolutions,也称Networks in Networks。这种结构的特点是滤波器算子filter的维度为1x1。对于单个filter,1x1的维度,意味着卷积操作等同于乘积操作。
那么,对于多个filters,1x1 Convolutions的作用实际上类似全连接层的神经网络结构。效果等同于Plain Network中到的过程。这点还是比较好理解的。
1*1卷积:遍历36个单元格,计算左图32个数字与过滤器32个元素的乘积,然后用RELU非线性函数。用36个数字乘以输入层上1*1切片,得到一个输出。32个单元格都应用了一个全连接网络,全连接的作用是输入32个单元与过滤器数量,在36个单元上重复。
1x1 Convolutions可以用来缩减输入图片的通道数目。方法如下图所示:
注:立体三维过滤器一次卷积输出的是一张二维图片,故有多少个过滤器就有多少个输出通道。
使用32个filter,每个filter尺寸1*1*192,结果使信道数量压缩。
1*1的卷积核得到一个相同长宽但第三维度变成卷积核个数的图片。
1x1卷积应用:
之前我们介绍的CNN单层的滤波算子filter尺寸是固定的,1x1或者3x3等。而Inception Network在单层网络上可以使用多个不同尺寸的filters,进行same convolutions,把各filter下得到的输出拼接起来。除此之外,还可以将CONV layer与POOL layer混合,同时实现各种效果。但是要注意使用same pool。
Inception Network由Christian Szegedy, Wei Liu等人提出。与其它只选择单一尺寸和功能的filter不同,Inception Network使用不同尺寸的filters并将CONV和POOL混合起来,将所有功能输出组合拼接,再由神经网络本身去学习参数并选择最好的模块。
Inception Network在提升性能的同时,会带来计算量大的问题。例如下面这个例子:
此CONV layer需要的计算量为:28x28x32x5x5x192=120M,其中m表示百万单位。可以看出但这一层的计算量都是很大的。为此,我们可以引入1x1 Convolutions来减少其计算量,结构如下图所示:
注:计算量的公式=输出值的个数*每个数字需执行的乘法运算;
输出:28*28*32;
每个输出值执行的乘积运算:5*5*192;
通常我们把该1x1 Convolution称为“瓶颈层”(bottleneck layer)。引入bottleneck layer之后,总共需要的计算量为:28x28x16x192+28x28x32x5x5x16=12.4m。明显地,虽然多引入了1x1 Convolution层,但是总共的计算量减少了近90%,效果还是非常明显的。由此可见,1x1 Convolutions还可以有效减少CONV layer的计算量。
以1×11×1卷积核作为bottleneck layer”的过渡层能够有效减小卷积神经网的计算成本。事实证明,只要合理地设置“bottleneck layer”,既可以显著减小上层的规模,同时又能降低计算成本,从而不会影响网络的性能。
上一节我们使用1x1 Convolution来减少Inception Network计算量大的问题。引入1x1 Convolution后的Inception module如下图所示:
多个Inception modules组成Inception Network,效果如下图所示:
上述Inception Network除了由许多Inception modules组成之外,值得一提的是网络中间隐藏层也可以作为输出层Softmax,有利于防止发生过拟合。
inception network作用:代替人工确定卷积层中的滤波器类型,或确定是否需要创建卷积层或池化层。由网络自行确定这些参数,可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习需要什么参数,采用哪些过滤器组合。
本节主要介绍GitHub的使用,GitHub是一个面向开源及私有软件项目的托管平台,上面包含有许多优秀的CNN开源项目。关于GitHub具体内容不再介绍,有兴趣的小伙伴自行查阅。
选择一个喜欢的架构,寻找其开源实现(github),并使用网络进行迁移学习。
小数据集:
如今在深度学习领域,许多研究者都会将他们的工作共享到网络上。在我们实施自己的工作的时候,比如说做某种物体的识别分类,但是只有少量的数据集,对于从头开始训练一个深度网络结构是远远不够的。
但是我们可以应用迁移学习,应用其他研究者建立的模型和参数,用少量的数据仅训练最后自定义的softmax网络。从而能够在小数据集上达到很好的效果。
技巧:
大数据集:
如果我们在自己的问题上也拥有大量的数据集,我们可以多训练后面的几层。总之随着数据集的增加,我们需要“ freeze”的越来越少。最后如果我们有十分庞大的数据集,那么我们可以训练网络模型的所有参数,将其他研究者训练的模型参数作为参数的初始化来替代随机初始化,来加速我们模型的训练。
总体来说,迁移学习的应用场合主要包括三点:
Task A and B have the same input x.
You have a lot more data for Task A than Task B.
Low level features from A could be helpful for learning B
数据扩充的方法:
常用的Data Augmentation方法是对已有的样本集进行Mirroring和Random Cropping。
另一种Data Augmentation的方法是color shifting。color shifting就是对图片的RGB通道数值进行随意增加或者减少,改变图片色调。
除了随意改变RGB通道数值外,还可以更有针对性地对图片的RGB通道进行PCA color augmentation,也就是对图片颜色进行主成分分析,对主要的通道颜色进行增加或减少,可以采用高斯扰动做法。这样也能增加有效的样本数量。具体的PCA color augmentation做法可以查阅AlexNet的相关论文。
最后提一下,在构建大型神经网络的时候,data augmentation和training可以由两个不同的线程来进行。
计算机视觉是在试图学习一个非常复杂的功能,经常没有足够的数据来做更大的data满足我们的需要,所以计算机视觉更多的依赖于手工工程,这也是计算机相当复杂的网络架构的原因,因为在缺乏更多的数据情况下,获得良好的表现方式还是花更多的时间进行架构设计。
在有大量数据的时候,我们更倾向于使用简单的算法和更少的手工工程。因为此时有大量的数据,我们不需要为这个问题来精心设计特征,我们使用一个大的网络结果或者更简单的模型就能够解决。
相反,在有少量数据的时候,我们从事更多的是手工工程。因为数据量太少,较大的网络结构或者模型很难从这些少量的数据中获取足够的特征,而手工工程实际上是获得良好表现的最佳方式。
值得一提的是hand-engineering是一项非常重要也比较困难的工作。很多时候,hand-engineering对模型训练效果影响很大,特别是在数据量不多的情况下,这就需要用到transfer learning。
hand-engineering source of knowledge:
在模型研究或者竞赛方面,有一些方法能够有助于提升神经网络模型的性能:
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.
将数据扩展应用到测试图像的形式
但是由于这两种方法计算成本较大,一般不适用于实际项目开发。
要灵活使用开源代码:
Use archittectures of networks published in the literature
Use open source implementations if possible(学习速率衰减、超参数)
Use pretrained models and fine-tune on your dataset(预先训练模型,微调)