【CNN框架】--- VGG和ResNet

  • ResNet

    • Coding:https://github.com/antingshen/resnet-protofiles
    • showing:https://ethereon.github.io/netscope/#/editor
  • VGG

    • VGG16
      • 【CNN框架】--- VGG和ResNet_第1张图片

VGG

VGG, Visual Geometry Group Network, 该网络是由Visual Geometry Group团队所提出地

前言

VGG分为VGG16和VGG19,区别是网络的深度不同

组成

将conv与relu组合成一层卷积层

卷积层使用3×3的卷积核,个数取决于channel

之所以使用3×3的filter来代替5×5或7×7,因为可以增加卷积层的层数。因为多层非线性层可以增加网络深度来保证学习更加复杂的模式

能替代的原因:

【CNN框架】--- VGG和ResNet_第2张图片

结构

【CNN框架】--- VGG和ResNet_第3张图片

其中

  • D是VGG16,包含了16个隐藏层(13个卷积层和3个全连接层)
  • E是VGG19,包含了19个隐藏层(16个卷积层和3个全连接层)

CNN框架可视化工具

VGG网络

ResNet

Res, Deep Residual Network, 深度残差网络

高效地技巧:

  • 相比之前NN的层数多了非常多
  • 进行了Residual learning(残差学习)

深度网络的退化问题

从经验上看,网络的深度对性能至关重要,增加网络深度后,网络可以进行更加复杂的特征提取,现过更好。但是,达到一定的深度后会出现退化问题(Degradation problem),即准确度达到饱和,甚至出现下降。

残差学习

残差学习是用来用于解决随着层数的增加而出现的退化问题。

通过定义残差,当残差为0时,对于weight layer仅仅是恒等映射(++增加的层不进行学习,仅仅是复制浅层网络特征++),至少保证了网络的性能不会随之下降。但实际的残差不会是0,意味着weight layrt在输入特征的基础上学到了新的特征。

【CNN框架】--- VGG和ResNet_第4张图片

残差学习单元结构图

算术表达

  • 残差单元(通常每个残差单元包含多层结构)

    • ` y l = h ( x l ) + F ( x l , W l ) = x l + F ( x l , W l ) y_l=h(x_l)+F(x_l,W_l)=x_l+F(x_l,W_l) yl=h(xl)+F(xl,Wl)=xl+F(xl,Wl)
    • ` x l + 1 = R E L U ( y l ) x_{l+1}=RELU(y_l) xl+1=RELU(yl)
      • x l x_l xl是第` l l l个残差单元的输入
      • x l + 1 x_{l+1} xl+1是第` l l l个残差单元的输出
      • y l y_l yl只是一个中间变量
      • F ( ) F() F()是残差函数,表示学习到的残差
      • h ( x l ) = x l h(x_l)=x_l h(xl)=xl,表示恒等映射
      • R E L U ( ) RELU() RELU()是RELU激活函数
  • 从浅层 l l l到深层` L L L的特征学习

    • x L = x l + ∑ i = l L − 1 F ( x i , W i ) x_L=x_l+\sum_{i=l}^{L-1}F(x_i,W_i) xL=xl+i=lL1F(xi,Wi)
  • 根据链式法则,方向传播过程中的梯度:

    • ∂ l o s s ∂ x l = ∂ l o s s ∂ x L ⋅ ∂ x L ∂ x l = ∂ l o s s ∂ x L ⋅ ( 1 + ∂ ∂ x l ∑ i = l L − 1 F ( x i , W i ) ) \frac{\partial loss}{\partial x_l}=\frac{\partial loss}{\partial x_L} \cdot \frac{\partial x_L}{\partial x_l}=\frac{\partial loss}{\partial x_L} \cdot\left ( 1+\frac{\partial }{\partial x_l} \sum_{i=l}^{L-1}F(x_i,W_i) \right ) xlloss=xLlossxlxL=xLloss(1+xli=lL1F(xi,Wi))
      • ∂ l o s s ∂ x L \frac{\partial loss}{\partial x_L} xLloss表示loss function的梯度
      • 括号中的 1 1 1表明该方法可无损传播梯度,保证不会出现梯度消失的现象

ResNet网络结构

是对VGG19基础上进行的修改~

  • 使用stride=2进行subsampling
  • 使用global average pool layer代替FC layer
  • 原则是feature map大小降低一半时,feature map的数量增加一倍
【CNN框架】--- VGG和ResNet_第5张图片

ResNet网络结构图

随着网络层次的深入,残差单元会由2层变成3层间的残差学习

  • 【浅层】二层的filter大小是3×3,3×3
  • 【深层】三层的filter大小是1×1,3×3,1×1
【CNN框架】--- VGG和ResNet_第6张图片

不同层数的残差单元

不同深度的ResNet


【CNN框架】--- VGG和ResNet_第7张图片
  • 输入输出维度D相同时,可以直接进行加操作
  • 输入输出维度D不同时,不能直接进行加操作,有两种解决策略:
    • 采用zero-padding增加维度,此时一般要先做一个subsampling,可以采用strde=2的pooling,这样不会增加参数
    • 采用新的映射(projection shortcut),一般采用1x1的卷积,这样会增加参数,也会增加计算量。

参考资料

[1]. https://blog.csdn.net/u013709270/article/details/78838875

[2]. https://zhuanlan.zhihu.com/p/41423739

[3]. https://github.com/antingshen/resnet-protofiles

[4]. https://dgschwend.github.io/netscope/#/preset/vgg-16

你可能感兴趣的:(深度学习)