QQ登录

只需要一步,快速开始

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

    - |# a# v9 @& M% G' _* c轻量级神经网络算法-SqueezeNet
    ( X4 K: f/ `7 _# U) Q: N: g4. 轻量级神经网络算法目录& {! A7 S: G& Z$ Y- Y- H
    轻量级神经网络算法
    3 q. w" f/ y1 P# O% Y# Z2 Z4.1 各轻量级神经网络算法总结对比
    7 J2 a+ }! }6 c5 r; A' J3 A% E  N4.2 SqueezeNet
    ; J$ I, ]6 F4 e0 V* B1 f4.3 DenseNet
    3 b' p4 s" f9 G0 C/ g$ ]+ A4.4 Xception
    ' _" H( A6 n( ?$ D7 f6 Y4.5 MobileNet v1
    : m. W5 v. U! i& ?3 Z5 ?( m4.6 IGCV3 r; p/ O- J0 a) n' O! B
    4.7 NASNet
    5 V* p( d+ j4 P6 V4.8 CondenseNet
    ! _/ {& g6 [& s# B; Y4.9 PNASNet. a: g' O9 B7 x. o: Z! A/ L, C
    4.10 SENet
    # B- y$ d) u: _6 ~4.11 ShuffleNet v1
    & @+ \" Q6 C5 g5 ^2 d; G4.12 MobileNet v2
    ' K+ ~! h  V6 p4 i# |# u$ E" b4.13 AmoebaNet
    " {9 |& w+ k4 @& n5 ]' q% h# ^, W% o4.14 IGCV2
    ( S  [, X9 c/ U6 O4.15 IGCV36 R! y5 J: L  J8 |
    4.16 ShuffleNet v2
    ( Z7 v9 W  @+ p, {3 A4.17 MnasNet2 F; F5 `4 [8 n. G7 N  H
    4.18 MobileNet v3
    ( W+ e. V( O! t7 B' g' h. s) C( t深度学习知识点总结1 @% m8 m, s$ g5 A" u% g

    9 \, D; u! G4 Q  I" d  F6 l8 X8 Q专栏链接:
    1 n) I! |6 _4 w+ x* i* s* V9 ?/ `https://blog.csdn.net/qq_39707285/article/details/124005405* j. ]: Y& B2 B) y1 z
    本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
    2 r' i( W# C0 G) B: j4 i" Z0 D1 C0 g4 p2 P! X
    本章目录% z# \: V& v! }
    4. 轻量级神经网络算法目录
    1 K9 p) r! y. w/ V3 j- C: q4.2 SqueezeNet
    % u- D( ]7 J4 M% }( U; i, `$ h$ f0 y4.2.1 问题分析
    ; U' d$ m% u4 T, n4.2.2 SqueezeNet的三大策略' t  p: m$ R+ [2 G+ G, J
    4.2.3 Fire模块
    0 j. }8 N" y9 ]! N, a! H2 D- x3 V* |4.2.4 SqueezeNet整理结构& l+ o" K8 J1 _: D! o
    4.2.5 代码实现SqueezeNet  k0 f. `$ J8 R, Z; J
    4.2.6 其他实现细节
    9 p& i5 G& L' U6 _) G+ N" }! D% _4.2.7 总结
    9 W% O* @) |: v: V, W5 m' Y4.2 SqueezeNet
      U6 t( A9 C& B+ X3 g9 X4.2.1 问题分析
    0 s6 {2 H1 P( z! z1 V) N最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:7 Y$ r' ~) z6 p5 ]5 ^& L

    6 L* L" H+ V8 m2 G在分布式训练期间,较小的CNN需要较少的跨服务器通信, ^0 h. Y/ O' c
    在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
    3 u) r" N9 o8 v6 k" r较小的CNN更适合部署在FPGA和其他内存有限的硬件上' g$ |- Z2 k. N2 N6 q% o# `
    为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
    . E+ m: o; c% [8 j
    . N! y/ ^5 j+ |7 R$ h- _+ {8 }4.2.2 SqueezeNet的三大策略2 f8 ~# y8 i* p+ y$ F3 `$ \
    策略1:用1x1卷积代替3x3卷积
    . H+ g2 `: s& ~- s4 U$ z0 B1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。$ J+ C, F) U3 A, z" L* s
    ) ~- h4 Q: d( `+ r  K
    策略2:减少输入到3*3卷积核的通道数量( s" k8 r7 W. F, j1 n1 `3 E2 F$ i
    对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。( U% _/ t  K# I- Y
    ' z; z! L1 W8 e7 K0 q  F6 b
    策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
    3 x- i# ^3 U9 y. f. L+ P) W这里的激活图(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中。- K+ R9 p3 w6 p: k. ^4 r  q' Y9 J

    ( X3 I6 q4 y$ ]8 Q3 N5 T策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
    ( D4 U$ Y: o4 A8 ]4 Z$ D1 K' v
      [# H: m- P4 V  l4.2.3 Fire模块
    4 v7 G6 C0 o5 [2 }/ u: Z为实现这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的想法。
      J: ^' S: c( \* x; ~. X& Z% Y  c  ]  D
    ) p. h( b; N: q, m/ f% X; W
    4.2.4 SqueezeNet整理结构: d- |  r- f0 @0 V
    SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。0 m4 Z$ h! V% O$ w" F
    8 w  N! Z! ^& n! ^' ^% X
    . y0 j2 p4 L4 a& l# w# K# x! `
    4.2.5 代码实现SqueezeNet
    # g& M1 W- \3 ~! ^( [+ w, O! cFire模块的代码如下:
    8 h: l: x5 y/ d5 l' [
    3 s/ P$ s4 i$ b% O3 a# L5 zclass Fire(nn.Module):: g5 s/ y! {) S$ t, F

    8 k0 \9 j9 s4 Q% w    def __init__(
    & Y, L, l8 z; @        self,
    2 R9 y- y, e" ~" G( t        inplanes: int,: t2 q4 G3 Z  [# U
            squeeze_planes: int,
    8 E5 t2 T* c! B. J( A4 h        expand1x1_planes: int,) m: g( u1 a* |* o: z7 v4 d# M, Y
            expand3x3_planes: int& e: ^. |1 T: w8 l2 J" D1 s8 a: E- w1 W
        ) -> None:% Q8 C% M% d/ L# o! j3 @
            super(Fire, self).__init__()$ H& Y) X4 E# J; Q0 B# t1 i# C
            self.inplanes = inplanes# R' Y7 O! v( f1 l4 Q) N
            self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
    ! I8 j, g5 R8 P( L, D* d; X        self.squeeze_activation = nn.ReLU(inplace=True)
    " H3 ]" ~3 ~7 Y' M' s3 U! p2 k, R        self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,$ c( v+ k7 c& z1 J
                                       kernel_size=1)
    ( p, }+ c& A7 `' V8 [' E. z0 [        self.expand1x1_activation = nn.ReLU(inplace=True)
    . j, O! B0 J* v. \! Q' r3 b        self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,# S% D/ O* ?- O: w& k; |
                                       kernel_size=3, padding=1)5 j9 f$ q5 H" U* m
            self.expand3x3_activation = nn.ReLU(inplace=True)% z1 Z- B3 U. _: M( m- J
    % \6 S  W1 t0 u5 S' _* u7 N
        def forward(self, x: torch.Tensor) -> torch.Tensor:
    , z# Y1 c- Q* P/ m& X* Z) t        x = self.squeeze_activation(self.squeeze(x))7 g: M2 K+ y0 R& f4 V! x
            return torch.cat([
    9 R/ K! `# t7 r# M( k            self.expand1x1_activation(self.expand1x1(x)),3 @9 z% M; k" V, C. C8 {
                self.expand3x3_activation(self.expand3x3(x))
    6 o' ~3 I1 Q. V$ n3 }+ I  U/ H1 ~        ], 1)0 t- Y7 u% F' B. r& A

    0 I2 h" [: |! L% R$ b* m1
    / Q3 _& D. ?$ \, H- C2: ~7 ^) J# J- |1 ^
    32 R- W/ k3 x5 i: G! T& m" X
    4% a% ?2 B* [9 M5 U# Q& B
    5
    3 n, L3 [2 J8 t$ U+ g) }7 V! ^6* U! O2 G% Y- N6 r7 W
    7
    8 S& a0 }: i8 _, [3 y( y8. x. N- B  Y" s' z! a4 u$ S. b
    9
    4 w0 g% a3 S) J8 B- N* R1 \7 r10$ K6 b  u: N5 S$ K5 L
    11
    6 d+ `8 O* X! H# Y12
    % |2 d. l2 S) e; T13, a) [3 F" e2 ^  n+ W1 s
    14
    4 y0 Y! N- {4 b5 i$ q15
    ) v# b2 O" `  ^3 X3 Q, c3 ~  d160 P9 U- W% L$ `: S
    17$ G- u& a8 H3 F# ~, l( z. L
    18
    . \7 O% q0 z+ R% \: m: D$ C8 g" C19, w  I* I1 \/ Q6 O$ G& M" w6 ~
    20
    6 g! w$ \- l$ c/ C21% X- R9 d) x0 a
    22. w% v9 A/ e  A( L
    23
    . D! @8 `& j7 ^/ `. }$ Z241 i$ w9 t5 i4 g7 A
    25
    9 K$ W; w7 c8 a; i, ?26" P2 y$ M# D+ ]" m6 ^0 r! o2 I
    SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。# ]: c) j/ C( W
    1 J5 R0 g* A  Z( O' }9 O" o
    SqueezeNet1_0的网络结构如下:
    ' F4 H' V0 I, h# g) v( ?; a
    * _0 S4 u+ P( R/ d" rself.features = nn.Sequential(. Y% K6 V3 s& L% ?1 `: h
        nn.Conv2d(3, 96, kernel_size=7, stride=2),
    9 y) b: N. n! v. h    nn.ReLU(inplace=True),
    2 S0 u  I/ K5 o( T. W6 L    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    * W3 }- _' |3 H3 \- x1 K) T, i    Fire(96, 16, 64, 64),; P2 l" V6 w. I+ C( C9 }' a2 X4 A# x6 A% }
        Fire(128, 16, 64, 64),
    ' b; w' t+ Z6 F6 t    Fire(128, 32, 128, 128),1 g; W$ o3 }. F: W$ K
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),) d7 A2 ~4 q6 t7 X2 v7 `
        Fire(256, 32, 128, 128),( S9 d+ v# z7 w, m% s
        Fire(256, 48, 192, 192),
    , a8 y$ n( V7 b0 M, C8 Y1 ]    Fire(384, 48, 192, 192),
    : n  R* a1 Y5 y. L    Fire(384, 64, 256, 256),
    ' M' w# w2 W7 c9 n5 P% k. m4 m    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    ) k! w* }% L: r4 r8 r  k  V7 ?# t    Fire(512, 64, 256, 256),0 q9 @$ v6 c, G4 k3 T
    )
    " G7 J0 {0 t2 }, \& bfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    1 ^8 _; d+ N8 \! i) o1 ?self.classifier = nn.Sequential(, ^. p' K0 w2 u9 Y
        nn.Dropout(p=0.5),
    3 ~% A( }$ H( e( O    final_conv,
    , a/ @! _0 Q' L  Q3 r; c! c    nn.ReLU(inplace=True),
    7 R; a8 H# {0 P0 x  X    nn.AdaptiveAvgPool2d((1, 1))
    * L$ x0 R( v8 N)# u2 T" T! B& q
    6 l1 O) W3 |  k. T" D
    $ X% K8 h- a$ q% h
    1
    6 K1 f# [& {/ b! d7 Y6 @- g2
    3 f- t  c& h$ r* ?9 h+ r2 }3 B3
    & a1 x. s/ C, v+ t% T4 a) y4
    5 l: @$ G: }% ], P5" e# g  h( y/ G- {6 T* ?- j4 Q; J
    6
    . j9 ?. O) R( o% B5 }- \7. h. G5 J/ ^% ~- C
    8
    & _; g2 G1 E* M. X' ]2 _9
    2 |! h+ h" L! J0 i- T5 z! J4 Y6 n10' {, n1 w0 G0 t1 U& ^
    11( K" \* o0 a( n0 `
    12
    " T9 C! ^+ V! {13( ]9 }5 E7 @) q+ r  y& z
    14* V8 C2 X9 d+ x9 ]- A
    15, u0 S3 a, o- c) X9 y8 y% F# [; J
    168 A& W, H9 @3 ?7 S
    17
    9 ]1 a0 Z. i5 h6 F- s  m8 |18
    ( E7 V0 P5 t4 c9 L; J0 K19, Z/ S$ t% e. z$ b: A
    20
    9 C& V2 x& j5 ?: M6 J21: m/ m% f6 O% f* A
    22
    . l7 z2 L) l& M) B23/ Z7 m7 d6 k% m' t
    SqueezeNet1_1的网络结构如下:( e( v0 F- l/ U4 W* L
    / U. x" A/ `: L# Q( z. l2 S
    self.features = nn.Sequential(; \- p$ {/ _) K- x( a9 u, [
        nn.Conv2d(3, 64, kernel_size=3, stride=2),
    7 M7 h% S. {( E* W: A    nn.ReLU(inplace=True),
    + \4 d& R5 H% r; W, |/ n# x5 v    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    ; @% P( N+ W1 y. r/ U% @    Fire(64, 16, 64, 64),
    5 u9 s/ t' d5 F7 V! ?3 ?7 J3 w4 j    Fire(128, 16, 64, 64),
    : g! ?. o2 x& u, I' u    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),! P- f$ J0 u! b  J3 Z$ c
        Fire(128, 32, 128, 128),
    # C, m" H7 f& A6 R3 t9 K    Fire(256, 32, 128, 128),
    1 C7 c0 R" E2 p7 z0 o- X    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    " @& ~* T5 Q" }    Fire(256, 48, 192, 192),
    0 D: k7 }% h7 v( L& U    Fire(384, 48, 192, 192),
    ! c7 {; r" S+ k    Fire(384, 64, 256, 256),5 y* h/ P' Z$ T  F
        Fire(512, 64, 256, 256),0 q  J6 ]. e& F& b
    )
    " e9 Q6 ?6 V8 s. J. a/ m$ Ifinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    9 p6 h! H( h5 e: R; Y/ N/ @self.classifier = nn.Sequential(
    ; I4 a7 Z: q- M2 e5 w    nn.Dropout(p=0.5),2 A! f+ ]8 z3 f; I% k
        final_conv,
    : K- ]' a* o1 T8 a    nn.ReLU(inplace=True),
    ( _/ t' m+ A) _! {5 E: N! h0 U    nn.AdaptiveAvgPool2d((1, 1))( R9 |  r# v0 m* `  }
    ); \9 N8 d1 i. O( j$ y* q6 }% O
    . {; v+ _7 p5 L/ ?0 r+ V+ J
    13 W  G% Y( d6 r9 `% U; A
    2* R0 q6 s0 S( l0 L2 u. B
    31 V" g: M/ Q! L+ j$ f" |
    4
    , m, h# e7 m) {5; h( N9 e' A9 x3 |
    6+ C. s' e' F% j" ~# V7 o6 a3 I7 u
    7( @0 r* H4 n/ N* n& [0 `- S% T
    8
    - c% O0 B; y  ]9 ]1 Y; a& D9: n/ ^- }4 J* k2 x. Q2 W
    10
    7 X, t# F" e+ b& U9 E0 f11
    6 P+ }3 n$ }1 P2 ]# h/ r' z12
    2 c* H. x: w4 s! ]9 e13) ?2 U. L$ [+ n+ G: [4 }* ~! c
    14/ g/ C( N- o; q7 u4 k& x7 [' D
    15
    ' z. [0 }  x% F4 L$ J* W6 k2 M16
    ' ]# i- e7 I! S% o9 [+ s17
    9 l! K$ [+ ~' F18
    5 r/ X( a3 V4 r9 [+ F( j: L19
    3 B$ A  V1 E5 Y20) B# x1 |; F6 J3 `  c
    21
    + y% u2 Z0 L1 Y6 l& f22
    * m1 C& S+ L' }( I3 W9 y5 SSqueezeNet各层详细参数量及其输入输出如下表所示。  `5 @$ D  `0 W% n% N6 x1 d

    4 O8 ~! `+ S' h! J; }0 o) T
    - p% s6 _& Y: n/ B/ o4.2.6 其他实现细节
    ) f& q9 o2 ]( [1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding3 ?) _3 o. y% W0 l. H) C
    squeeze和expand层中使用ReLU0 D) N4 X& @3 I# w: n
    在fire9之后的layer中使用ratio为50%的Dropout' D" M0 \$ B8 C  @) M, ]4 d
    参考NiN算法想法,SqueezeNet中不含全连接层
    + M, x; _1 j1 S( ^' d3 \训练时,前期学习率设置为0.04,然后线性减少
    % \, c' Z  C7 w, Q+ R& G4.2.7 总结9 a; [. f- L0 z5 X' G) g1 P
    本文最主要就是三点:
    1 Y& T1 n! [3 L
    2 }6 M9 a& w: M9 ?% ?用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
    0 ]) ~( Z. O1 t6 T# Z3 T' u减少输入到3×3卷积的特征图的通道数,减少参数量
    ! A: M5 H: P, V. ]: P8 _- j6 p不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率. V# ]4 ]6 e# @, o# A0 J
    ————————————————
    * u8 K, r9 w0 d8 z" E1 s& K版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    & F# H+ f; @6 |原文链接:https://blog.csdn.net/qq_39707285/article/details/1264981006 G) \% D6 i5 Q% p- ^
    " s- n- x! _: z" A; r& C' B
    - b; {* \! b4 ?- V4 H. o
    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-12 09:08 , Processed in 0.410925 second(s), 50 queries .

    回顶部