【CS231n 课程笔记】第九讲----- Alexnet,VGG,Googlenet,Restnet等CNN架构

本文详细介绍了从AlexNet到ResNet的深度学习卷积神经网络发展,包括VGGNet、GoogleNet及其inception模块、ResNet的残差学习和ResNet改进,以及 DenseNet 的密集连接。通过对这些经典模型的分析,揭示了深度学习在解决计算效率和梯度消失问题上的创新思路。
摘要由CSDN通过智能技术生成

目录

1.AlexNet

2.VGGNet

3.GoogleNet

inception模块

4.ResNet

5.总结

6.NIN

7.ResNet改进

8.FractalNet 分形网络

9.DenseNet 密集连接卷积网络

10.SqueezeNet

11.课程总结


1.AlexNet

层结构:

AlexNet于2012年被提出,一共有8层,Alexnet有六千万个参数。

 

2.VGGNet

VGGNet于2014年被提出,有16层或者19层。

       

vggnet的思想是用一个非常深的网络包含非常小的卷积核,网络只关注相邻的像素,网络保持3*3的卷积核,定期下采样,这种思想贯穿整个网络,非常简练优雅。

问题一:为什么要用小的卷积核呢?

               因为可以得到比较小的参数量,每一层的参数量少意味着可以用更深的网络和更多的卷积核,最终效果比用7*7的卷积核,但层数少一些的网络效果更好

问题二:3*3的卷积核步长为1,感受野是多少?

               第一层的感受野是3*3,也就是卷积核的大小。那么第二层相对于原图像的感受野是多少呢?我这里画了一个示意图,第一层卷积核卷积操作后映射到第2层的第一行有三个点,这三个点对应的是第一层由5列的像素点,意思就是第二层的这三个点跟第一层的五列图像都相关,那么第二层的3*3的像素点,就反应了第一层的某5*5的像素值。

                

               所以同理可得,第三层的卷积核感受野达到了7*7,也就是说,第3层某3*3的数值,反应了原图里7*7的数值。

这里引申出了问题三:为什么要用一样的3*3的卷积核?

                  因为,即使是用3*3的卷积核,三层之后感受野也达到了7*7,也能达到7*7卷积核的感受野。但是网络层数会加深,可能有更多非线性操作而且有更少的参数。三层3*3的卷积核参数是27,而一层7*7的参数是49。

我们来看前向传播层数和所需要的内存:

每个数字4字节,每一张图片需要100M的内存,仅仅是对前向传播这已经是非常大的内存使用,当做反向传播时,要保存更多的参数。因为我们要在反向传播中用到前向传播的这些参数,所以大多数数值需要被存储。每张图片100M,如果总内存是5G,那么最多也只能存50张。这个网络中,我们一共有1亿三千八百万个参数,Alexnet有六千万个。

然后我们来看看内存分布和参数分布,可以看到大多数内存分布都在前面的卷积层,后面的全连接层很少,但大量的参数实际上是在后面全连接层里,因为全连接层有很多密集的连接。

VGGNet和AlexNet一样,都不需要局部响应归一化。

 

3.GoogleNet

GoogleNet是一个更深的网络结构,有22层,是2014年提出来的。

它里面针对计算有效性的问题提出了一个特别的想法,它尝试设计一个网络架构可以高效地进行计算,它采用了inception模块,然后在每一层顶部搭这个模块,在网络中没有全连接层,所以可以节省大量参数。总共有500万个参数,比AlexNet少了12倍。

inception模块

                                            

inception模块中隐含是思想就是想要设计一个好的局部网络拓扑,有了局部网络拓扑的思想就可以把它视为一个网络,然后在每层顶部堆放大量局部拓扑。在局部网络中调用inception模块,要做的就是对进入相同层的相同输入并行应用不同类别的卷积操作,对来自前面层的输入做不同类别的filter,比如1*1卷积,3*3卷积,5*5卷积,或者池化操作等,这样就可以在不同的层里得到不同输出,然后把所有这些filter输出并在某层面上(图中第3层),然后串联在一起,然后在最后得到一个张量输出(图中第3层)。这个张量将进入下一层。简单描述就是用不同的操作得到不同输出,然后将这些输出串联在一起。

但是这样就会存在计算复杂性的问题:

比如用128个1*1的卷积核卷积,192个3*3卷积,96个5*5卷积,假设所有步长都是1,然后一个一个输入进来,图中第一个卷积核输出尺寸是28*28*128,同理得到另外几个filter的输出尺寸(这里我们为了保证输出的长宽一直,用了padding):

