QQ登录

只需要一步,快速开始

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

    ! k5 {* u( J% C$ |/ M. _/ [; ?1 g轻量级神经网络算法-SqueezeNet7 q1 G; M' d5 y2 @
    4. 轻量级神经网络算法目录: D; e: L! J  l) x* N) ]* a4 T
    轻量级神经网络算法
    3 W: W$ w* R% J. p: z) P  p4.1 各轻量级神经网络算法总结对比
    3 v3 ?% f" N: N- G6 h4.2 SqueezeNet
    % N: L- h6 r+ x: P4.3 DenseNet
    ( Y% Y" w5 {( y9 |4.4 Xception* x& W( c: c) J
    4.5 MobileNet v15 |, [5 W- b9 |! R
    4.6 IGCV8 i1 w1 {$ R; H) p
    4.7 NASNet/ ?* P  C3 J! |+ W
    4.8 CondenseNet; ~( b0 O9 E* I& M* _- L
    4.9 PNASNet
    6 V) o, O+ X! g; X+ A2 H4.10 SENet# u- |9 O* ^6 ?
    4.11 ShuffleNet v1; J# O* {: a/ u% ~9 J9 Y
    4.12 MobileNet v2, M( e1 V9 E+ Q8 |$ v1 c
    4.13 AmoebaNet
    ! e1 V6 h' w! C4.14 IGCV2
    ; q7 D6 B; n1 `3 l2 J" r2 g4.15 IGCV3
    3 c. s1 r/ h& _' ]( _4.16 ShuffleNet v23 a9 L" \  o' ]( b
    4.17 MnasNet& v! L% J6 h3 l+ i7 w. h; O. `
    4.18 MobileNet v3# S6 Q8 L: }3 Z( e: k" x2 y" d
    深度学习知识点总结
    # u* |# M( R0 Q7 ^: P9 V1 Y9 L6 F* h; R* z) e7 W
    专栏链接:; ?: D9 u1 {2 k7 q2 c
    https://blog.csdn.net/qq_39707285/article/details/1240054053 f+ ~# \3 ~* Q0 d3 y1 E; {6 {: {3 y
    本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。% f% L" |' K) w9 y% _

    # p4 h3 A5 x2 p, d* p0 h1 L, h本章目录' P* Q2 U, ?( k1 Z
    4. 轻量级神经网络算法目录
    . U5 X6 l: M2 C& E4.2 SqueezeNet
    * C) V* a( D: w+ y+ n4.2.1 问题分析
    $ d* i8 R# I5 E: t3 ~9 v$ w. g* k4.2.2 SqueezeNet的三大策略* y, L% }7 z  G5 W
    4.2.3 Fire模块5 }& b8 {6 C5 u
    4.2.4 SqueezeNet整理结构
    6 N* r9 y1 U9 B8 [" m- x2 ?4.2.5 代码实现SqueezeNet
      p& E7 r5 }7 o$ T/ X- q4.2.6 其他实现细节
    ) ^: Y& r$ E! }1 l* L4 ^& z3 n3 G4.2.7 总结* ~( J' I* E4 Q  v) R- U, x
    4.2 SqueezeNet
    4 N$ p/ P5 c2 [" o- v. V/ q& s4.2.1 问题分析/ Z2 @8 G& H4 ]# {3 w5 u  N+ w3 `
    最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
    ( b3 p4 D0 `0 N* x/ k- Y1 U
    1 c$ \, _  A  q/ ]在分布式训练期间,较小的CNN需要较少的跨服务器通信' }' ^3 ~* m; M3 m; e2 w: a8 r. c* o
    在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入4 p9 z- ~- V6 c9 U9 O) A4 U
    较小的CNN更适合部署在FPGA和其他内存有限的硬件上& `1 O: o. B- e  F2 L  b/ {& s" \. m* n
    为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。: ?; D' [" g! }* }7 W( V0 p/ U9 ~

    , q3 E0 A; s4 Y4.2.2 SqueezeNet的三大策略7 O* p: {0 m! |) H( h( k
    策略1:用1x1卷积代替3x3卷积
    , s* {# y4 X& I1 i) k1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
    , G5 L& g1 _* t& A: ?8 ^  q- V
    + j, n0 \; r7 W! V策略2:减少输入到3*3卷积核的通道数量
    7 I& Z. M3 F$ d) r( t$ B0 U& Y5 a对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。7 {+ j0 Y" D) w: y

    8 e" O1 ]1 C8 f8 P1 J策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
    : L6 u# C( X6 A2 l$ ^* K这里的激活图(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中。) v1 {1 A  i( A/ V: H
    3 Y% L6 \; {0 X& A
    策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。' l0 p' k; p  b+ X$ w0 L
    5 q4 O! D7 R: q- u( U
    4.2.3 Fire模块
    ( ^0 ~) q4 D* ?3 G8 u% Q为实现这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的想法。: ^  ^2 a. M4 m' _5 a& u

    # A; [3 y3 Q; S( i& n8 O: y% S! H1 k& @$ F, g
    4.2.4 SqueezeNet整理结构
    " C6 S& w* z) u  hSqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
    / s3 R+ o- e* o; s7 k3 O- r9 m
    & T6 g% C" X: ^! y. n! r5 @$ p+ s4 B$ ~( R0 ~
    4.2.5 代码实现SqueezeNet; f8 @7 S  |' P* U0 c0 O8 p' @
    Fire模块的代码如下:8 r" j) C+ m$ \& a( \) P
    ( V, ], \& h9 ?: Q
    class Fire(nn.Module):
    ) C0 h5 M' n; U# c+ ~; F7 x7 E# e: d* y1 k8 Y
        def __init__(
    5 o9 K* J8 Q% M, u3 v% h' H3 A' N        self,- G3 t/ j$ d5 S2 {& x' U. ^
            inplanes: int,7 W/ b; x- A" `/ m
            squeeze_planes: int,
    7 R9 T9 p% Y  `        expand1x1_planes: int,; t- D( d0 V' ]4 T4 ]. b
            expand3x3_planes: int
    ( q' ~5 s( j1 M; e    ) -> None:
    # f# E0 c* G- k  F+ e) K- K0 D        super(Fire, self).__init__()' L2 ~& K& A7 F3 z
            self.inplanes = inplanes
    + H* c; v' w" F        self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
    ; j! p3 a0 @) S+ }        self.squeeze_activation = nn.ReLU(inplace=True). u) `8 N; U5 t
            self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
    $ w, I% Q' d6 ^  {/ F( V                                   kernel_size=1); X2 @8 ^& L1 ~) n: g3 @) J# |
            self.expand1x1_activation = nn.ReLU(inplace=True)! Z! Y" E0 N+ r0 Q# ~& d3 j
            self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
    7 ~+ E! `8 t; O5 r7 F5 G3 F+ c3 h0 t: s                                   kernel_size=3, padding=1)# v# ^: [: s4 ?9 v6 t4 h# Y  z
            self.expand3x3_activation = nn.ReLU(inplace=True)% w* d8 S* f7 [" g- P

    4 W' _* I6 h$ G4 B, w5 `" W8 k    def forward(self, x: torch.Tensor) -> torch.Tensor:2 ~+ U) d8 h1 t- b! N3 E8 ^
            x = self.squeeze_activation(self.squeeze(x))
    5 ~& m# X; t2 d+ H$ [* s        return torch.cat([  ], i1 ~/ j& Z8 F$ k: y7 \/ E4 b
                self.expand1x1_activation(self.expand1x1(x)),
    - C7 P0 _$ M, |6 ?            self.expand3x3_activation(self.expand3x3(x))! W; p. z: P+ o  s2 P' N5 O
            ], 1)
    ; {6 P" N# X. G$ A" C4 P3 z6 B2 h' q- I9 m) @
    1
    # M; A" ~$ E, o1 @2
    / Z( [, t( v) G5 Z4 C30 G7 U& Y/ C' J; D5 z6 V# @
    47 I; r) h, \) i) P  c$ q* c
    5
    7 I: _) A6 J  J6. _% U( o) U. W9 O
    7
    $ H5 T$ D) d9 V& b) |+ ]( l8- J3 [* Y! |$ c  H
    9
    " e9 S# {  Z( Z  v1 r0 P100 a  v! [1 e) I' Y: g( Z- Q/ l. u
    11, w" `/ Q/ V/ Z: x& S! l
    124 d# P% Y# t6 R/ o4 T
    13, ]9 F- y9 _) s0 r. C
    14
    5 }* Z' T8 h# I( {- q+ q4 G156 {' `6 R8 c; H
    16
    , z0 X  r6 X/ h; ?7 E5 w17
    % n% `9 r) f& `# x& [; L4 Z188 u: ?: ~/ F& r
    19! N: O9 p8 k: f) v: b
    206 \9 _  \/ Q& d5 F
    212 C$ m" b" `+ f) H: ?
    22
    ) J- u/ I+ x5 I235 @, T  H- @0 t6 S# r! n/ P; b% K
    24
    9 c$ _! Q$ p: Z25$ N9 r  y% S# i: h0 t6 u2 ~2 r
    26+ z$ e. M- t/ }& X0 E, _
    SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。8 Q. s% l* S! j/ ~& C* J/ Z# h5 V

    ; P: C- Q3 F  P! V7 P; n! B8 A! wSqueezeNet1_0的网络结构如下:
    # L4 T$ V- P5 k
    + y) j& Y& L) T( u9 R  I0 l1 zself.features = nn.Sequential(
    ! c( q2 m) E% X5 E( f2 S    nn.Conv2d(3, 96, kernel_size=7, stride=2),! ]# J  y- a  _1 V
        nn.ReLU(inplace=True),
    # z7 t! a" p/ L" s    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    0 r* `2 F# }4 b: @    Fire(96, 16, 64, 64),
    . S, r. H; S- s$ Z5 P    Fire(128, 16, 64, 64),# q% Z! |8 e8 q1 z8 i' s' C
        Fire(128, 32, 128, 128),
    * f6 |! m' {) {8 {7 b7 I    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),5 v3 U% h* \9 u" ^# ]$ |) s
        Fire(256, 32, 128, 128),# }! I9 Q0 U0 s5 Q
        Fire(256, 48, 192, 192),2 d& l+ i7 v" A/ _( t% f  R
        Fire(384, 48, 192, 192),+ C/ n2 p4 A1 Y( X- c0 V  ]( v8 `
        Fire(384, 64, 256, 256),
    3 E! z2 L6 y3 ^. \* `  m% t    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    , A! i! Y8 z- x! }- F    Fire(512, 64, 256, 256),
    . F- w  ~* ], \1 X7 N); Y1 I: I. X9 H9 m
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    1 t! G6 |1 m5 K) ?self.classifier = nn.Sequential(  C: W9 M& N4 p* y0 c
        nn.Dropout(p=0.5),
    % C6 ?3 D& p# b  v/ E, E    final_conv,
    - m' o/ f. o. [$ a) A/ M1 a    nn.ReLU(inplace=True),8 e9 T2 K; Q' L" m
        nn.AdaptiveAvgPool2d((1, 1))
    ; @* O( D% S, ?" A* K/ x)
    8 q7 j2 W- c4 Z# W& |" b8 ?; A/ @% b* X" M. V; |) F( J3 M3 W

    1 s( z) f# }, a, |0 N1
    / ~0 Q3 ]# W' P9 o3 z2) w' t6 U- o  Y4 l" u& {
    3& D9 k) y* v0 d8 S
    4
    1 |) J0 e# R# S: c* T; b: S. }- ]+ L5
    ! @; b( }9 ^  s$ l64 ]5 X6 n! c( n* U& Q* V
    7( [  F  w2 o  B& G/ t- t7 o0 y+ f
    8
    6 L; x# Y, \3 I1 e1 u9: z5 t% v' v4 W$ m( t2 ?
    105 ]# p( ]1 G2 B1 b5 O! z
    112 s' v# E1 X* R$ r, e. P7 @# F
    12
    % ~* u) u( W4 \) \- o8 k5 ?) [13
    0 X9 M" i& R$ g6 [  N' H/ o3 |4 q14: ^; C" T. g+ c' b/ O: c0 b. t
    15
    + j8 C" ^9 s# e" e6 D+ c/ Q; ^162 h: i# m6 _0 `% F8 q& i4 l1 }
    17
    ; o" F5 R3 q. T+ ~* }* w) l18
    & A5 U8 B$ W. @# W  L195 G& Y) @& W6 ?, Y) K+ [
    203 u# p7 x3 Y, p$ b- [$ C
    21# B7 Z! }2 O' Y& R; r& s
    22/ }5 o- J' V1 L& a& B
    23
    0 [+ z9 b! i& _' aSqueezeNet1_1的网络结构如下:
    1 C: K0 W. A8 c/ r' I( `/ b
    ( q4 d6 Y3 v% C6 q5 ?! Kself.features = nn.Sequential(. @) y" Q# \* O- `
        nn.Conv2d(3, 64, kernel_size=3, stride=2),
    : v) G5 ~4 H6 E9 o3 Z    nn.ReLU(inplace=True),
    ' n! A+ p( d) \  U: l6 y    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    % V* G8 m" u- x, A3 G- l- S& c    Fire(64, 16, 64, 64),8 y! b3 j' b! J2 ~' g, v" Q8 U0 Q
        Fire(128, 16, 64, 64),* p! L/ s2 e4 m4 z0 w
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    & u" a, H, y, @0 z& i* y9 \    Fire(128, 32, 128, 128),& W2 N1 B; w9 O* i  j2 F) F
        Fire(256, 32, 128, 128),
    ' _1 A( |2 z4 _- j( N4 U. ?6 r    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),5 ~4 a& m& D5 ]3 @. ^
        Fire(256, 48, 192, 192),. k6 r9 I, Y+ Y) {! S- _( e
        Fire(384, 48, 192, 192),
    2 s' h: Z$ ^5 }% `    Fire(384, 64, 256, 256),- x, Z" `7 h2 u0 J0 s/ h; X9 k6 t
        Fire(512, 64, 256, 256),
    3 w: \! C" o) f! H/ T7 E)% E& `. g' {5 I* l- I' m* M1 _, B
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    - y) z9 P8 l( Tself.classifier = nn.Sequential(
    8 d: W+ q. f9 `7 |    nn.Dropout(p=0.5),$ ]0 e2 b* M+ m( P% b
        final_conv,6 Y- x- Q, m- H& A: b- |3 K
        nn.ReLU(inplace=True),
    1 \4 b2 Q, z5 E    nn.AdaptiveAvgPool2d((1, 1))8 m, N7 B. R% `8 b7 u
    )
    : n  z. w' f" h1 Y) L- Q+ h/ R
    1' x3 y6 Q# B# M7 h% A" H  _9 K
    2
    " s5 d! {, ?" q5 w3 B! V) z1 }% X* i3, ?+ K- Q% X9 S" Z
    46 ?9 O: _5 J" m5 O  M4 i- v; U% a  Y0 [
    5
    ' [3 ~4 V1 T4 q; R4 k& f, d$ O, J: a6
    0 d! [) j$ U" ]' _3 |7 B7 m( I7
    ( s/ d& Y: p+ r0 T; k0 V2 t# S84 ^, s& I, `" D/ k
    9
    4 d. X/ G6 j$ Y% W- z( y2 k6 ~: g' K10
    - \' i: r- K0 X! Y8 o7 q1 U- i* ]9 x11
    . w7 q  x5 t9 c+ T" Z12+ ]  N4 W0 p2 N
    133 P, A) y7 J' u! A4 n
    14  |. \9 J6 d, H
    155 w3 k/ ^# Z% R& J
    16- B# O2 G  x: ~8 ~% s# a! Y
    17
    , x* E$ ]! b: s! R9 j4 q$ z$ i2 R0 e9 u18
    : J* \1 N0 M* [" c9 _  H1 Q8 @8 K19
    ! k, _6 j& O* W  s6 M20
    : y( s& j) \4 Q21
    ! ]$ U; @" a  \& O6 e0 [22
    , o, E+ {1 v$ `$ Q& x; [SqueezeNet各层详细参数量及其输入输出如下表所示。# w2 V% p" o! R( I& S0 d' t, O1 e
    0 g! M7 B6 P1 J5 ]/ B& \. s% N

    " @3 C# A, N: g2 @% U4 g4.2.6 其他实现细节
    1 Z: ?# q6 d2 p) d1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
    ( e* O' j9 }& j. d  Gsqueeze和expand层中使用ReLU
    0 G1 W0 ~( H; R在fire9之后的layer中使用ratio为50%的Dropout
    8 M7 c: O! p% u: c  I7 f2 c& o参考NiN算法想法,SqueezeNet中不含全连接层. ?9 {& K  c) l! ^$ J" Y0 \. r
    训练时,前期学习率设置为0.04,然后线性减少7 D5 ]2 t" h9 l+ k0 r" Q
    4.2.7 总结
    3 }: U" z9 Z# M本文最主要就是三点:
      ^  _: V) \" U* v; q( X" Z, p2 L" h' P
    用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
    % }( r& l/ j1 Y8 L减少输入到3×3卷积的特征图的通道数,减少参数量
    ! {8 q; W+ i/ _( g4 w7 ?不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率4 E% Q! a. k6 P3 X% B5 o% _! C# a9 k
    ————————————————
    + w( t8 a5 X) T: A8 K5 ]4 {% Z7 h版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ) j2 ^# e, D4 S+ n9 p7 R原文链接:https://blog.csdn.net/qq_39707285/article/details/1264981003 d" J( {/ V; \2 a4 }3 u& K' w

    3 j* F$ y+ q) u0 B- D/ J& v2 Y5 R
    0 }& c2 i- t$ k- c) _
    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-4-15 05:02 , Processed in 0.421946 second(s), 51 queries .

    回顶部