经典网络结构(LeNet , AlexNet , VGG , GoogLeNet)剖析

github博客传送门
csdn博客传送门

参考: https://my.oschina.net/u/876354/blog/1797489

LeNet

  1. C1层(卷积层):6@28×28
    (1)特征图大小 ->(32-5+1)×(32-5+1)= 28×28
    (2)参数个数 -> 5×5+1)×6= 156 其中5×5为卷积核参数,1为偏置参数
    (3)连接数 -> 该层的连接数为(5×5+1)×6×28×28=122304

  2. S2层(下采样层,也称池化层):6@14×14
    (1)特征图大小
    这一层的计算过程是:2×2 单元里的值相加,然后再乘以训练参数w,再加上一个偏置参数b(每一个特征图共享相同的w和b),然后取sigmoid值(S函数:0-1区间),作为对应的该单元的值。
    (2)参数个数 -> 2×6=12个参数
    (3)连接数 -> 该层的连接数为(2×2+1)×14×14×6 = 5880

  3. C3层(卷积层):16@10×10
    (1)特征图大小 ->(14-5+1)×(14-5+1)= 10×10
    (2)参数个数 -> C3层的参数数目为(5×5×3+1)×6 +(5×5×4+1)×9 +5×5×6+1 = 1516
    (3)连接数 -> 特征图大小为10×10,参数数量为1516,因此连接数为1516×10×10= 151600

  4. S4(下采样层,也称池化层):16@5×5
    (1)特征图大小 -> 与S2的分析类似,池化单元大小为2×2,因此,该层与C3一样共有16个特征图,每个特征图的大小为5×5。
    (2)参数数量 -> 与S2的计算类似,所需要参数个数为16×2 = 32
    (3)连接数 -> 连接数为(2×2+1)×5×5×16 = 2000

  5. C5层(卷积层):120
    (1)特征图大小 -> 120个卷积核,每个卷积核5×5,120个特征图,因此特征图大小为(5-5+1)×(5-5+1)= 1×1。
    (2)参数个数 -> 本层的参数数目为120×(5×5×16+1) = 48120
    (3)连接数 -> 由于该层的特征图大小刚好为1×1,因此连接数为48120×1×1=48120

  6. F6层(全连接层):84
    (1)特征图大小 -> F6层有84个单元,之所以选这个数字的原因是来自于输出层的设计,对应于一个7×12的比特图,如下图所示,-1表示白色,1表示黑色,这样每个符号的比特图的黑白色就对应于一个编码。
    该层有84个特征图,特征图大小与C5一样都是1×1,与C5层全连接。
    (2)参数个数 -> 由于是全连接,参数数量为(120+1)×84=10164。
    (3)连接数 -> 由于是全连接,连接数与参数数量一样,也是10164。

  7. OUTPUT层(输出层):10
    Output层也是全连接层,共有10个节点,分别代表数字0到9。如果第i个节点的值为0,则表示网络识别的结果是数字i。
    (1)特征图大小 -> 该层采用径向基函数(RBF)的网络连接方式,假设x是上一层的输入,y是RBF的输出,则RBF输出的计算方式是:
    (类似平方差求和)
    上式中的Wij的值由i的比特图编码确定,i从0到9,j取值从0到7×12-1。RBF输出的值越接近于0,表示当前网络输入的识别结果与字符i越接近。
    (2)参数个数 -> 由于是全连接,参数个数为84×10=840
    (3)连接数 -> 由于是全连接,连接数与参数个数一样,也是840

AlexNet