从深度上串联后,现在我们来看卷积核串联后的输出尺寸,可以得到:

                        

需要注意一点的是,如果里面有池化层,那么池化层肯定会保留原输入全部深度,这里也就是256,另外的卷积层会提供另一些深度,这里就是128+192+96,所以如果有池化层,那么输出的深度肯定大于等于原始输入深度。

所以经过不同filter处理后,我们的输出是28*28*672,我们保留了相同的尺寸,但是扩充了深度。然后看一下一共做了多少次运算:

这里一共做了8.54亿次运算,所以计算量非常大,googlenet解决的办法是增加一层瓶颈层,并且在卷积运算之前降低特征图维度,比如在上面例子中我们在输入到第2层之前先做一个1*1卷积,选用卷积核个个数是原始深度的一半,这样卷积之后的输入是28*28*128,就好像是对原图进行了一次线性组合,再把这个作为输入输到上面的第2层。如图:

在3*3和5*5卷积之前会先通过一个1*1的卷积核,降低深度,在池化层后一经过一个1*1的卷积,这些就是添加进来的1*1的瓶颈层。我们可以看一下现在的输出规模和刚刚的作对比:

我们减少了进入3*3,5*5卷积层的输入,在池化层结束后,我们也可以减小输出的深度。运算量:

总的运算量是3.58亿次,比之前8.54亿次少了一半。所以巧妙运行1*1的卷积核控制计算也是很棒的,深度增加的同时维度还减小了。

GoogleNet做的就是这些模块,然后把这些模块放在网络里面,我们来看一些细节。

开始是进入蓝色框中的普通卷积层和池化层,然后到达堆叠的inception模块中,

然后在末端分类输出,末端没有代价高的全连接层,没有全连接层这个模型工作得也很好,也可以减少很多参数。

蓝色框中有两个额外分支,它们是辅助分类输出,里面有1*1卷积降维,还有全连接层,最后是softmax层

这两个框加上网络末端的输出,所以网络有三个地方可以通过分类损失训练网络,可以看成三个反向传播,这样可以得到更多的梯度训练,这些中间层也是有用的,信息含量也很高,也可以用来作为输出训练网络,这样整个网络就利用了更多信息训练。

 

4.ResNet

深度残差网络,这个想法可以说是深度网络的一次革命,它有152层,是2015年提出来的。

ResNet在当时是最深的网络,通过使用这些数据的残差层来实现。

我们在回顾一下其他正常网络,举个例子VGG网络,它通过串联卷积层和池化层增加网络深度,那么我们能仅仅通过持续扩展这些层,得到更多的深度就能取得更好的效果吗?

如图所示,在普通网络中用20层和56层效果如图,右边测试误差中,56层网络表现不如20层网络,所以层数加深不一定能改善效果。但是令人奇怪的是,在左边的训练误差图上,56层网络居然效果也不如20层,常规情况下,层数加深,参数加深,训练数据不足很容易过拟合,这时候训练误差就会很小了,但是实际上56层网络训练误差也这么高。这里模型加深,训练误差和测试误差都更高。ResNet的作者表明,这个问题实际上是一个优化问题,相对于浅的网络,更深的网络更难以优化。

如果我们从一个较浅的模型中把一些层通过恒等映射映射到更深层的网络里,那么这个更深的模型至少能够和浅的模型表现得一样好。所以如何让模型更高效地使用这种方法,ResNet的办法是不仅仅是堆叠这些层,而是每层都尝试学习一些所需函数的底层映射,残差思想尝试拟合残差映射,而不是直接映射。

如图右所示,残差块的输入是传输进来的原始输入,然后输出的是F(x)=H(x)-X,代替原来的输出H(x)。这些残差网络是通过一些快捷连接,也就是小的残差块,我们将输入通过残差块得到输出,然后再添加输入到残差块从卷积层得到输出,它有两个很好的属性:

一是如果我们把残差块中所有权值设为0,那么所有的残差块就是恒等的,所以从某种程度上来说,这个模型是相对容易去训练的,并不需要添加额外的层,另外在神经网络中,添加L2正则化的原因是一旦使用了L2正则化,网络中的权值将迫使所有的参数趋近于0,如果残差块中所有的参数逐渐趋于0,那就会促使模型没办法使用,因为它只是趋势残差块趋向同一性,也就不需要进行分类。 

