GoogleNetv1,ResNet,DenseNet总结

首先引出看别人笔记时发现的一张图:

这张图可能有点老了,没有加上后来的DenseNet。从时间线上来说,先有GoogleNet,再有ResNet,然后有DenseNet。

 

自AlexNet提出以来,主流网络结构突破主要在于网络更深(层数多),更宽(神经元)。GoogleNet的提出,主要着力于在增加网络深度宽度的同时减少参数。inception块结构图如下:

传统的卷积神经网络中,每一层都会从之前的层提取信息,以便将输入数据转换成更有用的表征。但是,不同类型的层会提取不同种类的信息。5×5 卷积核的输出中的信息就和 3×3 卷积核的输出不同,又不同于最大池化核的输出。但是,什么样的变换才能提供最“有用”的信息?基于这一问题,Inception 模块会并行计算同一输入映射上的多个不同变换,并将它们的结果都连接到单一一个输出,即让模型选择(这里好像是借鉴了一个关于灵长类动物视觉皮质的神经系统模型的做法 Thomas Serre, Lior Wolf, Stanley M. Bileschi, Maximilian Riesenhuber, and Tomaso Poggio. Robust object recognition with cortex-like mechanisms. IEEE Trans. Pattern Anal. Mach. Intell., 29(3):411–426, 2007. )。对于每一个层,Inception 都会执行 5×5 卷积变换、3×3 卷积变换和最大池化,因为不同尺寸的卷积核能看到网络不同视野的信息,如此便增强了网络的尺度适应性。但是这样一来,并排堆叠多个不同的过滤器更会极大增加每一层的特征映射的数量,计算成本大大增加了。于是采用了bottleneck layer,用1*1的卷积来压缩维度,减少特征图厚度。(bottleneck layer好像经常在网络中出现,源自 Min Lin, Qiang Chen, and Shuicheng Yan. Network in network. CoRR, abs/1312.4400, 2013. )多个inception块结合成googlenetv1:

网络足够深时,如何有效地进行后向传播就是一个问题了。作者发现相对浅层的网络表现较好,说明网络中部层产生的特征较有区分度。因此添加辅助分类器(如图中额外延伸出来的枝干),将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中。这样有利于增强分类器低层表现,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化。

为什么随着网络层数增加,准确率会开始下降?假设已经构建了一个n 层网络,并且实现了一定准确度。那么一个 n+1 层网络至少也应该能够实现同样的准确度——只要简单复制前面 n 层,再在最后一层增加一层恒等映射就可以了。类似地,n+2、n+3 和 n+4 层的网络都可以继续增加恒等映射,然后实现同样的准确度。但是在实际情况下,这些更深度的网络基本上都会表现得更差。

ResNet 的作者将这些问题归结成了一个单一的假设:直接映射是难以学习的。而且他们提出了一种修正方法:不再学习从 x 到 H(x) 的基本映射关系,而是学习这两者之间的差异,也就是「残差(residual)」。然后,为了计算 H(x),我们只需要将这个残差加到输入上即可。残差块如下图:

那么为什么F(x)就更好学习呢?

这里套用deeplearning课程中吴恩达给出的解释:

对于输入输出维度可能不同的情况,给出了2种残差块形式:

A. shortcut使用恒等映射,对增加的维度用0来填充,不引入额外参数;

B. 投影shortcut用于匹配维数(由1×1卷积完成)。

具体详情见我的博客 https://blog.csdn.net/stezio/article/details/81238838

bottleneck  layer在此处也被使用:

DenseNet的提出仍然是针对梯度消失问题。作者在对之前的ResNet,Highway Networks,Stochastic depth,FractalNets等等进行总结过后,归纳出了一条关键特征:它们都从浅层到深层创建了short paths。

基于这种理念提出了“将所有层直接连接”的DenseNet:

与ResNet求和不同,DenseNet将所有前置网络的特征图作为输入:

定义H_{l()由连续的3个连贯操作组成:batch nomalization,ReLU,和3*3的conv。后来为了减少参数,在3*3卷积层前加了1*1的bottleneck。

对于上式可能出现的特征图大小不一致的情况,将结构分成danse块,各个dense block的feature map大小统一。中间加上包含batch nomalization,1*1卷积层和2*2池化层的transition layer,在transition layer中设置压缩因子\Theta,使得该层输出\Theta m个特征图,当\Theta <1时,称模型为DenseNet-C,实验中设置\Theta =0.5

对于函数H_{l}()设有k个特征图作为输出,那么第l层有k_{0}+k\times (l-1)输入的特征图(k_{0}是输入层的n_{c})。作者认为DenseNet和其他网络的重要不同在于DenseNet可以有“很窄”的层(比如k=12).k被定义为网络的growth rate。实验证明一个较小的k表现出色,对此解释是同一个block中每一层都能访问到前置层,作为网络的“network knowledge”,可以将特征图看作网络的“全局状态”,每一层在这个状态中加上k个特征图,因而称为增长率。

DenseNet同样也用到了bottleneck layer(之前在最开始已经提过),用了bottleneck layer的称为DenseNet-B。用了压缩因子称为DenseNet-C。既有bottleneck layer,又有Translation layer的称为DenseNet-BC。

作者认为,连接不同层学习的特征图以增加后续层输入的变化并提升效率,也就是作者所强调的“特征重用”,是DenseNet和ResNet主要的不同之处。而相较于Inception networks,DenseNet更简单有效。

部分理解参考于https://www.sohu.com/a/166062301_465914

猜你喜欢

转载自blog.csdn.net/stezio/article/details/81411657