AlexNet之所以能够成功,跟这个模型设计的特点有关,主要有:
使用了非线性激活函数:ReLU
防止过拟合的方法:Dropout,数据扩充(Data augmentation)
其他:多GPU实现,LRN归一化层的使用

  1. ReLU
    计算量大大减小 , 收敛速度变快

  2. 数据扩充
    最简单、通用的图像数据变形的方式:水平翻转图像,从原始图像中随机裁剪、平移变换,颜色、光照变换
    AlexNet在训练时,在数据扩充(data augmentation)这样处理:
    (1)随机裁剪,对256×256的图片进行随机裁剪到224×224,然后进行水平翻转,相当于将样本数量增加了((256-224)^2)×2=2048倍;
    (2)测试的时候,对左上、右上、左下、右下、中间分别做了5次裁剪,然后翻转,共10个裁剪,之后对结果求平均。作者说,如果不做随机裁剪,大网络基本上都过拟合;
    (3)对RGB空间做PCA(主成分分析),然后对主成分做一个(0, 0.1)的高斯扰动,也就是对颜色、光照作变换,结果使错误率又下降了1%。

  3. 重叠池化
    在AlexNet中使用的池化(Pooling)却是可重叠的,也就是说,在池化的时候,每次移动的步长小于池化的窗口长度。
    AlexNet池化的大小为3×3的正方形,每次池化移动步长为2,这样就会出现重叠。重叠池化可以避免过拟合,这个策略贡献了0.3%的Top-5错误率。

  4. 局部归一化(Local Response Normalization,简称LRN)
    在神经生物学有一个概念叫做“侧抑制”(lateral inhibitio),指的是被激活的神经元抑制相邻神经元。
    归一化(normalization)的目的是“抑制”,局部归一化就是借鉴了“侧抑制”的思想来实现局部抑制,
    尤其当使用ReLU时这种“侧抑制”很管用,因为ReLU的响应结果是无界的(可以非常大),所以需要归一化。
    使用局部归一化的方案有助于增加泛化能力。

  5. Dropout
    引入Dropout主要是为了防止过拟合。在神经网络中Dropout通过修改神经网络本身结构来实现,
    对于某一层的神经元,通过定义的概率将神经元置为0,这个神经元就不参与前向和后向传播,
    就如同在网络中被删除了一样,同时保持输入层与输出层神经元的个数不变,然后按照神经网络的学习方法进行参数更新。
    在下一次迭代中,又重新随机删除一些神经元(置为0),直至训练结束。
    Dropout应该算是AlexNet中一个很大的创新,以至于“神经网络之父”Hinton在后来很长一段时间里的演讲中都拿Dropout说事。
    Dropout也可以看成是一种模型组合,每次生成的网络结构都不一样,通过组合多个模型的方式能够有效地减少过拟合,
    Dropout只需要两倍的训练时间即可实现模型组合(类似取平均)的效果,非常高效。

VGG

1、结构简洁
VGG由5层卷积层、3层全连接层、softmax输出层构成,层与层之间使用max-pooling(最大化池)分开,所有隐层的激活单元都采用ReLU函数。

2、小卷积核和多卷积子层
VGG使用多个较小卷积核(3x3)的卷积层代替一个卷积核较大的卷积层,一方面可以减少参数,另一方面相当于进行了更多的非线性映射,可以增加网络的拟合/表达能力。
小卷积核是VGG的一个重要特点,虽然VGG是在模仿AlexNet的网络结构,但没有采用AlexNet中比较大的卷积核尺寸(如7x7),
而是通过降低卷积核的大小(3x3),增加卷积子层数来达到同样的性能(VGG:从1到4卷积子层,AlexNet:1子层)。
VGG的作者认为两个3x3的卷积堆叠获得的感受野大小,相当一个5x5的卷积;而3个3x3卷积的堆叠获取到的感受野相当于一个7x7的卷积。
这样可以增加非线性映射,也能很好地减少参数(例如7x7的参数为49个,而3个3x3的参数为27)

  1. 输入224x224x3的图片,经64个3x3的卷积核作两次卷积+ReLU,卷积后的尺寸变为224x224x64
  2. 作max pooling(最大化池化),池化单元尺寸为2x2(效果为图像尺寸减半),池化后的尺寸变为112x112x64
  3. 经128个3x3的卷积核作两次卷积+ReLU,尺寸变为112x112x128
  4. 作2x2的max pooling池化,尺寸变为56x56x128
  5. 经256个3x3的卷积核作三次卷积+ReLU,尺寸变为56x56x256
  6. 作2x2的max pooling池化,尺寸变为28x28x256
  7. 经512个3x3的卷积核作三次卷积+ReLU,尺寸变为28x28x512
  8. 作2x2的max pooling池化,尺寸变为14x14x512
  9. 经512个3x3的卷积核作三次卷积+ReLU,尺寸变为14x14x512
  10. 作2x2的max pooling池化,尺寸变为7x7x512
  11. 与两层1x1x4096,一层1x1x1000进行全连接+ReLU(共三层)
  12. 通过softmax输出1000个预测结果

GoogLeNet

GoogLeNet(从Inception v1到v4的演进)

2014年,GoogLeNet和VGG是当年ImageNet挑战赛(ILSVRC14)的双雄,GoogLeNet获得了第一名、VGG获得了第二名,这两类模型结构的共同特点是层次更深了。
VGG继承了LeNet以及AlexNet的一些框架结构(详见 大话CNN经典模型:VGGNet),而GoogLeNet则做了更加大胆的网络结构尝试,虽然深度只有22层,但大小却比AlexNet和VGG小很多,
GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,
因此在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。

解决深度网络(过拟合, 参数过多, 梯度弥散)这些问题的方法当然就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。
但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。

那么,有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能, 如人类的大脑是可以看做是神经元的重复堆积,因此,GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。