另一个有用的属性是残差网络与反向路径中的梯度流有关,这里提一下反向传播中加法门的原理,当上游梯度通过一个加法门时,它将沿着两个不同的路径等值传播,所以当上游梯度传到残差块时,它将通过这些卷积块,但它也会通过这些残差连接,直接连接到梯度,所以可以看到当这些残差块堆叠在一起时,网络会有几百个甚至上千个层,然后这些残差连接提供给梯度一个超级“高速公路”,使梯度在整个网络中进行反向传播,这使网络能更容易更快地训练,所以即使模型有几百层深度,也能很好收敛。 

resnet做的是堆叠这些残差块,使用残差块数量两倍的卷积核以步幅为2进行下采样,在网络开始的地方有额外卷积层,在网络末端没有任何全连接层,并且只有一个全局的平均池化层,输入到最后得1000种分类中。resnet的深度可以达到34、50、100甚至152层。resnet也使用与googlenet一样的瓶颈层来提高效率:

所以每个块现在先用1*1的卷积核减少深度,但最后输入和输出的深度是保持一致的。

resnet在每个卷积层之后也使用批正则化,使用Xavier来使梯度下降法和momentum工作得更好,也使用变换的学习率,当验证错误率变换到很小时,降低学习率。minibatch大小为256,不使用droupout。

5.总结

最开始出现的是Alexnet,googlenet和VGG也很流行,但是resnet是最近一段时间以来表现最好的模型。然后是算法性能的图:

 

6.NIN

引入了MLP网络层,

在每个卷积层中,在标准卷积操作后面叠加一个全连接的MLP层,它就能够为局部图像块计算更多的抽象特征。

 

7.ResNet改进

1.2016年resnet作者进行了改进,它们调整了resnet block里面的层

2.他们的另一个观点存在这种残差结构并不代表网络层数很多,所以他们使用更宽的残差模块,这意味着在每个转换层都有更多的卷积核,结果表示,仅用50层的宽残差网络表现就能优于resnet原来的152层网络,它还有一个附加的优点就是使用同样数量的参数,它的计算效率更高,而且可以进行并行运算。

3.ResNext

resnext为了解决宽度问题不是通过增加架构中的卷积核,而是在每个残差模块内建立多分支,这些分支的总和被称为基数,也就是取出一个含有瓶颈层的resnet模块,让每个模块卷积个数少一点,但有很多分支。

4.运行随机深度的概念

当网络越深,往往就会碰到梯度消失的问题,因此这种改进方法作者提出在训练时让网络变得更“浅”,这种方法会随机抛弃一组子层集的权重,只把它们作为恒等连接,这样网络在训练时变得更短了,这样可以将梯度更好地反向传播,这样也更高效,在训练的时候随机抛弃,测试的时候再使用完整的训练好的深度网络。

 

8.FractalNet 分形网络

这是2017年提出的网络,它的观点是引入残差可能并不是必须的,作者认为,关键在于有效地从浅层网络转型为深层网络,所以他用了这种分形网络,

如右图,里面各层都以分形的形式存在,因此,同时存在浅层和深层路径。可以看到这里有不同长度的路径,它们通过抛弃子路径的方式来训练,所以也具有droupout的特点。在测试的时候,再使用整个分形网络,它的运行效果也很棒。

 

9.DenseNet 密集连接卷积网络

运用这些密集区块模块,在模块内,每层都与其后所有层以前馈方式连接相连,因此在这个区块内,对区块的输入也是对其后所有各层卷积层的输入。计算出每一个卷积输出,这些输出与其后所有的层都相连,然后计算这些值,集中起来,共同作为最后面卷积层的输入 ,然后其中也会做其他操作来降低输入的维度,提高效率。他们的主要结论是这种方法能缓解梯度消失的问题,因为这里用到了密度很高的连接,它能强化特征图的传递,鼓励特征的再利用。

 

10.SqueezeNet

上面8,9网络跑出来的准确率不输ResNet,但是squeezenet准确率没这么高。

它关注的是高效网络,它由一个个fire模块组成,每个模块都含有一个squeeze(挤压)层和许多1*1的卷积核,接着,它再传递给一个扩大层,含有一些1*3和3*3的网络

利用这样的架构,该网络在Imagenet分类上鞥达到AlexNet水平的准确率,但参数却只要五十分之一,网络还可以进一步压缩,变成AlexNet的500分之一,仅仅有50万参数,这就为我们提供了如何有效压缩网格大小的示范。

 

11.课程总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值