QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2947|回复: 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

    2 p, I! w5 F- d0 Z轻量级神经网络算法-SqueezeNet
    4 n6 |9 _# k1 s; `4. 轻量级神经网络算法目录: W5 x! p+ ^, S! i# {
    轻量级神经网络算法6 I, u: {- C! j8 ?9 f0 e+ A
    4.1 各轻量级神经网络算法总结对比( V2 z( t. P/ g( e8 B! o: C/ |0 X
    4.2 SqueezeNet4 H: Z' b' \# @2 u7 p4 l) o  v# n
    4.3 DenseNet
    " ~0 t$ j4 m5 }4.4 Xception: V3 q5 }1 S( L% i, s) B
    4.5 MobileNet v1, F' ^: u' W9 T- j1 n
    4.6 IGCV+ j' q8 H# g4 v) W1 Y7 x
    4.7 NASNet
      H( y" q/ |8 M4.8 CondenseNet( q$ n, u" b& s, n" ]
    4.9 PNASNet  h2 p% E' L2 t( b0 i( ^
    4.10 SENet
      X- j! h5 k! n) {9 R. l4.11 ShuffleNet v1$ @+ l/ m4 n4 T- a
    4.12 MobileNet v2( z# m3 ]) H# z* E
    4.13 AmoebaNet
    1 Y: G9 \( N+ ^/ w4.14 IGCV2  z4 ]7 G% U% @$ U
    4.15 IGCV3
    3 J, E+ ^4 w: c( ~4.16 ShuffleNet v2
    ! n; B- R* K# e( H' f1 w5 h2 v. N& t4.17 MnasNet
    7 E' f$ b5 d  ^2 H# Y' n4.18 MobileNet v3  ^. _+ o8 x- \2 {- k  v/ r
    深度学习知识点总结
    " L0 V, g  T, e( s3 m, m% L* q
    ( O. A, p( [* E* x& x6 t7 g% s专栏链接:" F3 @& v0 g& X* V
    https://blog.csdn.net/qq_39707285/article/details/124005405
    , P( X8 V+ K! I本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。8 ]1 Z6 W- L) a3 d2 {/ a1 p
    ! z7 ^. A2 Q' R, E2 Z
    本章目录
    3 b2 J' G0 ^- N. p& Y# i7 u4. 轻量级神经网络算法目录
    ( }, z, D4 Q& Y! m& \* S4.2 SqueezeNet0 @, }  w( t" x" }+ _; X
    4.2.1 问题分析
    2 e; m6 {  `! q9 ~3 h4.2.2 SqueezeNet的三大策略
    6 u3 \( j1 P% Q7 H6 \3 w$ H4.2.3 Fire模块% a% n7 h% w" ]( p6 Y" A0 \/ V8 B
    4.2.4 SqueezeNet整理结构6 d7 [2 i- F) m4 c, P
    4.2.5 代码实现SqueezeNet
    7 }5 B8 R% |: G/ S$ N) ]4.2.6 其他实现细节* @- v) x5 V; W& J6 P
    4.2.7 总结
    / k# D; o  J0 G# |) ~4.2 SqueezeNet. g& r! c5 u; d( r3 q9 }
    4.2.1 问题分析
    0 s+ ]3 G/ o  O/ g最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:9 k+ y3 D+ i0 \! W9 c0 z

    7 D4 d8 U; O0 }- }0 m0 ?在分布式训练期间,较小的CNN需要较少的跨服务器通信
    & }) O: t5 Q4 _在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
    : y/ f5 I4 v7 \1 j2 L# q0 d9 n较小的CNN更适合部署在FPGA和其他内存有限的硬件上
    ( Z% R, p3 H- U# T( x+ Z6 U为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
    4 P! U/ D$ s, }# n
    $ c( H; H8 |% i! Y, Y: T* u* }3 ?4.2.2 SqueezeNet的三大策略* c0 J6 ~- j2 l4 K( o8 w; O8 H
    策略1:用1x1卷积代替3x3卷积8 _. a. {% @- q- ]
    1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。8 Q9 e5 c8 @. G. Z
    9 D5 i4 }: H3 c/ N/ X
    策略2:减少输入到3*3卷积核的通道数量: j0 D; I# A3 O
    对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
    2 f# Y7 e; S9 {/ S' K& P) F
    ! w" u+ f1 \& x; W策略3:在网络后期再进行下采样,使卷积层具有较大的激活图, m( H% B* l! y- I9 l3 h
    这里的激活图(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中。
    ; Y  H8 t$ h  R7 ?1 A* p2 p* m+ R7 d" ^2 @7 f# ]# ]3 H3 d, a
    策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。( C; |) W8 X0 r% d

    " ?  H1 K$ F0 ]% I9 J  Y8 Z4.2.3 Fire模块
    5 ~$ D" d9 d2 ]( Q6 S为实现这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的想法。  |* a, X/ X2 Y* f# ~
    9 E( A) C" e/ L1 E1 B6 D% r; A

    4 o, D( b: ?9 h0 ]8 d4.2.4 SqueezeNet整理结构
    / w3 ?5 X& V9 J/ h* ]9 aSqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
    % t4 }0 K9 _/ V% i! R
    . ?  M: A# _8 Z9 t2 x$ y$ b; ~/ y* F+ u/ y! ]2 T8 C
    4.2.5 代码实现SqueezeNet
    : E1 P& @0 I) [1 G/ s% e# p7 JFire模块的代码如下:$ }+ J+ S, S7 @
    # t! l' k6 R7 \* ]6 j
    class Fire(nn.Module):
    3 Q  o1 N* R1 W$ T# e, Q& f+ o. L. n
        def __init__(8 [  i% A$ }2 b7 _8 l  E1 Z5 {
            self,; S2 V6 y6 h# \1 w& ~
            inplanes: int,
    . K5 k1 ^" q2 V        squeeze_planes: int,6 R) W% |$ c8 P" S9 F: Q8 d
            expand1x1_planes: int,% [  j6 ~& ^: c( K7 _& p
            expand3x3_planes: int4 a: n6 [9 e" [, ]9 {9 |. E& C
        ) -> None:
    * s* h* i4 ^  R        super(Fire, self).__init__()
    ; {1 P* F$ K  m: X5 l: \0 _; T        self.inplanes = inplanes
    8 x/ U/ b/ k6 C5 Q: \% c; t' ?        self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)0 o; J/ h0 a  E% }# E! N
            self.squeeze_activation = nn.ReLU(inplace=True)7 ]/ v' E, ^. i/ h+ o
            self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,& |8 Y# j" ^+ ]2 D( L8 c
                                       kernel_size=1)5 e# j- I$ L8 a8 o: A& ?0 V
            self.expand1x1_activation = nn.ReLU(inplace=True)5 e, q9 W8 {+ U
            self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
    3 F6 N( Y2 I4 E5 q% H                                   kernel_size=3, padding=1)
    * n6 G4 x9 f% H  J+ @        self.expand3x3_activation = nn.ReLU(inplace=True)
    - E5 `2 _) r- h$ n3 p7 U  H) q& b7 Y; [% h  I0 v6 X  ~
        def forward(self, x: torch.Tensor) -> torch.Tensor:! j0 P1 O$ i# g
            x = self.squeeze_activation(self.squeeze(x)); _- t7 M6 ~2 {7 _8 [
            return torch.cat([
    9 T: w# d. S& i6 C% y/ X            self.expand1x1_activation(self.expand1x1(x)),
      y% _0 m$ G6 J. _$ [* a; I            self.expand3x3_activation(self.expand3x3(x))
    ! L& a9 E9 Q* C5 H- Q5 i! m3 y        ], 1)
    4 x) g! @, o/ G% l
    ; q2 g' j) }0 g8 ^15 N; D% R4 ?% R0 h! x' t* x
    2/ q7 ?  c2 r1 B& \) k5 t
    3
    / Y3 D' |! e- N/ @/ d4 D4; H/ F' J( c- ]# E- Z2 B) |* ~
    5" f5 y3 w* c' G+ b
    6
    ' S9 d/ V4 t5 y, M7
    0 s; d+ M2 S' ]* k; E8
    * D& D3 Z  |# i4 o  ~. B! `/ q9
    # a; |/ ?4 z1 B, x9 ]0 p1 x1 ^10
    . t: a- b# s0 W& |6 V8 B11
    ' j# }/ x; P) u# X12
    + H: m: ^) h" V% Q7 c: f2 C13
    - Y) f0 C- F2 D* Q# a14
    + |5 I* o  u) G" J1 C' ^$ L15, V- e! [) A4 y% j
    16
    + T9 o( q6 B- W* u  }( A177 I4 R) M$ A6 V* B' t7 W) {( S$ @# k
    18$ d- B/ K9 }3 M- S' K3 ^
    19, K3 A2 j! t$ r4 W' g# g, [# Q. N% J
    203 `- L2 x0 P8 j* v* z2 H
    21
    % S9 D& \3 [3 E3 V9 d) i22
      F6 e8 l, i; c' R23- L0 R; I6 J" [
    24
    ; [, Q. C3 [+ `- ^, L; r25, c1 I5 W+ V; V$ ?
    26  H* R1 z+ S% M- O8 ?
    SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
    ' p8 E. C0 w, T- \. v
    ) e- L" R  S& p, {/ ?+ `5 CSqueezeNet1_0的网络结构如下:
    1 Y1 G$ L7 F* N' g) r& X0 r# Y: s! ?3 f" g3 g7 m
    self.features = nn.Sequential(
    6 g# J+ y. l) `. ?    nn.Conv2d(3, 96, kernel_size=7, stride=2),# ^' \  S' D! X4 j- D, H0 t7 O
        nn.ReLU(inplace=True),
    0 h5 v( |, B6 y) x; N    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),3 u2 r) [  Z$ ?0 K( Z
        Fire(96, 16, 64, 64),
    ! P) y$ S1 v; o    Fire(128, 16, 64, 64),
    7 T( S5 f1 `# M& i' n5 J    Fire(128, 32, 128, 128),
    $ o- ?  i: a/ C- p8 Q# K9 v5 J% ?    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),+ [9 Z. W: |, H. |
        Fire(256, 32, 128, 128),
      B0 [, M2 M) V$ R8 S7 i    Fire(256, 48, 192, 192),
    $ f& {2 V% R; b5 R% ]+ B    Fire(384, 48, 192, 192),
    8 i  q: {% H! N% F" R1 |    Fire(384, 64, 256, 256),/ B! C2 N. {) b. U  k
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),1 Q4 I, l4 Z/ q6 Y2 T/ x, p; ]* e
        Fire(512, 64, 256, 256),
    + w7 r. ^3 H/ Z. ?* S5 b" o* L: F) k)
    1 y) T& V/ W! cfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    % C! S! Z8 d: e0 R! n& T; kself.classifier = nn.Sequential(
    ! P& L. {0 I- e: Z, P    nn.Dropout(p=0.5),
    ! m$ @+ y, d6 h, L+ Y    final_conv,
    . B  M( [, g1 \4 L" r- t    nn.ReLU(inplace=True),
    , s4 d2 I1 s! x9 o    nn.AdaptiveAvgPool2d((1, 1))8 _' E2 U! U: ^, ?$ [% `% t
    )
    8 \% O. e6 ]( A# Z& X
    7 H/ W6 t; H% l0 K' ]- s& l+ `4 H7 Y! b1 m0 U2 E
    17 O/ p" H0 u  `$ |
    2! ]) v. ^: a6 V
    36 N& E- t/ W1 h6 n
    46 _5 X" y1 y% C% S$ U7 O
    50 F1 }; M' j2 u/ v4 S
    6+ ?5 d2 \: ?( W
    74 ~0 v# s# m7 T) E5 X0 J
    8
    * g: S0 w/ C7 w+ {3 Y9
    " }5 }" s* _- z10
    2 x7 H5 r% @" k5 _: u) ~. b11+ k5 z3 @! \: v' F5 B
    12
    . n0 \' B4 L1 o13
    + @2 L% ]5 Y  k. n$ B14
    & G/ S9 i; n% a# l: Y- ^; q15
    ' V! g  X( k/ V- g5 b165 t7 B0 ~. p6 d8 |& F
    174 F3 v/ U5 e. b- b
    18
    + a4 g4 }. U/ |19- W$ b, Z5 m! t' t7 Q6 r$ C
    20
    2 s  L* N4 C% B" G3 h' n/ |- w216 ?  T0 j! y# l* D* P, f+ P2 L
    22
    0 \' c  n& t# z; E" Y23* U) D/ {( ]9 Q
    SqueezeNet1_1的网络结构如下:7 v# }) h6 a, A' G2 m$ H' M, V

    1 R1 A+ n* _! a! T: o2 u6 Rself.features = nn.Sequential(
    & o; Y+ [1 R5 I9 ^    nn.Conv2d(3, 64, kernel_size=3, stride=2),$ N8 p7 }! @- A0 v: s
        nn.ReLU(inplace=True),
    7 N+ m0 x3 P' U% k% B8 ~, _! o1 H    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    & M! R% }4 r: f# x$ d) {    Fire(64, 16, 64, 64),6 R1 ~* M# s1 f; [9 d& z; W9 k
        Fire(128, 16, 64, 64),
    + h: @, Y- U! o0 e% B0 a/ E    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    % G4 x+ R5 q( ~    Fire(128, 32, 128, 128),# E) t5 e3 p% w- T
        Fire(256, 32, 128, 128),! m% R! q3 s8 A5 h" p
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    : y/ a! E' o+ ^  \    Fire(256, 48, 192, 192),
    ( ^. }# L5 K. U9 L9 b1 F    Fire(384, 48, 192, 192),
    . J3 q5 s# y* }( P9 A* F    Fire(384, 64, 256, 256),
    3 ~8 T* m' h- }* D    Fire(512, 64, 256, 256),4 U& ~9 j, l) h$ q8 K1 y6 v
    ). P, j0 i$ Y# `( u5 J: O
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    4 u5 ?$ S& ~: _9 _% Fself.classifier = nn.Sequential(3 i" [6 s" ]# s7 G1 I/ |) J
        nn.Dropout(p=0.5),2 F# o: s( h2 H4 l3 H
        final_conv,
    ( y2 E0 X  L# O8 ]8 t8 G4 r    nn.ReLU(inplace=True),& n+ {5 D, t6 W' J& t/ \, w
        nn.AdaptiveAvgPool2d((1, 1))- u5 m$ _" z3 @3 d1 c4 F
    )
    2 O5 I* r& S* D  B
    : q; u! `; N/ l# L1 R1  {" S1 O+ X& g9 u& X
    2
      y# F8 M5 ^& X7 v! ~, ^3& f  n# V/ G0 C7 w+ k3 R) C( P3 u6 P! L
    4! P0 |# n/ k- s2 s- d" u& _
    5; Z2 H! Q% T+ _3 c7 u1 J
    60 D1 a+ ?8 V" X% P9 K: X
    7
    7 J  G5 z9 Z5 E/ [8
    + |8 d, P& e: w* d" _+ K93 U) J  e' @0 ^* N; f% T8 X
    10
    ( [2 q1 H9 p0 _11' x* \- @6 ?8 a1 `
    128 u8 h+ W0 B/ [7 R5 t9 f) N$ R; Z
    13
    6 s$ y8 S4 E( R8 A* q6 f14( I. V# J  C# p: h; e8 _" N
    150 C( d1 ]$ Z% M& [. a
    160 G- q" a/ d6 J- e( C7 ?
    177 n- B* ?2 G6 e" }4 H1 t; u
    185 t8 d; ?7 c7 d2 c. x
    19
      K- D; p4 s/ M$ {, q. u% |; t/ V20/ W' ~" c" T4 ~1 h3 \- Q, q; q
    219 `% |- i4 w& }/ ~; _% V
    22
    + Q$ |) b& E. E. n% ?" f% O) |SqueezeNet各层详细参数量及其输入输出如下表所示。& ^' p+ [7 E' `5 N

    . g: n) Q- Q7 }3 T9 {1 F& }  x7 G5 O: W
    4.2.6 其他实现细节' g( I+ ?; W1 U& H
    1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding  V# u* Z7 w0 i) K% o
    squeeze和expand层中使用ReLU
    + M. ^& h8 F( y$ I在fire9之后的layer中使用ratio为50%的Dropout
      m7 a; X* Q- ^( a0 J参考NiN算法想法,SqueezeNet中不含全连接层
    & G0 R& k, |3 R3 m4 Q; T- A* ?训练时,前期学习率设置为0.04,然后线性减少; h4 K7 D/ [. K! @0 L9 P" z9 h3 h
    4.2.7 总结9 ^- l( t8 A6 z
    本文最主要就是三点:: M2 e- F& v- ^/ M% b7 \! {
    - |8 _3 C% `7 W) j
    用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
    7 ~4 P$ e: t: _2 O2 f2 T减少输入到3×3卷积的特征图的通道数,减少参数量
    ; S! f- \3 @) K" I) [+ `不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率4 i0 V% w! K3 z* R2 }! s; Z- ^
    ————————————————) v4 A8 ^/ i' ^) g  o! B/ P7 W) J
    版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  ~: H* ^# N, l! T! }
    原文链接:https://blog.csdn.net/qq_39707285/article/details/1264981009 ^- B: K( }# ]5 m4 V- F

    4 g+ s6 |. j! ~: \0 J9 ^4 V# n4 i
    : s: D, p2 F6 U
    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-8-24 04:03 , Processed in 1.232658 second(s), 51 queries .

    回顶部