一、Inception V1
通过设计一个稀疏网络结构,但是能够产生稠密的数据,既能增加神经网络表现,又能保证计算资源的使用效率。谷歌提出了最原始Inception的基本结构:
该结构将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。

  1. 输入
    原始输入图像为224x224x3,且都进行了零均值化的预处理操作(图像每个像素减去均值)。
  2. 第一层(卷积层)
    使用7x7的卷积核(滑动步长2,padding为3),64通道,输出为112x112x64,卷积后进行ReLU操作
    经过3x3的max pooling(步长为2),输出为((112 - 3+1)/2)+1=56,即56x56x64,再进行ReLU操作
  3. 第二层(卷积层)
    使用3x3的卷积核(滑动步长为1,padding为1),192通道,输出为56x56x192,卷积后进行ReLU操作
    经过3x3的max pooling(步长为2),输出为((56 - 3+1)/2)+1=28,即28x28x192,再进行ReLU操作
    3a、第三层(Inception 3a层)
    分为四个分支,采用不同尺度的卷积核来进行处理
    (1)64个1x1的卷积核,然后RuLU,输出28x28x64
    (2)96个1x1的卷积核,作为3x3卷积核之前的降维,变成28x28x96,然后进行ReLU计算,再进行128个3x3的卷积(padding为1),输出28x28x128
    (3)16个1x1的卷积核,作为5x5卷积核之前的降维,变成28x28x16,进行ReLU计算后,再进行32个5x5的卷积(padding为2),输出28x28x32
    (4)pool层,使用3x3的核(padding为1),输出28x28x192,然后进行32个1x1的卷积,输出28x28x32。
    将四个结果进行连接,对这四部分输出结果的第三维并联,即64+128+32+32=256,最终输出28x28x256
    3b、第三层(Inception 3b层)
    (1)128个1x1的卷积核,然后RuLU,输出28x28x128
    (2)128个1x1的卷积核,作为3x3卷积核之前的降维,变成28x28x128,进行ReLU,再进行192个3x3的卷积(padding为1),输出28x28x192
    (3)32个1x1的卷积核,作为5x5卷积核之前的降维,变成28x28x32,进行ReLU计算后,再进行96个5x5的卷积(padding为2),输出28x28x96
    (4)pool层,使用3x3的核(padding为1),输出28x28x256,然后进行64个1x1的卷积,输出28x28x64。
    将四个结果进行连接,对这四部分输出结果的第三维并联,即128+192+96+64=480,最终输出输出为28x28x480
    第四层(4a,4b,4c,4d,4e)、第五层(5a,5b)……,与3a、3b类似,在此就不再重复。

二、Inception V2
GoogLeNet凭借其优秀的表现,得到了很多研究人员的学习和使用,因此GoogLeNet团队又对其进行了进一步地发掘改进,产生了升级版本的GoogLeNet。
GoogLeNet设计的初衷就是要又准又快,而如果只是单纯的堆叠网络虽然可以提高准确率,但是会导致计算效率有明显的下降,所以如何在不增加过多计算量的同时提高网络的表达能力就成为了一个问题。
Inception V2版本的解决方案就是修改Inception的内部计算逻辑,提出了比较特殊的“卷积”计算结构。

1、卷积分解(Factorizing Convolutions)
大尺寸的卷积核可以带来更大的感受野,但也意味着会产生更多的参数,比如5x5卷积核的参数有25个,3x3卷积核的参数有9个,前者是后者的25/9=2.78倍。
因此,GoogLeNet团队提出可以用2个连续的3x3卷积层组成的小网络来代替单个的5x5卷积层,即在保持感受野范围的同时又减少了参数量
可以看出,大卷积核完全可以由一系列的3x3卷积核来替代,那能不能再分解得更小一点呢?GoogLeNet团队考虑了nx1的卷积核,如下图所示,用3个3x1取代3x3卷积
因此,任意nxn的卷积都可以通过1xn卷积后接nx1卷积来替代。GoogLeNet团队发现在网络的前期使用这种分解效果并不好,在中度大小的特征图(feature map)上使用效果才会更好(特征图大小建议在12到20之间)。

三、Inception V3
Inception V3一个最重要的改进是分解(Factorization),将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加速计算,
又可以将1个卷积拆成2个卷积,使得网络深度进一步增加,增加了网络的非线性(每增加一层都要进行ReLU)。另外,网络输入从224x224变为了299x299。

四、Inception V4
Inception V4研究了Inception模块与残差连接的结合。ResNet结构大大地加深了网络深度,还极大地提升了训练速度,同时性能也有提升。
Inception V4主要利用残差连接(Residual Connection)来改进V3结构,得到Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4网络。

print_r('点个赞吧');
var_dump('点个赞吧');
NSLog(@"点个赞吧!")
System.out.println("点个赞吧!");
console.log("点个赞吧!");
print("点个赞吧!");
printf("点个赞吧!\n");
cout << "点个赞吧!" << endl;
Console.WriteLine("点个赞吧!");
fmt.Println("点个赞吧!")
Response.Write("点个赞吧");
alert(’点个赞吧’)
posted @ 2019-01-06 13:23  账号  阅读(2548)  评论(0编辑  收藏  举报