QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2319|回复: 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
    / Y+ J" n! R: C0 N# n! d9 u
    轻量级神经网络算法-SqueezeNet
    # Q9 b& `/ R6 ?& v" T4. 轻量级神经网络算法目录/ {, ?0 O+ J7 h) M; t1 q5 x
    轻量级神经网络算法
    - Q$ c' O4 o3 o- R* M4.1 各轻量级神经网络算法总结对比
    6 Z2 O( U. {2 z( k8 n- g8 b4.2 SqueezeNet
    & t: Z) _1 S8 ?- {# {8 K4 R4.3 DenseNet7 W) s- |; F, f+ p  i; m" F+ ^& v
    4.4 Xception4 r' y! i' E0 k) S9 a9 \) \/ s) b; T8 j
    4.5 MobileNet v1
    6 z2 K0 y5 c+ O; v$ ?4.6 IGCV8 `( g; D+ i3 h& V, g* ^
    4.7 NASNet
    ! O$ P2 h" a/ P  D$ I3 t4.8 CondenseNet1 `  `7 g4 M3 b; |6 k3 x, f: x
    4.9 PNASNet2 T5 {" _9 M+ k
    4.10 SENet
    $ y- C9 q/ U4 a& F' _" j. P4.11 ShuffleNet v1- L0 M4 i2 X- Z9 _! t
    4.12 MobileNet v2+ E/ @, S/ U8 A, {
    4.13 AmoebaNet) _  C0 g- O7 D! W9 z' f6 A$ ~
    4.14 IGCV2
    + O- w' i- A7 l8 N. d+ s" ~0 `4.15 IGCV3
    7 W9 B( A* K; |5 i2 {/ ?! Z4.16 ShuffleNet v23 ^! r2 i% X, M  n4 \# K/ V
    4.17 MnasNet
    / p4 e& Q. ?* Z+ s4.18 MobileNet v3% T; q# f' M' K% \) S( q' K8 U
    深度学习知识点总结6 {( f9 v- i8 {# |; [
    7 ]/ J3 Q' B3 |# F: E2 u. n3 ^
    专栏链接:
    / b! S  X! k3 i2 jhttps://blog.csdn.net/qq_39707285/article/details/124005405$ B( Q8 n- |8 T6 V* ?8 m% K5 j8 c: S
    本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。9 q# \6 r. q+ `3 N: K/ N
    % K8 q3 C, _' G) l% `
    本章目录( {. G) S  J  M
    4. 轻量级神经网络算法目录
    " N" c: N3 i% a, |) q3 i) f4.2 SqueezeNet: m; Q, T  E+ U* `
    4.2.1 问题分析9 R) e8 E2 v& H) N
    4.2.2 SqueezeNet的三大策略% J) E, _, i: S. O9 {
    4.2.3 Fire模块! o$ Q. x" V: d( s
    4.2.4 SqueezeNet整理结构
    ( T' D5 q$ {$ B$ Y/ h+ H/ {3 m- G# u4.2.5 代码实现SqueezeNet; p" O% g) Z& T0 p
    4.2.6 其他实现细节* Y3 {/ `  S) a
    4.2.7 总结5 P! l3 T3 D; {( B, @: B- b! c
    4.2 SqueezeNet: q6 Q8 d/ S- X/ f2 c/ G! x/ R" Z
    4.2.1 问题分析+ R. r3 Z1 O  D$ s3 r- d
    最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
    $ m9 }( n+ s2 h& b6 W3 V+ @3 ^
    ( R2 ?6 V: r; X, O! Q! ^在分布式训练期间,较小的CNN需要较少的跨服务器通信
    : m% b, E6 [8 ^9 u+ {* `* X在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
    " v5 [; o0 J4 c8 |0 y$ p较小的CNN更适合部署在FPGA和其他内存有限的硬件上
    - ~4 \# }: `. ^" q+ a( H为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
    7 R' o: ^/ ?6 d4 Z7 l9 P# J; W  @0 @- {& f2 x0 C) W
    4.2.2 SqueezeNet的三大策略7 z4 Q3 S) [2 W& ]/ R" ]
    策略1:用1x1卷积代替3x3卷积, Y( ?. |. D, x4 C* P* x
    1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。) w! Z3 P* Z. N/ U9 `9 O- W
    + }& M' C: E3 L* |, q
    策略2:减少输入到3*3卷积核的通道数量7 Y+ {( I( w' ]* J8 c0 L" N
    对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。. t! n% W" E2 A1 a1 P+ J- b5 q; W

    5 b7 l' {$ r" s/ t; j. c7 c2 ~策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
    " S6 Y& t# x% H! H: i1 N这里的激活图(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中。+ j* O: @4 ]0 ?- O* K4 T: R, W% V

    5 K& U4 J1 \6 l, ]3 Y% g+ t策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。, V3 B3 K& C% q9 L
    : M1 ]- `# Q% D1 a) h2 S6 o
    4.2.3 Fire模块
    - j% M* K& x5 q9 V为实现这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的想法。
    7 [/ w" p6 u- S4 P+ a9 g0 V9 j; S
    1 o1 i/ r6 c4 @. W! z2 j% k1 p  t
    5 z( I( h. T% o4 i- l7 _- q$ x4.2.4 SqueezeNet整理结构# A& V, Y; l. Y1 J
    SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
    % m8 p, Y6 r9 |  `5 i. `
    & k/ Q/ l8 ~& G
    / B, {' P9 O+ |4 f3 l2 }4.2.5 代码实现SqueezeNet
    6 H2 b( E6 w/ y! R, CFire模块的代码如下:% b) s* a! X3 g7 P9 b. F8 ?

    1 g9 K4 h' ~9 A" n$ ~6 Eclass Fire(nn.Module):: d; a: v+ d0 K; V
    1 [4 }2 O  S: k
        def __init__(  b' [. C% q, ?( c' a' Q  C* o  V
            self,
    ( Q3 J  R/ y6 b( T+ [& Y1 f        inplanes: int,6 y4 W4 n, U6 n: [
            squeeze_planes: int,
    # b) v9 F8 V" f( g6 C6 m        expand1x1_planes: int," G" z$ d" e$ J! A
            expand3x3_planes: int
    5 K. M! n0 I' i: b* G" B0 p6 `, u    ) -> None:3 T1 ^- l' W- l3 u4 N/ Z) F" V$ g
            super(Fire, self).__init__()4 W% L; M) ?- U$ D
            self.inplanes = inplanes
    4 ^- D, t. U' k0 B0 V6 R' z7 S1 U        self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
    2 F# u7 }( ^$ Y# u9 A; ]% K: X7 c        self.squeeze_activation = nn.ReLU(inplace=True)$ ]- E6 |* `% J* \0 c# g9 F' l
            self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
    $ E# @" ?- J% t& [                                   kernel_size=1)
    : D" p7 Q0 Q0 E0 W' n  Z4 @        self.expand1x1_activation = nn.ReLU(inplace=True). K) A7 u5 g# q/ n: b: N9 {
            self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
    & B; T  [$ k* z$ `3 U                                   kernel_size=3, padding=1)6 ?" u% Z' F: L" q5 y: V# b
            self.expand3x3_activation = nn.ReLU(inplace=True): L- T! I+ r) `% i9 o

    9 [% F+ `3 B3 v, D2 R- c/ T& `" l    def forward(self, x: torch.Tensor) -> torch.Tensor:
    ! x$ T& B# X8 b8 X% }2 y! U' V        x = self.squeeze_activation(self.squeeze(x))8 i( i+ L0 R, T3 w1 ~. z0 F
            return torch.cat([$ h3 E# K/ i# E- j% u
                self.expand1x1_activation(self.expand1x1(x)),
    - A2 T/ r$ v+ \& h1 c6 ^            self.expand3x3_activation(self.expand3x3(x))4 B2 G  Z3 [& S% m' q
            ], 1)
    / F3 J! Y6 {1 J' l; r# z" ]
    # ~2 H) h8 N' H* A13 p! B: ]  f) P, D, h
    2  x( r5 [) [4 F9 @$ z+ t, `
    3
    8 G. |( N6 U8 T' X5 w  `3 |! j7 S1 X4
    + M: f1 A! U7 B7 c- j/ Z5
    + ?2 ^2 |% i0 r% K* U8 `6
    6 Y- F; v" {, i, ]7 q% Y7: K0 H5 l  G0 F- b  c
    80 H4 l8 Z1 O5 v% c
    9: ]3 ?) R. E+ b+ C2 u9 A1 f
    10
    4 X3 l, P2 \2 i+ R9 u11; w  V. U; P& Z
    12
    + A( E: {# i" d% V9 J+ ?$ d0 z) ?% T13
    9 x# E7 s; S/ P6 p4 g+ P" s14
    9 k! `4 Y" l( Z# n  V15
    ! K- S/ ]" l# w; Y3 |: r163 J4 D1 g8 u' f1 b: u5 c; [6 X- y
    17& ~: J2 _1 V; T
    183 o7 Y3 A" K* E1 Q5 O
    19
    9 {5 ~+ I% X, T8 N3 p7 k8 b209 f) x  g4 K! O, b' ~. Y. t
    21
    , \  J- y7 Y& k7 x# B8 D: M7 F22  K0 b8 o/ n; n" `
    23/ d0 T' i  S5 W6 V4 a; x( B0 l0 _
    246 _6 \  T1 \6 }! k; R6 @. ^" c( K$ F( ?
    25
    , v" R+ Z2 W; N. X- y26
    ) \! ]( K! _+ O  g6 oSqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
    + A" M  G9 D7 {, {! }) n' s3 [: a9 |8 _. K: ?( U( M
    SqueezeNet1_0的网络结构如下:" Z2 l" l. J( @, |6 _% z1 f3 V
    : {8 h6 g  `2 s, _% a/ {5 V$ E
    self.features = nn.Sequential(" F! w1 _1 \6 K% n
        nn.Conv2d(3, 96, kernel_size=7, stride=2),+ x% S6 r4 J" [% Z
        nn.ReLU(inplace=True),
      l' r0 o9 O+ w  D    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),0 l7 ^+ o) @6 j. r6 U+ X! Y  S& y
        Fire(96, 16, 64, 64),, g5 P- J, t5 O* D- t
        Fire(128, 16, 64, 64),
    ) t' \, l" T  V    Fire(128, 32, 128, 128),
    7 |7 N7 ~+ c; _- f8 x    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    , C: `- |" s9 f. }4 T- e% w) \    Fire(256, 32, 128, 128),
    7 v# L! p7 X1 N2 ^  U$ K1 T    Fire(256, 48, 192, 192),! w  }4 Q4 O; x+ j" s: F" b" x
        Fire(384, 48, 192, 192),
    ) c2 Y( O( R$ Q. T; R: B: i" p    Fire(384, 64, 256, 256),
    + Y' c1 d, d) v( v, m    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    ' L) ], l7 w0 k* J1 k% `    Fire(512, 64, 256, 256),0 V  y, u8 X; }9 s
    )) d) B5 L( f1 L, C4 ]
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)+ _+ }7 \- m: f
    self.classifier = nn.Sequential(
      G. ^/ s6 O8 p- d' S8 \2 U6 C  }* P    nn.Dropout(p=0.5),% h6 s; V7 f9 u2 }3 F2 o1 p
        final_conv,
      |: h0 C+ L0 L5 t  }6 L; c    nn.ReLU(inplace=True),3 \. \1 |8 @) z  ]! l) y4 E
        nn.AdaptiveAvgPool2d((1, 1))
    ; f+ }7 u2 a/ o7 }6 n# u" y& @)" a6 ]! v! ~: D$ W; M) b
    0 o8 q8 t, Y6 D

    - y! P. t' L3 Y# ~6 }1! ]. N0 j4 B) h9 U
    20 b4 @8 t4 x$ `8 M
    3  e& _' r* v3 ^6 q" g0 i8 y; m
    4( e4 r3 \- F, _' Y6 ~
    5# M8 ^9 G6 c2 v' Z# |+ r
    6: W2 w# x# r% j: a& C
    7- r9 @0 Z8 q- G! ~: k0 g# N8 h
    89 z1 N& P. ?+ B. a& G' [
    9
      }8 k4 b& H, g8 v1 C10
    ) R  a. K6 u8 w$ v11
    - p7 |: l6 U  _12
    ) G! e9 ]! R( j136 {2 {- `3 V9 j. b- u
    14
    ! _* m1 J# o0 D15+ Q% |- e4 ?3 n& g* e& v
    16& Z! t# X8 {$ z5 z) F# F  P
    17
    ' ]# G; ^7 f$ \% p" ?& I18
    8 A0 ?! ]  w& s: o4 |6 E" e" f19
    3 A* \4 E; [. }+ X20
    2 Z4 S* Y0 o/ M( V( O8 o21
    / a7 y4 ^  T6 |2 W" V22% Z! W3 L$ s6 i9 E9 }5 ^
    23( ]7 G( S3 C. [
    SqueezeNet1_1的网络结构如下:
    # Y! J+ v9 F# i0 G" j. L
    4 h; R7 m6 K; l. V' G& R1 z0 Sself.features = nn.Sequential($ [# D4 A" H, Y8 Q$ z! ?0 B1 k9 U" ]
        nn.Conv2d(3, 64, kernel_size=3, stride=2),
    # g( m: N7 K7 d    nn.ReLU(inplace=True),
    - o7 g" c4 Y" b: U- d$ _    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    . u2 U+ U2 l/ Q8 y    Fire(64, 16, 64, 64),
    $ g: G0 l% f5 M( A& v    Fire(128, 16, 64, 64),. P) r: x5 Q5 f- K' z: o6 @
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),8 [* y6 R0 {* X2 h5 ]
        Fire(128, 32, 128, 128),
    . M& [0 `6 c/ b2 |    Fire(256, 32, 128, 128),
    ; S' K+ d$ e9 Y% _$ y) k" O- l; }    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),3 U$ D5 @, p) A( W1 n
        Fire(256, 48, 192, 192),
    - C/ M' I: e  v$ Q/ |    Fire(384, 48, 192, 192),/ f4 C6 a, I; `" H: t4 y# y% F
        Fire(384, 64, 256, 256),
    - \; M$ {4 C; ?  q    Fire(512, 64, 256, 256),
    , z. \# Z' U9 \- f& w2 y)/ |4 @# D# {4 h: n
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)* K0 W  Q2 A" U
    self.classifier = nn.Sequential(2 m' ~( b4 o6 h& l4 N+ u+ _
        nn.Dropout(p=0.5)," h6 \" A- [6 ~. g
        final_conv,
    2 V! b  V: d" J' Q- b    nn.ReLU(inplace=True),
    , [5 k! e4 k3 {' O, ~# x    nn.AdaptiveAvgPool2d((1, 1))/ q4 y0 F( ]8 a" X& K+ Q
    )
    . P' Y' _: w) ]5 H0 ]9 o; x5 t+ C  t, x( f8 t
    1+ s' O6 j9 D( e/ ?5 f( A# Z* [% ]% W
    2/ o& b2 W8 _  w9 I/ X0 \) R1 a3 L
    3
    9 N6 E! F: J+ D6 j0 W% W4
    % o: s3 M) Y3 S5
    ' [* @6 J) B. p4 Q* l! Y, p6( }: k) D9 U! O0 o6 L! k
    71 R$ @/ {# _. |7 _$ s/ {% S% a
    8
    / o! h) O/ t8 i" b7 N' J9
    0 X2 n3 c% M. d106 I8 P8 m) }% }( C7 ]
    115 g' K3 `% ^% Q. W' |
    12
    2 U* F/ e7 a0 i$ D13( X" J$ E+ ?: J2 p
    14
    ( K- N, J1 P8 v9 t  N15/ ~/ _/ @" E. k0 J
    16
    & k+ p) j1 }7 s9 ~. B, n17
    , M7 a' y( @! K) q( @/ O+ r18
    ( f# D4 h' z- q4 N0 V) H) Z7 O194 }* l  T  G& k5 k
    20
    : @" d4 o% Y& \, l& ?' k$ n7 O1 [- n6 A21
    % F: A; j% L, Y" Q. r4 z22
    . w! |- M# Y: a5 N" wSqueezeNet各层详细参数量及其输入输出如下表所示。# @# Z) |% B% w( G7 z& a
    , F. q- u" l( Q4 _  g) L: [! l9 V

    $ l. F4 |% q) N; w4.2.6 其他实现细节( z' i+ y& E! \% s" ^5 N
    1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
    ; E% ]9 n, {% o4 ]+ S2 Ysqueeze和expand层中使用ReLU
    ; H! t8 v, A8 z# l) o在fire9之后的layer中使用ratio为50%的Dropout0 Y1 j8 C7 V8 K; G
    参考NiN算法想法,SqueezeNet中不含全连接层
    3 [( ]& O8 j7 D2 ]( p. t$ d训练时,前期学习率设置为0.04,然后线性减少
    ) o( h6 {" J# c2 }5 f& n4.2.7 总结
    1 `9 G1 A+ `8 l2 k6 A# w本文最主要就是三点:* X, J: K9 {9 S* ~& V$ J
    " @! H, s% A$ c& ^
    用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
    # D; z1 w% F) {" f减少输入到3×3卷积的特征图的通道数,减少参数量
    ) t$ L; B/ X8 F不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率6 t, a& Y6 p! F7 w& s% e
    ————————————————' F" O, I; ^+ Z- ?$ o
    版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 b3 A: U$ ]5 u8 A
    原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
    0 b8 S8 b( h' h' g& l# f/ C3 Z
    $ \2 v8 N3 o8 L1 J: u: u# \* k- p, F9 t$ t- N" B' H
    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, 2025-8-10 14:14 , Processed in 0.280342 second(s), 50 queries .

    回顶部