QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2893|回复: 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
    $ \, W8 M0 m, A
    轻量级神经网络算法-SqueezeNet
    ' g2 ^) U; ^, p3 s: N% l. l4. 轻量级神经网络算法目录1 h9 `. b" ]; [% ^
    轻量级神经网络算法
    0 P: Q, v- C. S: t3 B  e4.1 各轻量级神经网络算法总结对比5 K! C" u: O' {6 `2 E+ m: W2 k
    4.2 SqueezeNet  z0 m5 E5 u7 Q9 |4 |0 n
    4.3 DenseNet- `2 z& x5 x, N2 \, y5 y* O
    4.4 Xception0 p' G# m7 {1 p( a- M7 V
    4.5 MobileNet v1
    6 [* b) e, u9 ~7 I9 s4 A' ?4.6 IGCV
    ) B; o1 d( ~  ^+ g* m4.7 NASNet& U- D# k# Q! ]% G
    4.8 CondenseNet0 D7 {" t  V* I0 i6 {8 T9 k
    4.9 PNASNet
    $ Q: W/ L* G! W& A, v" `4.10 SENet7 }7 _; O$ v8 Z
    4.11 ShuffleNet v1
    # a: W& v7 C# j: m" X8 r& w, ~4 T4.12 MobileNet v2
    ; I: S2 _7 ?4 Q- C4.13 AmoebaNet- X  u% F3 J3 I5 A% R
    4.14 IGCV2
    , M. ^0 Q1 w5 F$ k" ~- K5 l  J4.15 IGCV3
    7 w5 L" s8 I4 ]8 N) m; I4.16 ShuffleNet v2
    1 f- F# U8 A* a- U% x1 s4 @4.17 MnasNet
    + O; Q+ O4 `: ^% T4.18 MobileNet v3
    8 g0 I, A, d+ y3 L$ \深度学习知识点总结2 l6 v3 ^4 p8 C" d2 y. Q% Q6 G! W
    7 r) d& e, o/ V5 J3 d5 H5 q
    专栏链接:
    ; E7 r2 Z3 N. P9 E7 M3 e, xhttps://blog.csdn.net/qq_39707285/article/details/124005405
    / D% K. c8 p; C本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
    9 e8 e, u" m& i( Q1 D; Y3 X
    1 L! [3 M# F0 d8 M. h6 }' E本章目录
    7 Y8 l! l$ g" L2 o4. 轻量级神经网络算法目录
    0 l3 }9 m* j, H/ z' s/ X. N( k4.2 SqueezeNet
    * v  D8 i  Q4 u7 R4.2.1 问题分析
    ( x' M! u2 N  l) E4.2.2 SqueezeNet的三大策略; \& Q6 F9 W. S/ [& w8 a: Z
    4.2.3 Fire模块! H- b" j7 E) u0 `8 h7 O2 e) Y
    4.2.4 SqueezeNet整理结构
    . O. s$ j: H/ s5 o- o: f5 c4.2.5 代码实现SqueezeNet
      {. i2 l: {; ?7 Y$ ?4.2.6 其他实现细节4 T! h2 s8 a% t: l) l1 f4 A3 Z
    4.2.7 总结
    6 O# S, c) x% O2 A! z4 {  ?- J1 ~  W4.2 SqueezeNet0 F! ?+ i1 Q+ A- Z+ j$ G- @
    4.2.1 问题分析
    6 j( q* V. [( N最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
    1 W4 }  u* m5 k; |# {, ?& t- L# O) _8 u: z4 r" n; h3 C$ K
    在分布式训练期间,较小的CNN需要较少的跨服务器通信' z& w& I4 W  a& ~; _
    在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
    2 @+ w/ N1 H  U9 e  m, F较小的CNN更适合部署在FPGA和其他内存有限的硬件上
    " N0 [3 m2 S/ O+ d' W+ W为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
    # i/ z$ f& z8 H5 g4 `& Z5 u3 `- E
    9 o% K/ f% n% u: E! c, ?* b4.2.2 SqueezeNet的三大策略  ]$ O& ~, b+ F4 U5 h" V9 k  L2 @* N
    策略1:用1x1卷积代替3x3卷积
    ( x3 i* _6 w# W+ l4 a4 O1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
    . S. [/ z) S7 F6 F8 @, L  f' C: a0 u/ j
    策略2:减少输入到3*3卷积核的通道数量
    ) n- B' X& x5 c4 r; `% k) p( p2 [对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。- s' D3 K' l0 M" w( g) r. }
    & f  \+ \* J7 k( O. y* J* B' C
    策略3:在网络后期再进行下采样,使卷积层具有较大的激活图" w2 G. j! R" R) Z% S
    这里的激活图(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中。3 N/ e8 u0 W# P( n( _# _
    ' `3 X0 q  r' F
    策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。. A7 `+ a( b9 H7 Z3 a6 C
    2 N4 g7 a7 M( C/ M6 ]9 d6 j  o
    4.2.3 Fire模块
    * f8 ~7 ~6 ^3 v* Y, p  M. b: B为实现这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的想法。. T$ G6 a! N  ]% {) c

    8 R, g7 n% X: T# {: u+ r, ?; I  _, [- g
    4.2.4 SqueezeNet整理结构/ B, ~2 p* }3 V- G1 O, }  q
    SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
    / h& R- {3 [: A; M; t1 d. M8 k1 h/ R
    5 v. w/ y' Q) x7 }& t) C! V4 R9 k/ s- X, h1 ~
    4.2.5 代码实现SqueezeNet1 @: y: W# ]' z& E+ e! e+ F
    Fire模块的代码如下:. f9 Y# v* G5 w' _# c9 c8 F" Z

    8 ~1 H5 Z6 w( g( J: Cclass Fire(nn.Module):% }' {+ k/ r, q- p* i
    9 ^; _, F& B8 p: a
        def __init__(4 x2 m: N. D+ U& \0 X! e
            self,* b9 S" @9 z& F
            inplanes: int,
    9 M* g  F) P# X- I. U        squeeze_planes: int,, |0 `  w/ L( v! Z# H* p
            expand1x1_planes: int,
    ! }+ t, B; `# N        expand3x3_planes: int
    : n, N9 p) p7 o' r& i, t  i& u/ J    ) -> None:4 \: E  b( C- F2 y: H
            super(Fire, self).__init__()8 F; j% A# l1 B7 M8 i
            self.inplanes = inplanes9 Z$ y% ~- T. J. U1 T* t
            self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
    # p4 O2 V% J% o' o        self.squeeze_activation = nn.ReLU(inplace=True)3 P1 c0 f9 f/ F9 M6 Q
            self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,3 m& P, ]9 t6 |7 V4 A" Y
                                       kernel_size=1)
    7 Q) X. j% J# j- i        self.expand1x1_activation = nn.ReLU(inplace=True)
    9 f' A/ d" T- w3 X" {3 ~( q        self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,8 r2 Q1 J8 n2 A! J
                                       kernel_size=3, padding=1)
    * s! G" R2 M9 i0 x) q        self.expand3x3_activation = nn.ReLU(inplace=True)
    ! ~( ]; R0 Y7 Q: U7 K# F+ |- ~/ m  ^3 t/ H& J+ K2 s
        def forward(self, x: torch.Tensor) -> torch.Tensor:0 }6 j6 j. M8 v4 U8 U/ N
            x = self.squeeze_activation(self.squeeze(x))
    & c2 |; f4 j3 E+ p        return torch.cat([1 `5 X0 _6 b5 s
                self.expand1x1_activation(self.expand1x1(x)),2 h$ f" S. I/ }7 l( O
                self.expand3x3_activation(self.expand3x3(x))6 f* Q* H8 G/ }  R* S! I6 c# ^! m
            ], 1)
    . h0 c' `& a$ K+ z4 Q; h# H* X4 E2 K$ o1 x/ O
    1
    ; d8 M2 a4 ~1 ^, s) ~9 c7 [2
    5 B/ A' g. ^0 J1 C8 e* ~( d4 A3
    - y! ?7 E$ }, v4
    2 {2 ]  t! ]) ?' i5 D50 y" J. I1 D& |! f; ^: a9 A
    6  `8 _/ b; Z. k* J% G/ E" `
    7/ N2 K- @3 w/ l- b
    8
      G3 b* K" C% p/ `; m/ r9& l! Y' _& [- p8 C; @
    10
    # Z( r; d3 |5 j' A11- g/ b7 i: f& S1 B+ k
    12/ @/ t) D( c) P- [; A9 Q
    133 ^$ e4 N  r! v- c# f
    14
    5 m1 s! m! h. n2 [15" j7 D1 W; {9 P
    166 v. G) F( |" O! d$ O2 G
    17
    ( M4 a/ s# H: l$ j: X  A18
    4 w1 G6 }, S5 W: O) M  V/ j, p19
    : w" C) P! {4 o6 E: R20# m4 Z1 a( J- u, O, @
    21
    . }9 e0 }: g6 K! O22
    ( F- m: x. j" T+ G' A( f237 Z6 r/ l" o/ K0 J" U- Z% h# P
    24
    % y, |* [* y: N* k8 ~" k25
    # X  t" A: M% p$ b+ I' y5 L  R26
    6 {* L" q* Z5 Z$ M: a" j' m& HSqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。5 U/ h! [% L0 T; ~+ K* E* C7 D
    ' K# n1 v% A) O) q5 r3 x3 R- K$ [
    SqueezeNet1_0的网络结构如下:
    8 n$ |- x# j& Y5 g2 D  T0 _0 i# z6 Y1 s+ _, D
    self.features = nn.Sequential(
    ) ~+ U& ~6 E- L. N1 F" a# c3 {, w    nn.Conv2d(3, 96, kernel_size=7, stride=2),! Q  g1 u8 N" Q' e+ y+ C0 p/ e! e$ B* \
        nn.ReLU(inplace=True),/ g/ f, I# r, C+ C- N0 e* @  W' S
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    $ N6 ?2 H# U$ K0 R    Fire(96, 16, 64, 64),
    ( F  ]% U2 }6 L$ _8 {+ y    Fire(128, 16, 64, 64),
    + u3 g9 u3 Y2 q1 r  H( e    Fire(128, 32, 128, 128),/ I5 d$ _* c- o' P
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),6 ]# [6 C# W/ G
        Fire(256, 32, 128, 128),# C- c  x  F( e% m2 o* u' r
        Fire(256, 48, 192, 192),
    / n/ Q1 o* M& Q2 W5 ]# o. d    Fire(384, 48, 192, 192),4 b8 m# \5 ?8 x; B0 V
        Fire(384, 64, 256, 256),
    / t  I7 H4 V1 W. y9 A9 H, \    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),7 [" V7 m8 n7 [. ~: J
        Fire(512, 64, 256, 256),' l+ Z* Z& V) \# P0 Y$ }( n
    )$ U; ~! S2 [1 T* G) r
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    $ x" {; y7 u. r7 yself.classifier = nn.Sequential(4 E* ~9 G9 S% j8 L; T0 A% d. m: h$ ^
        nn.Dropout(p=0.5),
    4 u% W  k2 M1 p7 k! y. F    final_conv,7 `- V. u' ]( s0 Z
        nn.ReLU(inplace=True),! v+ r2 k; Z5 W1 ~% c
        nn.AdaptiveAvgPool2d((1, 1))
    , s7 d) x/ \1 D6 i) J5 D)9 r" N6 R1 S4 V. V8 I9 ^1 o9 ~6 W

    * d5 C8 `+ d& R. @$ N
    9 @; K( C2 O2 _1
      F$ c1 `* _: ?8 I% V. }2' u. o' q) l5 }! Z4 y
    3
    + r. K3 A, p" s0 [4
    . M! B" M4 m5 A% r# R$ m4 G5
    5 J% \4 o' K/ `& x6
    ) Z, @: `! A7 x" B" x- ]. G7
    ! h7 d% w1 \& d% `89 O5 {7 x  m& P  `! D+ [1 h; R
    9
    / v5 M, n& F+ A5 ~1 X# f7 {1 G( ]10
    / Y3 |* W6 z' F! a. S" [5 _3 E114 H5 x+ k+ S+ K( l
    12
    4 T, P: `9 ^2 L  z13
    6 ?0 }. F  ~9 |3 n14
    % i7 O2 B0 z% \5 u" i) e7 j! |  I& c15+ M8 W  P& A' N9 v- K! K
    16; |% r' |# [8 L, A1 b3 Z6 n
    177 m+ N2 S+ D* T2 e# _6 Y* A" Q
    18) `+ H' k9 O7 S' s
    19
    1 M/ @- |" X) d% ]" h; U20& k% C2 H/ D" Z  O0 z+ y
    21
    * W+ @& e3 [% W2 D9 }. x" ?22! \! H: ~% K( a0 B' f7 A
    231 L4 ^" t: K' Z& @1 {1 s: @! S0 \
    SqueezeNet1_1的网络结构如下:
    0 \" I7 F' o! `& ?; k
    " ~7 }6 V1 y9 R- o) [- ?  Z2 g) l: qself.features = nn.Sequential(
    " J5 X5 `: r# m4 K' o# V    nn.Conv2d(3, 64, kernel_size=3, stride=2),
    5 Y* I* G, }" f& c    nn.ReLU(inplace=True),
    ! y# {! x. c( O  G    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    - L5 e/ o  r. n    Fire(64, 16, 64, 64),( u+ O1 L. x9 n( m0 a
        Fire(128, 16, 64, 64),$ x$ l, Q# p4 x1 R) O7 i' u
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    - S2 K6 a8 v3 F" i) u; P7 p6 R    Fire(128, 32, 128, 128),
    1 ~; n* Y8 C/ `* I( }    Fire(256, 32, 128, 128),
    ; ?: o9 N3 H3 x6 O. i  R4 ?, O- K    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    ' j! A# U8 h3 X$ }2 K    Fire(256, 48, 192, 192)," Z- ^, t1 Y; H
        Fire(384, 48, 192, 192),
    0 d# u+ ?: ?. M( Q  i" J! ]    Fire(384, 64, 256, 256),
    7 _; N! d, R% O/ D1 c$ l4 Q6 j    Fire(512, 64, 256, 256),
    . h- U" F( m2 E" O5 V( _* O)+ @9 _7 G/ H' b' R9 Y0 O: F* q
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
      H) |# D$ @) jself.classifier = nn.Sequential(! G& C5 {  }  n& a
        nn.Dropout(p=0.5),  N; I& ]) v( G9 W' J
        final_conv,
    + i1 l& b% ^$ ?8 x' J+ |  d2 F. V5 T    nn.ReLU(inplace=True),
    ' @$ F) J$ q3 [. z( W# b    nn.AdaptiveAvgPool2d((1, 1))
    . R7 ]8 n# V; d# a, [. n)
    5 N7 n0 U2 j$ _- ^
    . X6 }! N- p1 j/ b3 J1$ m4 W. Q# |' F. @/ a
    2
    + x/ q( O$ ?& r: _6 A! {. z) L3
    % \8 c7 N# X* D7 S' G4
    ( o' N  s2 m# V, W52 f( S0 Q( w0 R% ~; d! o
    6
    0 s# I5 @3 N- Q4 q  L7
    . I+ V! N0 D+ M  Z' g8# @; [2 i: `4 c3 z0 |- z
    9' J6 w0 _1 t% m3 M1 N
    10# T+ N2 q2 l: P; h9 P7 c# m
    11  k/ i% g$ y! b7 H& J
    12+ M! A: z4 Z; X- X
    13
    9 |6 g5 ]0 j9 ?4 O6 Z' t4 Q1 d+ u14
    / b8 `/ l9 n8 E3 b/ m15
    , X9 t/ M- u1 @0 @$ U16& d0 n$ G8 b3 A  O; z
    175 m$ }% X4 C8 `; K9 Q/ L! H$ W
    18
    - Z% I* I' k# o, W' c$ n- x19" Z- k: S' t# \- E
    20
    , j1 r( z0 e/ |# u& J, x' m213 q- a4 S9 ~3 A6 R
    22# r. x0 ?$ Z9 S) o$ C: L: z
    SqueezeNet各层详细参数量及其输入输出如下表所示。
    . _  r* t) C  f5 x+ p& d. j. `4 J: ^# i9 o

    , M$ W" ~/ t. p4.2.6 其他实现细节
    ( E' Y/ V! Z$ |& S3 t, Y( [7 D1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
    1 q) y1 N0 s" Y- O( F- W5 {+ Zsqueeze和expand层中使用ReLU
    4 r% ~9 K( z8 L在fire9之后的layer中使用ratio为50%的Dropout
    & C5 `6 k' @. p# L8 \. K9 v参考NiN算法想法,SqueezeNet中不含全连接层
    6 l1 R: T1 {3 y* A( \4 F' C) ~1 w8 p% l训练时,前期学习率设置为0.04,然后线性减少
    * k3 E& R' A: K/ F$ x- q+ U4.2.7 总结
    % t2 v" E  S# X; O本文最主要就是三点:
    ) p; n8 b4 ~9 Y' _  t' e' z; B5 P
    ! f( ~7 b$ E4 J- y' \% R- G用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
    7 {, r% |) r5 R* l减少输入到3×3卷积的特征图的通道数,减少参数量
    . z/ K  [8 H: j' C1 o/ I不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率
    , S+ m6 N# q% m6 @' S  t————————————————
    1 Q, j% B- X* N  f( ~6 F, q: P版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& r& M0 C2 W4 m, ^, m( N- O& Q9 U
    原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
    9 ?5 e3 l, r- i$ V8 {. P
    , X) s2 c8 |5 f! Y/ |: u2 p" A9 H3 X! V
    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-21 01:57 , Processed in 0.419852 second(s), 51 queries .

    回顶部