QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2989|回复: 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
    7 F  ]- E3 S% E7 {  D1 p4 z  d
    轻量级神经网络算法-SqueezeNet
    0 u. t! [; n9 |4. 轻量级神经网络算法目录
    " E- ~- J; y& |" {# N* `" d/ I, t轻量级神经网络算法
    , P  S# R% P; N* U+ b3 }4.1 各轻量级神经网络算法总结对比2 t6 g1 \4 B, _& D9 t
    4.2 SqueezeNet: k* L. U( P  c3 r8 h
    4.3 DenseNet# K8 Z" I! [/ Z3 ~4 z
    4.4 Xception
    8 C3 [6 `8 J: P( X4.5 MobileNet v1
    % q4 ]- I2 f; T2 F1 @7 z. O4.6 IGCV
    8 v* }# H( X+ f4.7 NASNet. b# `8 Z. r, E$ T
    4.8 CondenseNet: V5 b* Q' j0 z' P% V4 o
    4.9 PNASNet
    ( ~2 D/ C" H* E, G+ D3 H! y& @' V  M: \4.10 SENet7 o; s' J" u- Q% ~
    4.11 ShuffleNet v1
    & _0 R- Y" q1 b4.12 MobileNet v24 F) Z. `7 m4 K" Z. Q0 m4 t
    4.13 AmoebaNet
    8 |3 Q0 A# [% z' s: K  V) i* {4.14 IGCV20 K' e& o, p. c! o
    4.15 IGCV3
    , V0 x( u8 v8 b& {, n0 G& b  @: w) m# e4.16 ShuffleNet v2
    8 t  e% Y  A: u7 n2 h4.17 MnasNet) Q: }1 o+ z9 A1 M( q
    4.18 MobileNet v3! L" s- p' z$ y  Z2 Y6 }3 ?
    深度学习知识点总结, T. L0 Q8 t3 {

    - o+ _& P2 |  ?0 W专栏链接:
    $ D7 c7 c3 j) M" Z6 G  ^https://blog.csdn.net/qq_39707285/article/details/124005405  L2 _9 |- J. \' @" c5 p  m# F
    本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
    9 [, v" v, Y# E" g( W; O$ l0 o' L
    & k: Y, s0 \0 K6 z" U本章目录
    . r! Y8 P5 h+ _) U. D4. 轻量级神经网络算法目录
    ! a5 R5 Z6 ]; O% V4.2 SqueezeNet, w: ]/ \! l" Y% Y) @6 a
    4.2.1 问题分析
    " d4 S0 U7 A" |0 I& c4.2.2 SqueezeNet的三大策略- a) g3 k' @& m, l8 Z
    4.2.3 Fire模块
    / z5 O. {* g+ ^" ]4.2.4 SqueezeNet整理结构1 J: ^  y8 i2 B, M+ {
    4.2.5 代码实现SqueezeNet
    2 L; U. x, W/ h  @- W! \) O4.2.6 其他实现细节
    5 E# I2 x( t, D. n4.2.7 总结
    * n% ^. V" a9 G. x4.2 SqueezeNet
    5 b" m- C' A' J8 J4.2.1 问题分析, ]# ?- W% q+ O/ c9 z
    最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:: |' ~! ~# o; j, E2 B
    4 s5 `" t: W- C: j1 c4 K6 p
    在分布式训练期间,较小的CNN需要较少的跨服务器通信) Y/ v$ t4 l& j9 s" c  p
    在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入# S% w+ d& v" S: e
    较小的CNN更适合部署在FPGA和其他内存有限的硬件上) e' X8 K3 U- U/ C$ W3 m2 F4 }
    为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
    ) ~, E0 x; m8 y; r6 z7 _+ Z! a# I' {9 n% T6 Z! p$ O
    4.2.2 SqueezeNet的三大策略: e1 ~( N8 j: S8 V6 V
    策略1:用1x1卷积代替3x3卷积: C7 P( p2 {  J8 W8 G: h" }/ ?( d
    1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。4 \0 K/ x" _6 M5 X/ L# e
    9 {" |; Q  |3 g. ?. E- A
    策略2:减少输入到3*3卷积核的通道数量! M. J) u* n  |* V% d6 E6 }2 J
    对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
    % ^6 C" ?. r$ M4 \% g  h" y. p* X4 ~+ G% v% `3 N. ^, [
    策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
    ; n4 `$ w, f; |8 j: v这里的激活图(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中。
    ( D9 _% e- n& x2 d5 [) \& y' E+ q8 Z
    " K. X9 l. p, Q, V! Z, G5 W策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
    ' M2 W$ ], i: b! Z0 _$ x% u; ^8 T5 t. V7 N4 Q6 }
    4.2.3 Fire模块
    , U5 Y$ f' H! ~为实现这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的想法。
    + e) F; ^6 C: J% t8 D4 }2 @  {) h$ i# t! z( C& r. ?

    $ ^+ M. ~0 N* h( d2 v5 `: c+ O% W4.2.4 SqueezeNet整理结构* [8 P* B  W2 {- X5 n9 ^6 O3 N
    SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。9 {. X0 q1 I4 _0 ]4 G" `2 w- W
    ! }! r* Q5 R+ M  q+ j0 c3 n
    ) b' ~& l1 W- v4 H+ m
    4.2.5 代码实现SqueezeNet1 R' H* H+ ^. S" [9 j! B" u
    Fire模块的代码如下:
    7 J9 o0 U" r0 B6 }! L+ M. \, B1 b# D! n) }. N7 N- P# M
    class Fire(nn.Module):
    9 p* A! _" F4 l' c% x; ?
    3 v4 Z( |' i+ c* _0 i    def __init__(
      z# u# |; N: ^$ Q# y: {' ~( u        self,9 d/ G- j8 r% \# q
            inplanes: int,) X- l1 u: ]5 H5 Y/ ^
            squeeze_planes: int,
    ; M  S8 [0 _& R  S+ u. M        expand1x1_planes: int," `5 |# J5 l* A$ j2 m/ T
            expand3x3_planes: int8 |- ]5 s" A) }$ v& j6 d  g
        ) -> None:5 R* V2 a6 }, Q1 H$ O
            super(Fire, self).__init__()
    7 `3 T9 k- [! B$ J* E* m1 Y        self.inplanes = inplanes( U5 m3 M% I1 h) F+ G( Q6 |$ J8 G
            self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
    # Z& Z( p' Q) ]# M        self.squeeze_activation = nn.ReLU(inplace=True)  R1 a3 v+ [: `# ^; e1 U" W1 }
            self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
    ) X. h1 j* Z( J4 M                                   kernel_size=1): K8 m' L! V- P8 A/ D) ^  U  \# }
            self.expand1x1_activation = nn.ReLU(inplace=True)
    ; d  E( r; D2 J: h        self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
    3 e6 h# `/ |2 H; w* v- U  H3 f                                   kernel_size=3, padding=1)8 S& ^% w1 w2 t; ]; I) X* S3 w
            self.expand3x3_activation = nn.ReLU(inplace=True)
    ) X# a; l& K5 O: v! T# r; {2 s9 Z; G8 z) U! _8 L% ~2 u  i0 t
        def forward(self, x: torch.Tensor) -> torch.Tensor:+ x4 D. l" Y6 c3 B3 g
            x = self.squeeze_activation(self.squeeze(x))
    ! i- f2 I  X7 ^        return torch.cat([
    * o' S1 x2 W+ f9 p3 _, K            self.expand1x1_activation(self.expand1x1(x)),
    " l: C0 b) E( F) S7 S. k  @; e            self.expand3x3_activation(self.expand3x3(x))
    / o3 K1 n. z6 C6 k3 l/ t5 h        ], 1)
    1 f. l# r  i5 i/ H  E! I% ]9 _% ]* j& M- B0 J4 E1 R
    1' u6 [( T) w: E0 P
    2
    . _' I) F) Y$ \1 ]- W3
      _5 m6 T: E8 x& p. m% r' |4% x0 ^/ Z. w& N+ r% h/ t0 n
    5
    4 z# P. X8 y7 M6
    " Z6 }! W- R0 A& m" ]4 }+ L* g7: U# ?. L1 |: o4 Z
    8
    2 \0 E6 T( g: Q1 P) f' o( w9
    % d6 @5 |' O, \9 [  W3 q10
    " |: r/ O5 o' W2 q) x119 x3 `% ]" j( P# U& k
    123 o% S  k+ B2 c/ ^
    13
    9 J1 A  b( p% V; g0 O9 @4 d& l& ?( w14
    - P. y- j( ]: n5 M! p( v15
    * X8 N: J$ A3 B5 a) c3 [3 L6 x16
    ) ~$ b- ^1 _5 p; a( |17
    : m# A$ F- T: f7 [$ Z0 H- S9 M18
    . M0 N' w9 w; A, `5 z& C5 L196 R! O$ g2 u, N% l+ j- K7 `
    20& G- N! ]0 \: B
    21
    + B9 o% b; G- ^) Y/ ]* @7 Z/ d22
    3 o% X+ z& j$ Q7 O* U( y  Y9 A3 V, n232 i/ o7 D5 L$ H" t  a4 l! \
    24' k, s' W6 s7 }/ W  |0 r
    25& K" R" }. y( f" ~$ P2 L6 u7 {
    26  N' Z( i& g$ L2 V
    SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
    9 r' u% f% t. ~. c! \" y
    ! J2 A! l% b4 x  P9 B: @) \SqueezeNet1_0的网络结构如下:% O0 J- F; I, n
    & W/ B" }2 Q3 o5 |$ F
    self.features = nn.Sequential(
    # a7 m# H7 G" p- m2 j" R4 _2 g6 U    nn.Conv2d(3, 96, kernel_size=7, stride=2),
    4 y1 Q1 i) z" y6 N' T3 r9 _    nn.ReLU(inplace=True),0 _' c) z1 n! z- J: P9 V
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),2 @# q! h0 r: _6 S- I1 e
        Fire(96, 16, 64, 64),
    ( k- [( `* x3 x( T) Z8 P1 ^7 _    Fire(128, 16, 64, 64),8 ~, T& O+ ~; V, d2 ~1 x
        Fire(128, 32, 128, 128),
    - R6 v* k3 c7 Q' f; B" u! F$ S    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),! z( G' }' K. V  ]3 z% K
        Fire(256, 32, 128, 128),
    % V# r3 d9 k( \    Fire(256, 48, 192, 192),
    ! N/ l' g( N' Y2 U! L9 W* P    Fire(384, 48, 192, 192),
    8 G/ Y/ q+ J2 x) V+ [- K# ^, S    Fire(384, 64, 256, 256),
    : ~! {6 e/ s7 Y6 J% T    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    ! D+ v7 _* s: s- m$ Q" h    Fire(512, 64, 256, 256),, X# ^0 J! j4 @
    )
    % r" p* x( f/ d9 cfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)- l- o, {$ `9 W' O+ o; n5 @
    self.classifier = nn.Sequential(  N# R. x# L$ e7 G  g  A/ i# ]
        nn.Dropout(p=0.5),+ t+ X/ b5 o  t2 S5 t2 l
        final_conv,
    # [" T  p6 q/ Y: R9 M1 p    nn.ReLU(inplace=True),' u0 h6 f# n4 L8 A$ ]
        nn.AdaptiveAvgPool2d((1, 1))
    0 v; v9 T( A! b5 v, \)
      t- b0 n( ]7 j( Q4 q$ Y1 P6 j9 o, N" F- [' V; [
      a- L2 P- O! @) Y5 T* W% \
    1
    4 i+ F9 y' `7 P, X5 x* S2
    . v9 ]' m5 Y7 f6 B1 I8 I0 `7 ]: y3
    ' _) B% V( m  z. Y% j4* Y$ l" y" P. r% f. L  [
    5
    : f' K/ }# i# f0 n6
    # S! L: w  r8 i( {7
    0 t7 k$ l8 G+ x" \1 g3 s0 T7 K. ~8* N, ^/ y" r! \6 L# O9 P5 O' @! E
    9
    3 x' I- r( G; f' j: o, D10
      Q/ Y: |. t: Y$ O11
    ( P% R. @0 _" G. v( D8 p4 u3 E12$ s. J! u2 ]  `( s0 l" H
    13
    % e5 l: X2 n' y1 @' s2 F14
    ' i6 Q1 Y. Z3 I/ N15$ f- e. d1 {; ~$ j7 H3 b/ Y
    16- W9 W6 D4 m& f$ l$ u1 v7 U* F$ e9 P4 w
    17
    , z" o  [) Q1 d$ v186 k& ?7 X- X: `; B! U: [) T
    197 w$ s# ]6 m  x
    20
    , `  k) g$ u: X; W! k5 E4 @! L+ k21
    8 S, j+ _" _0 e, Q22
    8 i8 G- b2 n7 f5 o7 l. W4 u. M' f235 T& T4 z' t' s' H2 w5 o, I
    SqueezeNet1_1的网络结构如下:0 J! Q' V: T) Z( M' r" F: O

    / I4 T% ]. i  i  E0 C" O% g  _( Nself.features = nn.Sequential(
    / h+ T# t3 A' K* V, d) E    nn.Conv2d(3, 64, kernel_size=3, stride=2),7 D% W2 Z8 D+ i* M
        nn.ReLU(inplace=True),8 R, }8 O# h4 j$ q
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    6 L) R* f8 ^3 e& y    Fire(64, 16, 64, 64),
    4 S% w: W: q$ \" l: c! z    Fire(128, 16, 64, 64),
    7 A7 l+ B3 w" w  l, ]- A4 w    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),# }1 N$ l% [% |/ o
        Fire(128, 32, 128, 128),8 m( j3 o' d6 E  x5 W
        Fire(256, 32, 128, 128),9 y' R  U+ T  h' y# `
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    1 M* k: l6 o: T& P& t. ^% m    Fire(256, 48, 192, 192),5 v2 I5 q5 N- z+ X; M  z
        Fire(384, 48, 192, 192),( d2 M1 @6 l1 V7 s$ K
        Fire(384, 64, 256, 256),5 x6 C0 o( E3 u( ]: e. Q% R* K
        Fire(512, 64, 256, 256),
    4 y! n  N6 G/ P)% O/ C! v( n4 v  ^. _3 H7 ~5 @
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    * U. {- U4 F" H* {) {; G% g! ?- bself.classifier = nn.Sequential(
    8 r& G* n) u; I; I; c7 X; [    nn.Dropout(p=0.5),
    - B/ ]- P, Q( M7 G. n- b    final_conv,3 m2 J$ z, {" ], S
        nn.ReLU(inplace=True),! Q7 H2 j9 _2 q" M
        nn.AdaptiveAvgPool2d((1, 1))
    8 _+ L( b+ l. K)& j% P; w$ f( I5 i7 p

    & Z# n8 M8 R# k) `- `8 k1 d1
      U6 [) z' G. s; X2  Q1 E! J: F+ f& N2 C7 [
    3
    $ A! k! v( B0 [+ K% h3 f45 s! _- W# ]" V1 ^1 ?
    5
    1 e' R, _0 S! \& D) D$ G, Q6; e; x) f5 ^3 F3 a! D4 o
    7' I0 Q" M+ h9 y' {
    84 Y0 A* P8 d6 V3 z+ D* s
    95 b; D$ U9 ~4 M! G5 g' V9 W3 T2 e
    10
      [8 j  {, {1 n' z6 {9 d" ^$ j11
    9 K* N7 Y  P9 _/ {; S126 _! F6 v5 m( \$ a$ g4 X$ z
    13
    * h$ A/ W+ H3 ?! b. [. Y9 t( D; H14
    0 n* \& s& C. a0 _" ~155 Q, e' b  K$ f! T5 l& i* D
    16
    6 W- G' K% K' e  A) `+ p17
    2 o7 F* B0 l# X( J0 i# q18
    * N  l# Y  A" u19
    : ?1 m- o. p) T4 V2 a7 c209 L1 q" n% |2 f, G# U7 M
    21; [# ^- g  w/ J
    22
    ' ^3 U, }) m4 n  G4 P/ S! b! I" BSqueezeNet各层详细参数量及其输入输出如下表所示。
    & W2 Y) M5 p. R; s: _% o! x1 R: _% t; B2 [# k: E
      S) X8 a/ k, u& \8 K0 E
    4.2.6 其他实现细节
    : W: |/ [; Y' j% s8 ?: O1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
    ; R/ c# Y$ ~9 i6 i& ]& w9 F/ Esqueeze和expand层中使用ReLU- L9 N& Q- w0 Y- A; A
    在fire9之后的layer中使用ratio为50%的Dropout1 n7 Z& F. `  C3 _8 e4 N
    参考NiN算法想法,SqueezeNet中不含全连接层! h& C. x8 l7 ?
    训练时,前期学习率设置为0.04,然后线性减少
    ' Y4 c4 s" Q4 U" t4.2.7 总结5 _9 H* f3 C; Q8 a, B; O& N) E, E
    本文最主要就是三点:2 [  f) l. Z8 X; @- P& C

    , Q' M; f& o$ b7 I用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
    & z* k+ }. B2 h9 Q' Y3 [0 b减少输入到3×3卷积的特征图的通道数,减少参数量9 x' G5 i+ h& M) R$ w
    不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率2 u0 u" F/ R* r! Z2 X$ Q2 _! Y
    ————————————————( H1 C+ |+ F  H3 f% C
    版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    2 K; t3 s5 ?3 g) a, W5 A9 a6 f6 i原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
    3 |( M7 f; d% L  A' `, \' O* N1 J
    6 v! n5 o6 R  M- @* e
    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-9 03:28 , Processed in 0.481350 second(s), 51 queries .

    回顶部