QQ登录

只需要一步,快速开始

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

    $ O, [3 m$ I" j7 u; A. G6 o轻量级神经网络算法-SqueezeNet
    2 y  f+ \) l, O4 j- D  z% G4. 轻量级神经网络算法目录! [* i5 G$ l7 J$ I) F/ m% y
    轻量级神经网络算法# S2 q9 p  o( g/ m2 F' a; C
    4.1 各轻量级神经网络算法总结对比
    8 x/ \# \7 A+ T: b4.2 SqueezeNet
    ! k3 @$ Y2 E0 l) C* |' h# X, r4.3 DenseNet( j$ a- d9 D1 q3 c
    4.4 Xception) J  A# Z4 [0 S/ G  X4 ?( `
    4.5 MobileNet v1
    - E2 \: i5 ^  P  p- S  }4.6 IGCV  q4 ~: Q' Z2 m: G
    4.7 NASNet5 v- l/ p( H# W* ~. h5 p5 f* Q8 P
    4.8 CondenseNet4 ?! t% P7 x$ ~2 m- K, \6 H
    4.9 PNASNet
    + @% `$ V+ K* c& g( l4.10 SENet% s" y( ~, `3 |# H. d" }& u/ N
    4.11 ShuffleNet v1
    , Q6 O2 u* s! h* u# q4.12 MobileNet v2- \1 J' C7 C( I5 U+ O) |' F3 l" y
    4.13 AmoebaNet
    4 }1 \* t1 R9 P1 ]4.14 IGCV26 Q9 A, f. f& Q0 y: V- F8 W
    4.15 IGCV34 _3 a' o6 R3 s7 [: s
    4.16 ShuffleNet v2; v5 Q2 ]( ?' i1 h+ b& B
    4.17 MnasNet
    - F8 E* l' ]& W; `4.18 MobileNet v3; q% g/ R* q* d  }3 Y
    深度学习知识点总结
    5 h8 O' e0 P, i6 E+ g; R4 M: `* i8 ?  o% p
    专栏链接:
    4 n2 L1 k8 D1 K' c7 xhttps://blog.csdn.net/qq_39707285/article/details/124005405
    # |8 }& Q5 o( I. C. P% C. Q; j本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。: [& P* x, c" C0 E/ L0 k

    ( W- K! C1 F! S" d3 ~$ Z6 }0 \本章目录2 N# [  O7 V% L  V
    4. 轻量级神经网络算法目录
      V% P8 d7 o6 e: K# f, Y& @4.2 SqueezeNet& G1 t( R0 r0 t% I' ?  n
    4.2.1 问题分析1 a0 C; t: A$ [! q
    4.2.2 SqueezeNet的三大策略
    # `9 i. w0 A* V( v4.2.3 Fire模块! z' u/ U! J% }! G! X; z
    4.2.4 SqueezeNet整理结构
    ) C: n( m& y/ m" x. d5 i4 j2 Y4.2.5 代码实现SqueezeNet
    ) y0 j) W. A- s' A4.2.6 其他实现细节
    ) {) @5 i3 @# C  O+ R4.2.7 总结
    ! t3 R1 U, c/ d  W2 Y- b4.2 SqueezeNet2 M" ]0 N! b) i1 b
    4.2.1 问题分析
    9 f' h2 H0 M" t; {最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:: T' P3 {% e/ ~) r

    , u! M0 Q, G: X在分布式训练期间,较小的CNN需要较少的跨服务器通信; A8 R2 v; F' b7 o& D, D6 `% C
    在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入- S0 C; X4 P! u0 Y
    较小的CNN更适合部署在FPGA和其他内存有限的硬件上
    - j( G( _6 G! k9 I) }+ ?为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
    * h3 a$ c/ N& p, M/ @  ~# p5 w
    $ z5 u6 [; l; E; d4.2.2 SqueezeNet的三大策略
    " Z, ]% [  Z. W9 ^: l2 }5 L策略1:用1x1卷积代替3x3卷积1 |" ]. u, K) O: ~8 j( p" ]5 f, i
    1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。+ f; l  L7 h/ g( n7 n' t& B9 x
    9 M2 t6 L/ Q! T4 }5 S+ [' @
    策略2:减少输入到3*3卷积核的通道数量7 W  z7 _0 A/ b# P
    对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。# u( O3 B0 @7 n7 l& S. l0 q
    ; z: d" W9 I' e
    策略3:在网络后期再进行下采样,使卷积层具有较大的激活图+ k9 l- d# P% O& q
    这里的激活图(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中。8 K. i: P! ?: ?- L

    ) f, V- l- E. t8 t  k: B* \# z+ A策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
    5 l; A8 F0 m7 ~# d6 W& _. |! o2 m  ?; u! F3 n
    4.2.3 Fire模块
    " n1 E0 u: K  E为实现这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的想法。
    - o) P; z1 N2 g9 _# \7 P' l8 `6 Y1 A
    6 Y0 ?) N: V7 O. L: h4 b3 x
    4.2.4 SqueezeNet整理结构3 |1 _5 O+ m+ q  k8 X  c, O! m# A
    SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。+ E, d( d+ @* u
    7 Y3 ^# a2 v# g
    6 k- W( h3 E) ~5 f2 f! p; W
    4.2.5 代码实现SqueezeNet
    8 |, c1 \) i3 d$ vFire模块的代码如下:
    ! d2 w# n! m5 u: @8 `) `2 V  o" Z! s- v& A( A5 f+ R  {7 d. `
    class Fire(nn.Module):
    6 ^; z% v% M6 h: Z8 Q
    , V8 Z; o- R, |& K    def __init__(; e& V9 o6 Y6 ]+ j
            self,+ `) \# Q7 a. B6 m$ L
            inplanes: int,
    % A* P7 ^3 D  Y" @        squeeze_planes: int,5 D6 O2 E. E& c  j
            expand1x1_planes: int,8 B; }% U' \$ r0 R, F" k" ^
            expand3x3_planes: int1 z- L0 h/ m' Q# F6 E$ e' V% P/ C4 d
        ) -> None:8 p0 n& c: [) _  n, p* s
            super(Fire, self).__init__()" M  y5 B6 Y! i( e: {
            self.inplanes = inplanes
    8 D0 a$ X1 T4 k/ B7 v        self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)7 d; ^: P- D* Z8 y
            self.squeeze_activation = nn.ReLU(inplace=True), e( x& |+ z( b5 G9 i, _5 m
            self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
    4 \) X8 ]; _& w- V+ Y( d                                   kernel_size=1)
    * s1 o/ f) d+ U7 W# ]4 C        self.expand1x1_activation = nn.ReLU(inplace=True)
    ) m0 b5 l% D+ @4 \& |% ?        self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
    3 [% ^  A/ a5 r1 F( K* V( d2 O7 O4 J" X                                   kernel_size=3, padding=1)
    + n$ G' O3 h6 P& H" U1 L        self.expand3x3_activation = nn.ReLU(inplace=True)
    * m% s7 q6 C4 v. J6 ^+ N0 c: T. c+ `: ^8 i  g+ q* @6 j' |0 O; A
        def forward(self, x: torch.Tensor) -> torch.Tensor:
    % g2 d7 M7 f+ V        x = self.squeeze_activation(self.squeeze(x))2 t: D  S" W/ g; A$ }0 ^
            return torch.cat([
    ) U& l; n- h" y  t' c  o% D* K            self.expand1x1_activation(self.expand1x1(x)),
    ! F6 E+ _+ T, {- C5 r            self.expand3x3_activation(self.expand3x3(x))
    , w( E- Z8 v4 ^) H        ], 1)  e" E5 C: g" V. b# z3 x
    4 D0 D+ h8 t7 p
    11 d5 J4 Y' C- y) M  K9 X" E) x% G
    2% g; G5 ^! t/ t, v0 W2 q" Y
    30 a1 q$ N& ?$ ~& R
    4
    % f* ^% s( t2 `' L7 y" e59 q4 h1 R5 d; i
    6& X5 l' O5 M6 m$ E! a
    7$ j0 ]3 q/ B7 `& q
    8) @1 u; A# ]. r4 t1 q. o) z9 h
    96 ^1 x, C8 o; l. E( d* G% o
    10
    2 l4 l8 _! R/ U+ q' k( E  {. p11
    " L4 P5 _8 v# Y% q, s( k! @. B" o+ @12
    ( [- f/ v0 D( `8 ~2 `7 h3 {9 _13& t$ I9 W# L* N, m& ~8 b
    14* B) \8 y9 {# s
    15
    , ?( r/ R& ^! i, O" {/ A16
    1 _% @5 A* B7 y" L17( ~  h# V1 {) P2 Y6 Q
    18, N2 r- B" X) L/ `& Y. V
    19
    . `, F4 U+ _9 X: y2 S200 x5 u- N! {' O4 w( n
    217 P7 P, @! Y+ W
    22
    0 k7 b1 h1 G3 j- l8 T23
    1 X" |3 a2 }! `4 ?  |24
    6 d! ]/ G% m* Q25$ R9 S, ]2 l6 j
    26
    ! q8 X1 _& G& l4 c! ^SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。! q2 d; B4 c% m

    ; _8 U' n* B+ m7 j. _SqueezeNet1_0的网络结构如下:
    6 V: U# E+ I! o+ v: L* g& G
    $ ?! e; n1 e8 I& l' |self.features = nn.Sequential(& Q- Q; i- d6 ]3 i3 h0 j" U( P
        nn.Conv2d(3, 96, kernel_size=7, stride=2),! C  A2 t2 J- |" Z
        nn.ReLU(inplace=True),8 B1 w6 z# E4 w% r0 r/ D) f
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),1 W1 t6 s; v9 I) p1 ]+ \
        Fire(96, 16, 64, 64),
    ; @7 D& f9 ]: U9 d, F    Fire(128, 16, 64, 64),
    , v: U1 C! H9 j* Q1 v' f' @8 k. Y    Fire(128, 32, 128, 128)," }6 M' R0 U3 ?; }: t9 O6 a$ m
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),4 J# d) B/ K$ W4 ^# f/ B. c9 s
        Fire(256, 32, 128, 128),
    0 C  L- w, c, E6 e% X8 k* d/ o    Fire(256, 48, 192, 192),  }0 ]  ^- u5 M/ H" a" t
        Fire(384, 48, 192, 192),5 s! }! ?6 a  s; t
        Fire(384, 64, 256, 256),
    2 D' C& h/ u2 V& p7 {. }; M    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    . K" @/ O) M7 L$ m& o    Fire(512, 64, 256, 256)," ]- W& t3 l: _, m( ?! S" n
    )
    " i6 a) Z1 W- E* i1 G- f' Wfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    . l8 a2 d. q. bself.classifier = nn.Sequential(
    6 |- ^5 k: s/ i! ?: ]6 R+ x    nn.Dropout(p=0.5),
    ( X3 ?9 l# V6 M/ p6 J9 b) s    final_conv,
    ) O# J+ ^  d7 M  V( A/ {# g    nn.ReLU(inplace=True),
    ; J& d/ \" Y8 G/ d8 g    nn.AdaptiveAvgPool2d((1, 1))
    , @; n2 d' k6 [0 X6 a5 G)+ n7 r! h5 e- q6 @0 d9 m

    # ~. k) O# @; ]  D. `2 G5 f5 @: I8 p5 t  x- m5 O! v# {1 @
    1! `9 X6 L, s+ g+ S
    29 @# W: e9 {) K" F+ g
    3
    $ @4 n4 S& B; H2 N; W; B7 V: {4) T# z3 k2 _/ O5 o/ F; `; k8 _, |
    5
    7 B3 d+ X0 X: R& |6* Q8 Q7 Y* a+ ?
    7; {( ]/ @1 j: H8 Z1 q- h2 g9 M
    83 {+ _: O& R$ Z$ s
    93 |0 r/ }+ W! p( C/ S
    10
    1 l" V# p2 Y5 c! O; R5 I9 f11
    + g& C; S) P' X9 w5 X( V. b( T& D12
    & m3 O. D$ t. u' P$ X8 w3 z- U139 L$ F5 |! Z7 M6 G
    14
    4 D- `, s' H, G2 p8 M157 r% U1 l: n5 @' v
    16% }6 U, V$ w& i  f& `0 J8 n$ O! O
    17+ E# f. ]# d0 i6 T! h
    18
    9 k6 P' l) y+ t8 \6 d19' P( V. E% r6 b9 f; s  D* h2 e
    20% s& ^2 C0 E# k1 V) d$ H. w# u: m* U
    21' z9 P  Q  k) q* ~; T$ l
    22
    2 `- ~' m  _' u6 G235 i) o, `# L$ Z4 n9 ~  W3 O& l
    SqueezeNet1_1的网络结构如下:1 \# m; p8 I, r

    - _0 M4 ?" ^4 F5 `! c- b- iself.features = nn.Sequential(9 t' d% U4 X; y9 x2 ~- V# d
        nn.Conv2d(3, 64, kernel_size=3, stride=2),2 Q- |% S. J* P) a, Y5 E$ u* H/ p
        nn.ReLU(inplace=True),9 `5 Y3 |1 s  `8 c9 e/ P+ o
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),& g7 C, ?- N0 R' B7 ^! P8 l; ?
        Fire(64, 16, 64, 64),
    : G$ e- ~* @& C8 F: t. J3 b6 L, n  f4 g    Fire(128, 16, 64, 64),
    & \  M3 S  E0 N  w    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    0 F# t9 u, M2 ]# ]1 l' ]    Fire(128, 32, 128, 128),
    1 H. E6 Z. t; R- g- J! \    Fire(256, 32, 128, 128),
    ' d2 e% B6 b" p    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    7 C( p# r& f5 ]6 Z4 h$ k* T' Y    Fire(256, 48, 192, 192),
    8 T6 m( P' G* ~6 Y/ r    Fire(384, 48, 192, 192),8 V4 o. N: ^' b" U& R2 w; B# @5 X% ]3 E$ N
        Fire(384, 64, 256, 256),
    5 Q: q7 p9 _; \* y* F% H# T    Fire(512, 64, 256, 256),
    & U5 ^! s7 o8 [) h4 O# F. _; m)" G3 J1 r& p: ?6 L3 y& _
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
      g# T8 k6 F8 i. C. i2 wself.classifier = nn.Sequential(, C# u+ r( S6 h$ U% @; |8 x
        nn.Dropout(p=0.5),
    3 a% A. {3 B+ G- e! L! J! ?& G    final_conv,) ]% s- d2 v7 K. N& M
        nn.ReLU(inplace=True),
      c. {; D2 ^8 Q2 d& u; U    nn.AdaptiveAvgPool2d((1, 1))/ [) C! ^8 I; L9 d, `! @4 Q+ ~
    )
    # P, r9 Z& ?& @" d- S5 {- R2 ?* G2 \, p) w1 |& a& d
    1
    6 z& Y! r* o, m, d, \2
    , f- I- l  g1 A" n, \6 b, a3% Z: b7 n. h, j; d
    4
    - V0 ~7 v) j0 p, b7 x5
    ) ~' h* {0 i( D# `* w6
    ! L1 M% _, @; h* w7 r75 d+ O5 z; K2 Z5 @$ x: Z5 }
    86 p8 H3 g  k/ C+ a( s8 I: G
    9
    2 c8 E8 N  ?$ h$ K+ d6 n8 Q10/ G( o, E; G( k, q2 q
    11
    : I. @: q7 }( Y12
    + e0 T/ J- I" \) ~, H: h13
    2 O/ f( C7 U* V( M7 f3 o14
    ' l9 d! o( U- c& G3 @" Q152 j; Q* J) ]5 T) C; Z  \
    16
    / B! d2 _/ t& Y9 k17
    % Y6 \5 [- b  w: j  s$ T7 C18
    $ B# E$ j: _& I19% j) v) A& B/ Z6 Z6 n, }
    203 }1 S" y1 o+ q0 H7 ~
    21) u+ w% i$ i0 Y% c& |, B
    22) B& L2 _/ F* m3 B, N& b) d
    SqueezeNet各层详细参数量及其输入输出如下表所示。
    ! w4 t4 X# u+ }
    6 m- `/ h) `# h# o# _; ^" K; O, @. r6 j$ ]0 ~& U9 ~6 x
    4.2.6 其他实现细节
    & Q) j! }+ h5 m) W6 \6 o/ U4 e4 z1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding9 U/ l  o' f9 g- K, i2 q
    squeeze和expand层中使用ReLU
    ) v! M8 w8 Z6 i; J在fire9之后的layer中使用ratio为50%的Dropout
    6 z+ S7 u" \1 k  x' x3 H4 F+ D参考NiN算法想法,SqueezeNet中不含全连接层
    . i2 o$ C1 D5 R, J& M4 G& [训练时,前期学习率设置为0.04,然后线性减少: r1 l) [2 F+ [: j
    4.2.7 总结- U$ B2 L& r6 h- b1 g0 {% m6 y* X
    本文最主要就是三点:& U2 l5 m5 t* y% Z
    ' D, |3 l5 r- _% F
    用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果5 v) ?" T$ _9 m! K0 O; L
    减少输入到3×3卷积的特征图的通道数,减少参数量( C. W6 ?& L& x- S" r
    不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率! A, b; O9 H# W/ m( E& v; P/ e
    ————————————————
    7 p8 c& v  B* z, E  Q& f+ G版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 f' i: v- M4 S: ^% _
    原文链接:https://blog.csdn.net/qq_39707285/article/details/1264981007 T  @' x7 q5 O9 W8 [/ r

      x1 L1 I* u1 D; \/ n, a; }# N: L( J4 |$ p* V6 i- s# c" D" Z% {' A) L
    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-6-12 03:32 , Processed in 0.385803 second(s), 51 queries .

    回顶部