QQ登录

只需要一步,快速开始

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

    # K1 N% |* E/ I: A轻量级神经网络算法-SqueezeNet
    1 \2 v( m& s$ {4. 轻量级神经网络算法目录9 m" V3 G+ b# g$ p( N
    轻量级神经网络算法
    ; F! A; @- x" `* h5 V" I$ \4.1 各轻量级神经网络算法总结对比# ]8 j) [+ O& O2 v; _2 O0 J7 y
    4.2 SqueezeNet
    / r9 L2 `8 A6 }8 q7 y4.3 DenseNet
    / r6 B  h0 ^, K$ W! O& p4.4 Xception& W6 `( ^4 R1 {
    4.5 MobileNet v1; I, ?2 `) [+ p9 N7 o
    4.6 IGCV  o) J; ~# c" \# m4 g/ f5 i0 J
    4.7 NASNet5 ^2 r  E. ]: W
    4.8 CondenseNet
    7 K7 Y7 D, Z0 `+ l4.9 PNASNet
    & F7 z7 S: a$ o( J* Z; G4.10 SENet1 @9 g" X) T& T
    4.11 ShuffleNet v1
    " K1 Q& o. Y" g# u; \, X4.12 MobileNet v28 N+ {3 y4 w* O5 Z$ n  S7 J
    4.13 AmoebaNet
    + r) Y8 r7 F. u) {. q* d4.14 IGCV22 M$ n( v8 D. J1 f, M
    4.15 IGCV35 f+ |: |  G4 P0 n. P) S
    4.16 ShuffleNet v2. m( J0 v+ D8 E
    4.17 MnasNet
    # l3 b9 M5 \# u$ p5 @; H: ^0 x7 E4.18 MobileNet v3
    2 t7 ?$ B! V& T深度学习知识点总结" e  |8 Z, v2 K4 A
    ( w# H! Z6 J. e8 \) m0 e* d
    专栏链接:
    + p* a. t. b# Z5 J5 m, s" A& Qhttps://blog.csdn.net/qq_39707285/article/details/124005405
    % e* r. F6 P! F- j本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
    8 w5 i! e& c: `+ L' P9 {& q: z* |  U. i7 |& J
    本章目录
    7 \8 |+ Z" A4 q8 E) O; |4. 轻量级神经网络算法目录
    % L+ m+ m" S: `1 N( X2 e1 h$ K4.2 SqueezeNet1 P: U; k+ |0 }, a
    4.2.1 问题分析- L  c4 {( ?5 g" J
    4.2.2 SqueezeNet的三大策略
      ?/ x5 }/ U1 R! I  o4.2.3 Fire模块
    $ V3 y4 P8 i" f6 m3 F, U( C4.2.4 SqueezeNet整理结构
    * O. d+ p! t% H7 i6 z4.2.5 代码实现SqueezeNet
    2 T8 Y+ T6 }% @# R# G3 O4.2.6 其他实现细节
    " E% T# R1 l3 U$ t0 S' U4.2.7 总结
    5 S$ D0 f6 w. z( Q- \4.2 SqueezeNet
    ' e# [/ r  b* p8 g! \4.2.1 问题分析) ~" B2 _, ^3 f1 N2 X
    最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
    / t( y5 h& Y$ J
    / H% q6 k" `* n& W* S; r在分布式训练期间,较小的CNN需要较少的跨服务器通信' w* C% n0 b9 b5 Q
    在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
    . W. E7 u% e2 p; j5 @% Z0 `较小的CNN更适合部署在FPGA和其他内存有限的硬件上
    ( p/ l  S( A2 q3 U为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
    5 M$ w+ E; r# k: V
    + j! Y8 a" b. u3 X* R4.2.2 SqueezeNet的三大策略+ T& _3 n# i" Q+ N. i/ i
    策略1:用1x1卷积代替3x3卷积
    ! R/ Y/ i" o# l9 n" A1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。& p# K2 g8 x8 t7 C3 ^; |' N) t

    7 G. M. l+ Z3 I5 ?" `! h% @+ T' N策略2:减少输入到3*3卷积核的通道数量
    $ b( P0 f% C9 `/ W8 j对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
    ) K. W2 [8 ?# K% s/ C! H' ?$ j/ q; l/ J: ~1 \" ?# V; s/ e# d9 ^( Y
    策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
    6 d. _8 l& Z  ~: z  D$ O  d3 n- L6 _这里的激活图(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中。
    , J2 C( Y7 W4 r! p- }) x
    5 O, F% B, W% Y4 V策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。- R* z) O/ @- B9 j4 ~3 [
    ( p* }# Q! d9 `" \$ d& [4 {
    4.2.3 Fire模块; a5 ?" x; B; x, X; Z" P
    为实现这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的想法。% `, `# s$ H! l% d

    4 G9 T' C$ V. C/ p$ `
    " O( h: A' Z7 [. Z* |4.2.4 SqueezeNet整理结构
    " A7 s; P8 f8 M8 V& cSqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
    8 l# D8 [6 B3 G. ~' m' P4 M1 y# r' R- d6 v' y

    , |0 e: K/ G6 K  r5 W& a5 {4.2.5 代码实现SqueezeNet" n/ v7 ~8 |6 I; r% j4 ~, L
    Fire模块的代码如下:8 ^5 n; ]7 V: x4 t4 l' P0 |8 _0 `

    3 o& s7 F' P8 R2 }/ Fclass Fire(nn.Module):; r3 B) ]0 L8 H* y
    ; e& N2 w7 F* C+ M  i% K1 x/ Y
        def __init__(
    , c, k% u9 q2 ^, R6 o3 U        self,
    & ^$ T% r5 z, R/ p        inplanes: int,
    / i% O) A/ D4 P6 c) `, B        squeeze_planes: int,- I5 A: L5 E) ]6 a; O$ S: h
            expand1x1_planes: int,% u/ d! N/ v0 n, M
            expand3x3_planes: int. [: U6 C9 M6 L! I  j. x0 K
        ) -> None:' |* z2 x8 X3 u' S3 q7 k
            super(Fire, self).__init__()! \) k- a) |8 K& T3 m# O1 K- ~
            self.inplanes = inplanes
    3 k. r9 I$ C/ l: t        self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
    , a4 j7 p; R5 K        self.squeeze_activation = nn.ReLU(inplace=True)0 Z- F( }$ D, V+ d& p& ?+ ?5 U
            self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,+ J5 y. [3 N" e
                                       kernel_size=1)' V6 r4 J6 m' I! f/ a
            self.expand1x1_activation = nn.ReLU(inplace=True)7 T/ w+ I, N6 g! r! Y
            self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
    1 E% h' G& x2 n3 o( C# K+ {9 A                                   kernel_size=3, padding=1)" Q6 B- ^: {0 H8 k4 v0 n
            self.expand3x3_activation = nn.ReLU(inplace=True)6 e# k  u  {( L+ x
    0 z# ^* j' R' u7 U
        def forward(self, x: torch.Tensor) -> torch.Tensor:' n: j, U3 G( r3 ?" W
            x = self.squeeze_activation(self.squeeze(x))
    8 w& V' f2 P; x. ^9 X        return torch.cat([  Z1 V1 L) Y) @/ F! n% j/ B- D
                self.expand1x1_activation(self.expand1x1(x)),
    * a5 V' a% y& t' |8 L7 y1 M            self.expand3x3_activation(self.expand3x3(x))5 o9 }; d6 X; t2 e( T9 q! x
            ], 1)
    , z4 y4 ~- p7 u/ S& d; Q2 @, \* U0 W1 j, N- v0 C
    1
    7 V, M2 w% E+ `! I- `% v0 x- f: f1 o2, f( S7 S! {/ k# G/ S
    3
    5 A# s5 D% |3 \. y3 B4# `' [1 q) G3 n  _4 V
    5
    % ~& R' Y& W/ K8 E$ Q7 U0 ?6* g; `1 H, ^/ U' u: `
    7
    5 n- j% a! L: T8
    ) t; C4 a3 R/ K: `9
    7 l6 f5 {* E0 A; [8 `* A$ S10
    7 s$ e- y6 ^+ u5 e0 e) L4 K11- o: v  N( s( @
    12
      w. i  K& I0 l( G! Y9 i1 i13
    2 O( s/ G. ~# l5 N. s% O5 K) \145 l2 q1 h7 ~8 P5 S$ @
    15. g6 A) B( K1 W, p7 ^# w6 c) _
    16
    0 o; U! _  O, Z17
    3 T. b; m. k) d* r' u180 W/ {) Q4 G) l: ~( ]7 c
    19
    / ^: Y. i" `4 t$ w$ ?/ @208 g0 Z' T9 a* [! }7 H1 d' [8 t, @
    214 O! H: b; u) f% P. O- F
    226 s' K+ R9 \% c) U$ q; N, e1 ^
    23% j, Q1 n$ J+ t! W5 i7 x3 M
    24
    % o- P; q1 [5 L/ p; u. W0 T4 S25
    + b! k& l! D# B* Q& e26, j$ e$ A( A9 p4 x  I
    SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。; C; @; W/ e; o. [$ i
    & b* L$ }6 P7 I+ Q3 Q3 f  D1 x
    SqueezeNet1_0的网络结构如下:  i+ q0 m" K$ D2 h# e+ G& b

    ) p5 `2 L  {( j, @' \7 i8 V) jself.features = nn.Sequential(
    7 r: c( ^: W# F    nn.Conv2d(3, 96, kernel_size=7, stride=2),
    1 R: k7 ^- T# H: O% [0 Z    nn.ReLU(inplace=True),) X4 d* O' m4 p6 U$ l& ^
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),. o, @: k% I, a5 u
        Fire(96, 16, 64, 64),
    ; y6 U& v( k) O3 n    Fire(128, 16, 64, 64),
    6 z( T( k5 Q5 J/ ?2 e" ?5 y" t    Fire(128, 32, 128, 128),  [! N+ S7 }' `4 f
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),( {, Q9 A2 e# B3 V% i/ ~- x
        Fire(256, 32, 128, 128),% b5 i4 W& b4 B" m
        Fire(256, 48, 192, 192),
    * a  K# w2 E/ b0 b0 d    Fire(384, 48, 192, 192),  N2 n, S2 a% o9 n
        Fire(384, 64, 256, 256),& y1 Y2 Y7 p8 ~" B
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),& j6 m0 B( e$ E9 V+ _  R" ^$ Q2 U
        Fire(512, 64, 256, 256),# e2 t3 h2 L/ X8 |4 p
    )
      P. Q& Y( M9 ^. E7 `$ Ifinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    * b" N" y2 r* b+ Nself.classifier = nn.Sequential(+ q4 ?5 ?! T& n( N& I0 I( V0 m! }1 \' y
        nn.Dropout(p=0.5)," P" `9 q# ]7 R1 ~' V/ M2 P
        final_conv,
    & v: K4 Z' A' P    nn.ReLU(inplace=True),( `% j" D8 r1 p1 `5 b
        nn.AdaptiveAvgPool2d((1, 1))
    # `7 V; i  |  ^! d0 O# W)) A6 h8 Q. `+ h5 x
    ) o" \$ m8 B2 @  ]9 x, v' Z% v
    : b) y/ U# k4 z& I  I
    1; p3 N1 e. c& b( d
    20 }9 l8 i( g1 O
    3) u& I' `0 f. s( l
    4: x) o; a* `; ~0 o9 e  ?6 Y7 p
    57 e; r. U0 [7 D! r
    6
    ; \0 \. G; E/ l6 J7  ^$ G2 _- |5 ~5 @
    8
    2 w% g1 m9 @, t' i" b9
    ; ~) ^8 U7 ]5 J- @10; Z# R9 x8 @  L% G5 X; K
    11
    ( [' Y# X! `9 w4 `& P/ B+ j124 s) O% s2 p) D: ?: I% v
    13
    3 a4 w9 v7 A4 t9 Z$ a- v14( \3 F9 ~" h  @2 y$ g
    15: L' A2 ~  u! H* j
    16
    0 h$ C6 w( ^5 g0 U7 ^17
    2 S* D! K/ ?6 w! c18
    . J/ Y; P: I8 O3 l6 y. x198 M5 K4 Y! a" F
    20+ G4 P: r& _' G! A+ _" J* r( B
    212 ^" p1 ^) P5 q* _
    22
    ! v8 x+ D: j+ e: ?& |) q238 A+ \; l, `/ A) ]) l' _) u
    SqueezeNet1_1的网络结构如下:
    * v" x0 B4 y' c: p. N3 Q- A1 P0 j2 v( X9 D, T- c6 K
    self.features = nn.Sequential(
    ) L5 b5 A! _5 R* ]) `2 J3 w    nn.Conv2d(3, 64, kernel_size=3, stride=2),
    " m" B/ N+ B  b4 h  b    nn.ReLU(inplace=True),8 O5 B! M- m7 j4 J: Y9 R) K
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),6 T. X4 v1 p" Z: J: y- e5 H
        Fire(64, 16, 64, 64),, L1 o* p+ t$ v( r! M/ T4 v
        Fire(128, 16, 64, 64),
    6 v2 J% r: b5 B' |* F* C/ y    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    ! b2 p% Z/ B- T' ?0 [: m    Fire(128, 32, 128, 128),0 C% _; e# M8 z3 s! @" D
        Fire(256, 32, 128, 128),
    ; v* r; ~3 T/ B5 ]    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    7 G% z& s, n- k& J, C5 l3 v: y    Fire(256, 48, 192, 192),/ S8 ]4 i/ S2 p+ }  F5 ~6 t# w
        Fire(384, 48, 192, 192),
    3 d& h+ `) X1 {3 I& m, u    Fire(384, 64, 256, 256),
    8 L! @0 D( F: V6 K    Fire(512, 64, 256, 256),
    & _$ M8 _* ]& P( Z" Q)% C1 T  i8 R4 ]+ O9 k( P
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)5 R) M' m) [8 m! X2 {# I
    self.classifier = nn.Sequential(! R0 ^# \, c4 L% X  p( j4 f
        nn.Dropout(p=0.5),4 I$ j- Q4 Q" u; U9 \" l
        final_conv,# p$ j& D; E9 R  ~
        nn.ReLU(inplace=True),8 V4 F3 p! b" C& B" O' [. r
        nn.AdaptiveAvgPool2d((1, 1))
    % e* I7 J) Y0 ~9 R)- v" F/ H9 ?/ Q; @7 d! X# B6 }

    & H1 R' ^+ G0 u9 _/ P# X1
    5 ^+ d/ p) d/ M* c+ u' y0 E1 V2
    . Q! E! M4 @- ~! o' n38 _. |8 G6 O- f5 e0 \' g3 M9 p+ D
    4$ h, [2 i4 z3 l6 I4 M9 C& u( M
    5/ k* a$ p$ d& u  b1 C6 ]2 G9 h
    6
    ! o  Q* r. [$ S( r. r) ]! Y* C7 C7: Y: Z# e/ \* C7 s  x8 l- K
    8: }1 Y6 I+ j/ a: {8 n
    9' I) Y  e: R: i/ e
    103 u8 v: i, D6 {: a+ J
    11
    6 I7 g% [* I: E* p4 W$ e" }12* B+ H0 z$ d) w& _: o
    13/ z0 R) \7 Y8 l) f
    14! c6 l' k% l* {4 q* l8 r
    15
    ' o" l( k! E; r! r- K5 f' s. V: O16- u; e; c* w/ r' s( }) {% F
    17
    1 \) H6 |% N/ ]' R5 B$ C18
    1 ?; U# {1 D  @5 F, I9 l) o19& d; R9 d( ]+ k( J/ [* g
    20
    6 p! s6 v7 j7 k/ e+ ~& h$ Z21
    ) ~5 \9 w( ?/ p& k( ?/ t22
    * D7 a* z* b/ N" jSqueezeNet各层详细参数量及其输入输出如下表所示。
    / _9 m' t( X* s0 _- S0 E( b* f1 y! F& i( k% a4 E2 l

    ) p: s9 A! e9 k9 S9 s7 Z0 t, t8 o4.2.6 其他实现细节0 i; ?7 W/ w  C+ D! j7 ]$ g9 M
    1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding- v0 l4 n8 b( m. e
    squeeze和expand层中使用ReLU+ u0 H; E1 f; B2 N' A/ @, v0 m
    在fire9之后的layer中使用ratio为50%的Dropout
    5 ?: h, a4 c! `3 _参考NiN算法想法,SqueezeNet中不含全连接层% {$ ]* I  j5 n. Y  o
    训练时,前期学习率设置为0.04,然后线性减少1 n5 D3 N) J, m1 I/ @# Y9 p
    4.2.7 总结
    ' Q, F  O; I# B2 L; g本文最主要就是三点:
    8 {) z5 I5 `7 H* O0 U; z5 d' \& e4 ^9 j9 c
    用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
    0 \6 j# {  D- @* u8 V减少输入到3×3卷积的特征图的通道数,减少参数量: S. N6 ]. C( n9 Y, Z, @9 w
    不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率0 X& u+ X; z& V, H: y3 P+ \
    ————————————————
    # ]/ p- x4 k0 c4 B- y版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: i  k3 \  B' X, G; _
    原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
    3 r6 `/ }8 s7 ~: x0 w$ a! [* X. ~& }' v( J( n) e% R8 N) p' m. u
    ; W1 K3 Q& D& h1 }  a
    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-8-24 04:29 , Processed in 0.707125 second(s), 50 queries .

    回顶部