QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2988|回复: 0
打印 上一主题 下一主题

[其他资源] 轻量级神经网络算法-SqueezeNet

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组: 2018美赛大象算法课程

    群组: 2018美赛护航培训课程

    群组: 2019年 数学中国站长建

    群组: 2019年数据分析师课程

    群组: 2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-5 16:42 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta

    ! X- ]0 v4 }1 t# \' s$ D轻量级神经网络算法-SqueezeNet7 x2 e: W- |9 l+ z# v8 |8 O
    4. 轻量级神经网络算法目录
    ' s1 w& A* s# P轻量级神经网络算法# s' t, n9 [4 ~" v, A( w4 g/ y
    4.1 各轻量级神经网络算法总结对比; R& o2 S$ o  ~6 G
    4.2 SqueezeNet
    6 l1 ?8 j5 u( g4.3 DenseNet
    % |* T1 ~6 h6 ]$ R8 ~4.4 Xception
    % [0 l; |0 k# u4.5 MobileNet v1$ B9 {( |: e  I+ W% N
    4.6 IGCV- w% c$ f! A% C: I' }" ~4 D* `
    4.7 NASNet
    $ q9 b. i/ n, B- U2 @# ^, z  g% h7 V4.8 CondenseNet) S" }- @' m+ ]
    4.9 PNASNet# `# S: ^; T  a. A
    4.10 SENet" F  ?6 V) C" }0 c/ G
    4.11 ShuffleNet v1' D; ^7 A' \& B7 a' Y, E4 ]1 t- G
    4.12 MobileNet v2
    6 [% g9 _; {1 h) |' i4.13 AmoebaNet7 Q+ _* }0 t. B4 E
    4.14 IGCV2
    7 M9 C# a  Q! m! o* \0 }$ `! A1 |4.15 IGCV3$ J7 v( G# c: u
    4.16 ShuffleNet v2
    7 h: C; \. t/ N$ E9 T% e4.17 MnasNet1 P9 ^3 A+ Z& z1 o" @
    4.18 MobileNet v3. G, l, O. ~7 \) Z4 q  v
    深度学习知识点总结3 {4 M4 a7 V* |0 x; ?* M3 }1 o1 E

    ( R% S- N- n- X# a0 \. H* q4 w专栏链接:9 I/ W" i; C. q  R% q; Q: n4 H
    https://blog.csdn.net/qq_39707285/article/details/124005405
    9 n8 N8 P8 o: s, d$ F1 M' G( N本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
    0 N9 `0 d% d$ H6 m/ D7 x$ X+ r8 ]
    ( E( q& B8 E% i, Z; e本章目录
    ; k6 C, J( f) m+ y2 ^% Q4 B% R! w5 R4. 轻量级神经网络算法目录3 `$ J! o  d' ]3 E
    4.2 SqueezeNet
      h  L& ^, _6 a1 c4.2.1 问题分析" X# S7 y6 v& l/ e
    4.2.2 SqueezeNet的三大策略4 N# V  X* X: O. p) T$ ~# `  Q
    4.2.3 Fire模块
    , R6 A$ T# [! S% S! K4.2.4 SqueezeNet整理结构$ @7 O& i& l4 t6 E6 E0 p  w0 @
    4.2.5 代码实现SqueezeNet
    6 l- M7 w+ o0 I# `  E4.2.6 其他实现细节
    / f# ~  ^) ?( d# S! p8 m$ c0 s4.2.7 总结' X( }7 R$ z) O: l7 Z) ^8 M5 x
    4.2 SqueezeNet
    * S# H7 g/ }( _$ G4.2.1 问题分析
    $ U" x; O; \3 ~/ e; d最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:& W* l5 h; k2 a) J$ Y5 q/ f
    + w0 u. q2 k) i, |- n2 T! N+ s" w2 ]( D
    在分布式训练期间,较小的CNN需要较少的跨服务器通信
    : u4 \2 P1 w5 h$ S* ]) y0 f, f在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
    : x- s& Q. [- |! m1 S, @5 v较小的CNN更适合部署在FPGA和其他内存有限的硬件上
    ) ~# `7 O" \$ d, O, ]为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。9 y7 m$ R9 h" ?4 f/ H9 k" _

    0 |. h: t+ k5 [* y1 |) ~4.2.2 SqueezeNet的三大策略/ b/ b6 D0 N6 ]2 |, ^8 ]
    策略1:用1x1卷积代替3x3卷积
    ! r, m( I8 |$ \# ?1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
    . [9 [) b8 g6 \: L0 F- `3 I
    ! {/ h$ o" v( P0 H策略2:减少输入到3*3卷积核的通道数量" N  y+ Q  i$ Y0 E
    对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。$ g! N; J1 ~( i3 [! L0 e

    + l7 U/ m( M) U6 K/ E% K8 ~1 i5 s策略3:在网络后期再进行下采样,使卷积层具有较大的激活图5 t" P2 C7 O. m- h6 ?4 o3 c( w! I
    这里的激活图(activate maps)指的是输出的特征图。在卷积网络中,每个卷积层产生空间分辨率至少为1×1(经常大于1×1)的输出激活图,激活图的宽和高主要是由1)输入的数据(例如256×256的图片) 2)CNN结构中下采样层方法 决定的。下采样通常是stride>1的卷积层或者池化层,如果在早期layer中有较大的stride,则后面大部分的layers中将是小的激活图,如果在早期layer中stride为1,在网络后期layer中stride>1,则大部分的layer将有一个大的激活图。本文的观点是,大的激活图能够产生更高的分类准确率,所以在网络设计中,stride>1往往设置在后期的layer中。
    ( ]/ M  y9 o: n  M2 S0 H0 k+ i' e3 E; c
    策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。3 P% {6 H% @  o: _1 \

    9 s7 @7 N3 x/ H! {4.2.3 Fire模块
    4 j* E4 L9 s1 J0 d+ D7 a3 s# W为实现这3大策略,提出了Fire模块,Fire模块中主要包含squeeze层和expand层。squeeze卷积如图橙色椭圆内所示,只使用1×1卷积(策略1优化点),然后进入到expand卷积,expand卷积包括1×1(策略1优化点)和3×3卷积,squeeze和expand整体构成Fire模块,该模块有三个超参数s1x1,e1x1,e3x3,其中s1x1是squeeze层卷积核的数量,e1x1是expand层中1×1卷积核的数量,e3x3是expand层中3×3卷积核的数量,另外设置s1x1<(e1x1+e3x3)(策略2优化点),这样就能限制输入到3×3卷积核通道数,实现策略2的想法。& r. H! D' s% G1 w5 U
    6 ]/ l# C* J* u4 T  h+ }
    , l) {7 m+ X8 S# K' R% C0 F
    4.2.4 SqueezeNet整理结构8 r) g  _5 K4 f, L  o8 \: @
    SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。/ X8 t8 ]7 T5 O- z

    " Z( Q5 J9 ?  r' z+ a3 d. A1 L# J) Z. `% `8 ]
    4.2.5 代码实现SqueezeNet
    ( P& x/ k  R* t- K, ^Fire模块的代码如下:
    ( w% |- o; U1 Z5 s! M% |
    : j- s! t' n1 f+ D" Gclass Fire(nn.Module):2 d  N6 z2 z+ F) Q
    7 H' `% G0 F  f* U/ p; G" s
        def __init__(& a# Y" }4 M; {; d, ?3 ?4 y; F
            self,5 B1 A7 ^5 u- j- G" p* B# Y
            inplanes: int,5 l* a+ }3 f; Y0 q* H' G: `6 W
            squeeze_planes: int,& R, h7 z% |# z: H  ]
            expand1x1_planes: int,
    % w) k6 o2 K  `        expand3x3_planes: int7 }. ^5 G. b" @# ?1 I4 q& N# @% _
        ) -> None:- n% `4 P% R9 D
            super(Fire, self).__init__()% w# t8 ~8 t7 W/ F1 p1 e( n% d. |
            self.inplanes = inplanes7 m1 S) |4 X/ q  b6 p
            self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)! r, R! y& {1 k2 _' t
            self.squeeze_activation = nn.ReLU(inplace=True)' I8 u4 L8 h2 C4 ^; _
            self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
    9 M. X" D6 ^# T# C# G  x                                   kernel_size=1)
    7 k. ^) I1 Y& L; Q: g        self.expand1x1_activation = nn.ReLU(inplace=True)
    ' {8 {+ ]6 d- L        self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
    6 ^3 s& v3 J. Z8 ]                                   kernel_size=3, padding=1)/ ]* @  l* {2 z# x
            self.expand3x3_activation = nn.ReLU(inplace=True)
    / P$ l+ a0 ?' k5 a- y; X4 @  Z
    3 z( `2 }$ H* x    def forward(self, x: torch.Tensor) -> torch.Tensor:; E9 O8 c2 C! Q
            x = self.squeeze_activation(self.squeeze(x))& ]) a4 P2 w1 q4 C
            return torch.cat([
    * y1 h6 O5 s# e5 R0 G  q& W- J            self.expand1x1_activation(self.expand1x1(x)),
    ; w/ @9 a4 ]$ ^. R4 U            self.expand3x3_activation(self.expand3x3(x))# R/ t. Y* L+ ^2 f" x& l# \! H
            ], 1)7 V$ z1 X6 Y# [7 ]8 @

      h* P6 B- d6 r4 T% `1 `; U12 K* y( H+ P  b
    2  h1 v' `" D9 H- t8 Q6 A( l
    3
    3 a+ K8 o( b% L& W% v. o  c4# ]* t  g2 x. N4 U; Y
    5* c! x( o0 u' Y- j
    6
    & A. M, N! X0 @1 r5 f77 V* t0 G0 G, B- Q- S
    8
    ; I+ O  |5 H  }# P9" n2 s7 i, E1 N& {. ?; x
    10
    2 |; {9 w( C& \. v5 i' X- c  Q11" W2 h/ y" j2 I# ~/ z+ j8 {
    123 t, _0 e! C: L. X( Z( c
    13
    $ I- E. t9 ]- r14; X4 C$ j+ r, g9 [/ H& o  R6 e
    158 |& j# S. j+ r6 |
    16
    * L& R$ g3 @! K8 W17( m! D* w  D8 b% y, z8 P1 z
    18
    ( h( T7 ~; p+ Y4 A& b# Q# F19
    # d8 U# K$ p  D: s: y20% ]1 `' z5 s8 V5 I& h' w: @
    21
    3 _8 l2 P/ l; |7 I, z/ b5 F7 s22
    1 O; r$ `' J  F: }23. Q8 ~; c1 P( D/ i: r( k7 t
    242 |, q& v+ W0 }8 c# B, O: O
    253 P$ n2 B2 T* g, x5 E
    266 }8 P7 m6 A4 U, y/ ~" q
    SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
    6 A4 G0 t! R* ?! C* n7 Q9 O2 k* a/ a0 b" \
    SqueezeNet1_0的网络结构如下:+ N# d8 q8 m3 }& ?- G& ~' w9 a
    - O9 e/ ]* F+ k! p2 F# W
    self.features = nn.Sequential(' D, b/ S  P# n! L1 L, p6 s( M
        nn.Conv2d(3, 96, kernel_size=7, stride=2),- F4 H, u& m7 U# S$ E7 m4 b. Y
        nn.ReLU(inplace=True),
    ( T# g- j5 Z* w) K7 ~; a    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    $ D6 ~' w( d9 v    Fire(96, 16, 64, 64),- x% y) }1 g  Z
        Fire(128, 16, 64, 64),
    $ {% ^7 y& p$ E" B    Fire(128, 32, 128, 128),
    + K7 k- \4 N" k& D' o6 n5 B    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    5 M3 D5 A0 r9 ?( S' m$ B& A" H    Fire(256, 32, 128, 128),
      L: g5 O% }- t+ E$ X% l: |    Fire(256, 48, 192, 192),
    , A1 s- D6 A+ v8 }    Fire(384, 48, 192, 192),# z! o' v5 j. M% z3 ^' M, S; t3 H5 c
        Fire(384, 64, 256, 256),- k* ~) O1 m* c$ H
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),7 s6 e+ M6 a2 x
        Fire(512, 64, 256, 256),
    2 q: n3 I, d& {3 m3 f)4 d7 y4 R2 }6 u8 j1 A* x+ T7 F
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    4 O! ]7 B6 g: x7 qself.classifier = nn.Sequential(
    1 `+ g+ u/ L* }) {    nn.Dropout(p=0.5),
    8 Y4 x6 n8 m: E) N& y# y3 b    final_conv,
    6 u; |' ?$ N; j/ H% }( q    nn.ReLU(inplace=True),
    + {" `6 R6 h8 w) i    nn.AdaptiveAvgPool2d((1, 1))6 i8 ]7 s) W5 m; p/ f
    )
    1 w* `; e. t5 B1 s
      D8 H, o/ E" U2 b3 A0 J8 s
    6 k4 p  T' C1 `1
    % k# x+ F$ _% C; z2
    - Z( H, A; ~# V; _3 v3
    % v3 Z% t- r, Q4
    0 ]' s/ x8 Z# B; A5 J5
    . I+ S  s9 D4 m: c1 c7 r% J$ C68 i6 a# T  ~! _. k' S; s! \
    79 w, q" b1 b8 B+ z4 I/ g
    8  ]& y5 _3 y4 V
    9* P; j* c% f& r& E; A' O2 Y) F
    10; F1 e0 V. w6 t) p" A, q
    11
    ; A8 e1 @- N$ u6 G1 k1 U% o5 U. f126 U6 l0 B% B" H
    13: E) i+ }! ~1 I" f: ]  D: z) N: Z
    140 K9 U1 X7 j! Q4 F. N1 N
    15' r9 {+ o4 D. j% k4 h5 ?
    161 P( x2 h# d. L
    179 g5 h+ \) k8 W- r$ ?
    18  X/ }. v8 P6 j, \2 a& S7 g7 T
    19
    7 B7 j0 e6 o$ n: C20# P( h$ Y' J- f  }: k; I' y
    21
    ; ?1 r1 ?8 r5 k) U/ Q7 R! M' Q; ^22) n+ H8 \, a5 \; P6 v! V- _
    23" u% x6 b8 \% m: ^0 T' n8 x8 I) N
    SqueezeNet1_1的网络结构如下:
    1 A( o3 [! {9 K' Z0 Y5 f. [) J4 G6 D! H! o& `) p$ D5 `
    self.features = nn.Sequential(' \" |( q, g4 Y" c7 K- j  f) D9 F
        nn.Conv2d(3, 64, kernel_size=3, stride=2),
    & X1 t  v0 J8 \# K" `0 J    nn.ReLU(inplace=True),
    , y3 j+ W. L2 A. a% V+ H5 \    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),$ V+ a+ H" J5 ?8 }, F: \6 R! n: v
        Fire(64, 16, 64, 64),
    0 j) s7 \& y0 b6 H% j) t9 x    Fire(128, 16, 64, 64),7 J. O+ n( N5 q
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    , T/ A9 V5 G  n. o" a    Fire(128, 32, 128, 128)," {6 u' r  b$ u0 T! L- S3 S7 x& ?  u
        Fire(256, 32, 128, 128),
    9 w4 }- j7 H; H# `    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    , H; T" ]" z( C; b    Fire(256, 48, 192, 192),4 I4 M8 O3 t" T: P# }/ a: P( c  U
        Fire(384, 48, 192, 192),
    8 ~( r7 A' z! }& C    Fire(384, 64, 256, 256),5 X; v: d( u& l/ F2 F
        Fire(512, 64, 256, 256),
    # E$ Q) S0 D0 B) V, \)
    6 n6 [3 Q7 v! \/ |4 Ffinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)) ?5 ^* w  D% X) ^9 X, u2 E
    self.classifier = nn.Sequential(
    ! s- t3 i& S1 Z. R    nn.Dropout(p=0.5),1 j3 H! A) c- v" @, ^8 Q% f
        final_conv,
    3 j2 V9 z* C  [* N    nn.ReLU(inplace=True),
    , ]: C2 A9 ]6 ]$ o* Q6 N. @    nn.AdaptiveAvgPool2d((1, 1))% \& x- V) |& e  S, s
    )  J) y+ _  K  I8 H& E. J

    & ^/ x/ {  a  }1% F2 {, M* Z" W. [' ?
    2
    8 M7 E) v0 Z- r0 ~( n/ R8 N3
    3 ?- @8 K* X( N. I* r4" K1 x2 }! v. b
    5, b3 M4 N5 s: \0 y3 u
    6
    1 x* G# R3 {- k' Y' |5 z  f  Q7/ y2 `+ D) o1 g5 r$ ], E9 B
    8
    ( }% z8 Y; P- S6 @( }5 v9
    3 N' s' l1 ~( N; a7 p100 r) W  T% O/ N- N& G
    11
    1 H1 {$ Z& K1 |+ X12
    ! f% M) m; M/ t13
      A: \0 ]! c1 U( ^: [% x  u4 E14; ?% e  p* F/ K* j5 s8 R1 F" M
    15
    0 @8 f( E# X( a5 H3 j6 M& q! J* l1 w16! a6 t$ H9 u4 g; p6 J! i  f: e
    17
      E* b3 J6 h5 w18
    ! V( e$ [* y! u" L( o2 N19
    7 [& u+ H* u! g0 p6 y' S, {$ d20* S3 N2 `, V1 x. z0 Y$ U
    21! ]% G8 F9 p/ p6 E- Z2 W
    22% y3 t5 ]9 G" H' h
    SqueezeNet各层详细参数量及其输入输出如下表所示。2 Z. s9 E3 ~5 g5 `

    0 ?( \8 }5 [  E; P- G" n6 ?& ^
    $ O8 K6 _# J  r; Q+ x4.2.6 其他实现细节
    ( c6 \: h9 D2 c1 A5 r6 j; Q* W) B1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
    ) s% e' f0 K2 G' r( gsqueeze和expand层中使用ReLU" }, n& m5 d7 t5 v9 e0 O* v
    在fire9之后的layer中使用ratio为50%的Dropout
    # L6 Q2 k+ ?/ s' ], ]6 H" a参考NiN算法想法,SqueezeNet中不含全连接层
    3 j8 }3 b/ @; {5 s训练时,前期学习率设置为0.04,然后线性减少
    5 W9 I% y  I4 D2 n% k4.2.7 总结) l5 g' B) y1 \9 Y# l* k" t
    本文最主要就是三点:
    2 c% U) |  B% |) S; g0 W8 a8 O/ e
    - Q1 \+ H. F) [+ l用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
    6 u/ V  l, d  J5 _* B% m减少输入到3×3卷积的特征图的通道数,减少参数量! f2 h- J9 n7 H
    不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率
    2 g+ M' u9 j; w  G9 j; m  V! d————————————————
    . \" V5 L) |  B  P版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% X0 S( X& T; |6 U# j1 S0 ?
    原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100) K2 G7 o/ Y/ o0 i$ l; y* J. ]3 p

    ) M1 x; m4 t4 Z0 w5 u+ I) j, m  E; N  C1 V" Z: w/ v
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-10-8 06:29 , Processed in 1.248681 second(s), 50 queries .

    回顶部