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

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

参考: http://www.javashuo.com/article/p-wtikiofi-gt.htmlgithub

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归一化层的使用google

  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

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

二、小卷积核和多卷积子层
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网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。

1、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相似,在此就再也不重复。

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

一、卷积分解(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之间)。

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

4、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(’点个赞吧’)
相关文章
相关标签/搜索