QQ登录

只需要一步,快速开始

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

    ) u/ G5 Z" P( I* f轻量级神经网络算法-SqueezeNet' {- h' \! D' u# _  b
    4. 轻量级神经网络算法目录
    6 Q( o) o6 o9 E5 K' n% a$ Z轻量级神经网络算法
    5 N6 f% h3 Y% ^- \1 t9 R4.1 各轻量级神经网络算法总结对比
      R  b& n* `. ]+ g4.2 SqueezeNet
    ( l/ @/ l6 k! g1 q5 Z4.3 DenseNet
    4 I7 t! A" g, {9 F  i% }4 _$ l  I# l4.4 Xception4 R, i! b& Y& t9 x+ j4 R3 |# [* G
    4.5 MobileNet v1
      ]6 C- d  L1 C; V' a1 P, O$ S4.6 IGCV9 ?/ Q9 c1 g: U) g
    4.7 NASNet
      }4 e. \$ [1 {9 @1 S! J4.8 CondenseNet  ~2 Q8 v6 j0 G6 o$ G6 u! e4 M
    4.9 PNASNet5 w* Y" g+ \& ]  `6 g4 R/ e
    4.10 SENet
    5 u" C' D4 J2 }( P( ]4.11 ShuffleNet v1% a! T# a/ X3 H+ r2 p$ `
    4.12 MobileNet v2: ^9 N5 s) X7 Z" C
    4.13 AmoebaNet
    , M: o* E% M# ?' X. F4.14 IGCV27 L; p% f# m# ]4 i
    4.15 IGCV3% u( \2 N0 X! n4 p5 \4 z# [( d$ C8 d
    4.16 ShuffleNet v2
    ! [3 Q) q% @& A# X4.17 MnasNet
    ; P6 A9 g# V1 O/ U8 d# E, ~, s4.18 MobileNet v3
    9 Y$ I0 `* w6 q2 o, b深度学习知识点总结" Q" Z! i5 J% A0 J( h! v. \

    & ?: s2 \! [% w- e专栏链接:/ R$ Q0 X  c0 L
    https://blog.csdn.net/qq_39707285/article/details/124005405  m# d3 u9 @4 [; ?( ?) [( d
    本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
    0 J% B  `* c4 q, J! Z0 Z( n. G
    + F& x( J. S5 o8 F1 S本章目录
    $ F" U2 G% x" A2 z2 r0 Q4. 轻量级神经网络算法目录3 ^7 S7 x+ L/ h& P) x9 c: x* r
    4.2 SqueezeNet" r' \; {/ s$ y* ^# J6 V( |7 ]
    4.2.1 问题分析
    & F& T' w9 F6 g% L; i2 K' U! o4.2.2 SqueezeNet的三大策略
    3 e: T# ~$ V. m8 \9 p4.2.3 Fire模块3 W( w. v/ E+ f7 y; y  R7 Z# F( Y
    4.2.4 SqueezeNet整理结构
    . r* e  B+ {- I6 S, w% f7 y" C/ J4.2.5 代码实现SqueezeNet. D3 [1 [  a4 j! ^, @, O$ m" c- V
    4.2.6 其他实现细节" V/ u* q  c  T+ l& ~1 B) H3 B
    4.2.7 总结
    ; _- k. O) R4 @( ~% k3 P4.2 SqueezeNet
    ! Q7 T! }5 N; i5 ^4.2.1 问题分析1 `: O& T- U. F7 b& m6 X
    最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:  B  O% v/ w5 n! V

    1 Z/ [- q: J/ I在分布式训练期间,较小的CNN需要较少的跨服务器通信/ W1 W/ I: r" u4 H
    在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
    " f0 q0 P5 ]7 h  l% g7 {" K较小的CNN更适合部署在FPGA和其他内存有限的硬件上
    & u. p' U' h4 x为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
    4 _* C+ e7 w  K& }2 ?, [6 S: @: L; s6 Q' q) x1 \4 \
    4.2.2 SqueezeNet的三大策略
    - r8 d) P% e* S: `4 L策略1:用1x1卷积代替3x3卷积- {8 @  U, n1 P6 Z5 T
    1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
    ' k3 ^" n* B+ o% L7 ~! [5 V
    6 W  [( J- ?/ e3 r1 t策略2:减少输入到3*3卷积核的通道数量* g8 _% s8 f  Y; C% X8 D4 U, A
    对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。  h0 B" P% e) ~7 q

    8 @/ l' A9 O7 \% `$ y策略3:在网络后期再进行下采样,使卷积层具有较大的激活图0 a, x+ K, v! o: T
    这里的激活图(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中。
    . v- C1 C1 l- u) V- ?  O3 f) Q3 p% Y+ ]/ ~% K/ x, _) p
    策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
    & X  U2 \# G6 g( k/ S1 G8 g; ~  H/ |
    4.2.3 Fire模块
    4 q! g, \: Y% f6 @为实现这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的想法。/ k$ }6 g- R0 v* z
    4 w% z0 B9 `7 e1 M8 W8 I
    + I3 o# W& C1 ~7 p1 K) c( u
    4.2.4 SqueezeNet整理结构
    3 f% t: t- K1 \+ D+ v* q# H; m( G/ ASqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。! Q" z7 X: f5 I( Y

    % e$ C4 d5 \" K7 T3 [0 F" u  q+ J( y, R# j4 h
    4.2.5 代码实现SqueezeNet" i' I% @0 y7 K: R2 r7 e
    Fire模块的代码如下:7 f3 C. y. S4 k7 W9 ]* |. Z6 [9 v$ u

    $ n& W8 e* I  v  Nclass Fire(nn.Module):' ^4 n: R3 G/ c2 t+ I6 j& j5 B
    ( r' y, q( j% X6 I9 ]. _- }! J3 U
        def __init__(
    , Z3 E. _% y: A( l: c2 U        self,
    3 j9 J# J4 p& ?! C# m1 X        inplanes: int,
    . }  h6 r9 T- q        squeeze_planes: int,
    ; G( p/ h5 t3 [        expand1x1_planes: int,
    6 v" N3 \! W2 K5 v+ u        expand3x3_planes: int4 Y! q3 P0 ?6 M" O! K
        ) -> None:
    + O. i$ M/ k' g9 y7 e        super(Fire, self).__init__(): c- S( i- Y7 r& [6 [% A" Y
            self.inplanes = inplanes
    . }2 j7 E" [! s7 Q1 W6 x) p        self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
    # X& a. l& C, o& r6 T* }" {2 n4 ^        self.squeeze_activation = nn.ReLU(inplace=True)0 u: C8 r- L* c  q9 u
            self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,- {/ v0 d0 _9 O& w9 V
                                       kernel_size=1)
    + \# q/ P/ C+ v( L( V1 x        self.expand1x1_activation = nn.ReLU(inplace=True)5 b( d: A' g0 x* z+ Z2 y8 Z
            self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,5 m3 e3 K- ]# z. K
                                       kernel_size=3, padding=1)1 }( b$ l- `2 p' K4 t1 l
            self.expand3x3_activation = nn.ReLU(inplace=True)
    ' H4 j9 J5 {8 A! M3 [0 [( }  r0 W3 X: v/ `) d9 P
        def forward(self, x: torch.Tensor) -> torch.Tensor:
    6 G6 ~0 y. c1 N( V+ j, q- k        x = self.squeeze_activation(self.squeeze(x))
    ( r* r+ T, v- G        return torch.cat([
    5 A1 N- E) S; |3 P) R( v% Q            self.expand1x1_activation(self.expand1x1(x)),
    $ _( }  s; Q- ^4 w            self.expand3x3_activation(self.expand3x3(x))+ {# P: n6 H* V( h; `  R
            ], 1)2 s* K. i2 X4 L7 m2 [
    4 b% a" p& B. E8 H2 |
    1
    % x7 O6 D/ j" Q$ t+ ?2
    . O; k- o6 ~) x& V  K3
    % c" E  v; C0 _, j/ I% X7 H4; b4 v; T4 F3 s# ^
    5& z, \: T4 A4 p4 b  e8 |9 Y, G
    6
    : K$ }3 r; D* d6 R/ K0 z3 `7
    . ^6 n5 k  l# L3 I6 r; ?4 z8& ^9 e$ B& b: E( [8 B
    9; W# `7 c  Q" s
    10; Q$ x( J/ M7 o/ {$ ]
    11  Q; ]) d% t0 _8 J
    12* C2 m: F' K5 e( I$ o
    13
      d  Z2 s2 K& F5 z; i6 q' a14) s1 R' i( ]% w; a9 B  m% }- m
    15
    ; u' P- o( q8 q9 y# X16
    4 R- N' U; c" W$ _/ b( o  E$ u: c170 Z9 O) a, Z) u2 F& l  K( Z
    18
    : b/ o, m5 ]" @; D) ]# E4 w/ ?2 y19% `* |4 a5 G* E
    200 p6 r. o; U! ^: u; B9 q
    21
    ! J" p* f; ~! ^' j22
    ( ], f  {4 _% m1 V: v23
    ! s2 e! k! {8 @24
    ) j. J1 z, p" X. b) [25! J- |( _& n# Y1 G: F) K$ o
    26# H8 i' r# P. u. C3 C& y' u' T, I
    SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
      b7 D# ]( `/ e3 p$ ?
    : z5 H" Q- }' WSqueezeNet1_0的网络结构如下:
    8 {; {- v' _1 a2 n( n- r5 r2 X2 P- E; Z$ ^% V# x% i: _
    self.features = nn.Sequential(
      f$ b9 a, e6 B- w( M8 }- v# S6 R# L    nn.Conv2d(3, 96, kernel_size=7, stride=2),
    * _/ e0 j1 Y7 y9 d% I! N    nn.ReLU(inplace=True),
    * ^+ ^) R; v* I/ I& B, J/ d    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    2 A9 ]$ R4 J% E    Fire(96, 16, 64, 64),
    2 u( P: c9 |5 O& ~    Fire(128, 16, 64, 64),) v0 x9 ?9 _- v9 V) a" v: x
        Fire(128, 32, 128, 128),3 }% \$ V) }4 @( d; y
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    7 I7 x4 u) x; M8 y9 n6 m. `    Fire(256, 32, 128, 128),5 X) e1 t( e% ]+ ]: W
        Fire(256, 48, 192, 192),% P' u+ m0 o, M; v) Q/ i2 A' \
        Fire(384, 48, 192, 192),
    % t0 V% ?  B$ H0 n" ^) d9 i    Fire(384, 64, 256, 256),
    8 e9 Z' B! h5 Y3 f    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    , n4 u+ D7 r" F) Z1 t    Fire(512, 64, 256, 256),2 W6 t) ~$ j0 o: J: X; E# X
    )  g7 s6 {! }1 v- ^! Q7 l4 f6 N
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    , ~" s' f$ o4 Iself.classifier = nn.Sequential(
    5 |: }# a# U% i" g0 @& u, c7 E    nn.Dropout(p=0.5),
    - H  D2 v6 U' G# J8 d8 ]1 O    final_conv,
    4 w( D' I. v" c    nn.ReLU(inplace=True),
    + ^! r1 l# z( c: D& x    nn.AdaptiveAvgPool2d((1, 1)): f: ]9 T  D2 i$ ?$ @  e5 c" `
    )- Z: G2 M  m+ k0 C! k) b% l
    ( U. u0 a0 a) Y" K' V6 q
    ( ]) p6 M# W1 }3 w- g1 g
    14 {- t  M+ Y- }7 D! |' S
    2
    0 C. Q1 h9 y+ @" |% a1 P3
    7 c9 k4 O. D9 Y4
    % f+ O) z6 ^5 U. b9 O  P: z/ L3 g9 T5
    % ]# P4 l+ ]( p7 ^9 I* d& n* R6
    7 h. o) `& y9 ]7
    7 D9 C2 J2 I# @8) A$ ]; e; E9 ?
    9
    7 {& P7 v8 @' c* [; F7 ^* ?2 I10# D8 l1 \( Q* H0 O4 ?  s
    11
    2 a0 O8 F0 }4 b6 E; H6 a# }  r+ s12
    * O' v3 ^* G8 o, A) Z13
    8 Z6 z) X- i9 K* }14; W% N: l0 F) i
    15% l9 H: \4 p: n9 }1 @4 q
    16% ?  S, b9 T1 W! _8 |( f
    17$ j1 X' Y; r- Q9 @& z
    18# V8 |7 q: Q" q+ L) B
    19
    - _! \* R" T/ K2 F% ^6 k20% E/ T) ?3 V9 c) K( \; \
    21: [+ W4 b3 \; z2 x# t1 b
    227 O: g  D% J, l4 ?: r  q7 @
    23& H  Z& t( R! v, c; ^7 F6 Z/ ]
    SqueezeNet1_1的网络结构如下:: f' }. y4 r6 O
    9 E6 o( M3 D3 I$ T1 ~* M! X7 p! H; D
    self.features = nn.Sequential(
    . O( X9 x/ b- J6 y    nn.Conv2d(3, 64, kernel_size=3, stride=2),, u7 |% @4 E+ j9 R
        nn.ReLU(inplace=True),
    5 @, d$ J. Y, v6 v- ~1 a$ J. m8 o    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),  F! x* o; y# e; ~9 s7 z3 M
        Fire(64, 16, 64, 64),
    ' o% E$ E9 a" \4 f2 E    Fire(128, 16, 64, 64),, g. i- M6 U5 k5 l1 Z* g
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),  |7 Z" m/ ?9 F# R
        Fire(128, 32, 128, 128),. q  x9 \2 C* S- e) Q
        Fire(256, 32, 128, 128),
    ! U6 f' D1 T# x" C5 |) ~1 n- J    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    8 p- X0 [$ h6 N- A9 R    Fire(256, 48, 192, 192),* i& L- O0 Y) ^! C6 a; C) Q
        Fire(384, 48, 192, 192),
    / X& ?" I$ R8 t* @. B8 N/ T    Fire(384, 64, 256, 256),- Q/ Y) U9 p' O) ~) Q$ _6 h
        Fire(512, 64, 256, 256),
    8 I1 D- {) Y5 G)
    0 T) {% P8 C! _! ?5 vfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)6 q9 I0 O5 P1 o; I, n1 Q1 Q
    self.classifier = nn.Sequential(- \" k# j$ j: b/ w  Y5 |0 y
        nn.Dropout(p=0.5),8 x' P& d( ~2 S# A$ o! @1 y
        final_conv,
    - @, Q+ P. v$ [0 E2 z$ D    nn.ReLU(inplace=True),& p, Z' y/ A( y- y% l: A# B- P7 G, S/ N
        nn.AdaptiveAvgPool2d((1, 1))
    6 ^7 [. M+ c8 p( _/ {)
    3 m. ^2 P- B% r4 x8 P
    : E3 p- k& Y* C9 {" c1( w  |# g9 v' n3 K7 H8 T
    2
    4 }' j. P' U$ t3
    & a* N8 t3 ]) r$ \2 W4
    % @. c! S  w# C5/ p# @7 D* F0 c3 {
    6
    & k0 X6 {. x. P6 Z72 S  U) X+ A5 W$ h) N6 T
    8
    " e+ F5 a: g+ F+ t1 o: }- S9
    3 w0 I6 p4 B6 W9 U( W100 W7 f: R, l# a( S; N; d4 _
    114 y% R% }7 d4 C! @! V& }) [
    12
    5 r$ F1 z7 Y: }9 U, c/ A4 i: ?13. c  D6 q/ \) W
    14
    , O, Z' @- `) Z8 p4 S15
    . M# X2 C5 s( ?  f  G16
    4 V7 i2 J5 k3 T0 Z( v; `. s4 q17
    ( P; m+ M. S5 T3 \' p, r1 b) W0 N/ \182 S  v1 K+ @, ]- w3 W
    19
    ; z# a  |, F( Z  R8 W) y20! F* P; k& b6 ^: |: A" p& x& V1 [
    21" z) l* v( G7 D8 s8 B
    22
    / U+ s- i9 r& K1 k% QSqueezeNet各层详细参数量及其输入输出如下表所示。( x) P3 _$ u* |- A* k
    ( e( F! z6 W* i9 g: p- O
    0 a3 ^; X5 H( F, K$ Y* a
    4.2.6 其他实现细节( r5 y. f& Q' c% i# H
    1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
    : }7 b5 t& o1 d9 v  G9 x( b) q3 msqueeze和expand层中使用ReLU
    . R9 G9 S" u8 q& f0 a+ m1 o在fire9之后的layer中使用ratio为50%的Dropout8 P" V( q( S9 E
    参考NiN算法想法,SqueezeNet中不含全连接层$ B6 F* F- n' g, O( |8 C
    训练时,前期学习率设置为0.04,然后线性减少
    0 @. F" e2 D) \. h$ f: N4.2.7 总结" f1 A" R5 X' g% y. ?/ l; {
    本文最主要就是三点:% @5 O5 }- _& G2 o( P) N

    7 F3 o3 X; z. M6 }, Q用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
    9 P5 _3 A6 ?. |0 }9 M5 }减少输入到3×3卷积的特征图的通道数,减少参数量
    # t' p+ O% E: Y; K6 D, B3 D; r8 u) E/ V不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率
    % U  {7 d* _9 M) d8 y- a0 ?6 A————————————————$ }! k3 E- H5 K3 D, E
    版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。) R9 \) Q8 C* X: K
    原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
    2 z6 w+ ?5 F  A6 p2 O2 H! ^1 K+ b3 c% G* _4 w

    8 ]9 ^. y0 b: [0 Q
    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-7-9 18:43 , Processed in 0.576332 second(s), 51 queries .

    回顶部