QQ登录

只需要一步,快速开始

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

    4 ~$ x4 N: A" `6 N1 U轻量级神经网络算法-SqueezeNet
    + |/ T5 f. }. Z7 Y  L8 h4. 轻量级神经网络算法目录
    $ k! r0 B2 \, u' ?: s4 e轻量级神经网络算法& z) P9 T4 ?$ d9 k- i
    4.1 各轻量级神经网络算法总结对比- j7 G3 C  \' ]5 T, _. b: H. h5 a
    4.2 SqueezeNet0 A  b. T4 S# b- J, _0 L1 S9 l, J) p
    4.3 DenseNet* e' W/ `: j( D  {
    4.4 Xception( L( o# j! H; P) N4 Q% U
    4.5 MobileNet v1- `6 \- O) f% h
    4.6 IGCV
      j, s- f( s  p2 ^4.7 NASNet
    " O  z) ?% o/ d, i# w4.8 CondenseNet
    & n+ h$ E5 L6 m5 W- P) o4.9 PNASNet
    , W% o) m0 X! N( M/ M4.10 SENet
    9 i2 t! W) Z# |; e5 g9 E4.11 ShuffleNet v10 W; f$ U: _4 u3 K0 B& s/ ?
    4.12 MobileNet v2% b  N# \+ ], u
    4.13 AmoebaNet3 Y3 F, h* Z( U7 L5 k" M6 Q& k; z
    4.14 IGCV2
    5 L0 r0 J# A3 h9 Y- e4.15 IGCV3
    & |3 v: k6 f2 ]. t4 W4.16 ShuffleNet v2
    + F8 f$ p" ?- P+ j( D  C! y4.17 MnasNet$ t, K, q2 B! e$ F8 G
    4.18 MobileNet v3, ~* o3 V; @, c( `
    深度学习知识点总结; \4 z, f' V9 K, G5 E  ]3 \# g

    $ f: Z  X7 ]2 d8 O/ Z: B( n专栏链接:) K% t2 F  K/ A
    https://blog.csdn.net/qq_39707285/article/details/124005405
    $ l2 }# M2 `) B* h( x& @本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。* J! j- _: J: {1 @- N/ n
    # O; ^9 U* q3 \
    本章目录- o6 F" ?8 @. P0 }0 I) F( h( m9 P  i
    4. 轻量级神经网络算法目录
    & t( h7 {7 t- o0 S  v  O9 e/ [3 }4.2 SqueezeNet
    $ P/ V  W  C/ B7 S4.2.1 问题分析, A0 M% \, U) ^
    4.2.2 SqueezeNet的三大策略5 G. R6 v6 V* S1 {
    4.2.3 Fire模块
    - j& _; q; |( k! H, p6 E+ t& N* [4.2.4 SqueezeNet整理结构
      H5 |$ m/ u" t8 k. g4.2.5 代码实现SqueezeNet
    6 J6 I+ L% `: x( p5 ^( j5 M) |4.2.6 其他实现细节+ u# `9 j4 S9 B) y- \$ ^; V# ^8 H" ~
    4.2.7 总结
    / B0 Z" D* R6 q) z0 N: w# Z5 Y4.2 SqueezeNet& u- F) ]: w# g' E. P9 O
    4.2.1 问题分析
    ; ?" _  {+ F+ X# D8 b0 l- @. z最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:' q% `% G  L0 G4 C

    5 q; t- [* a/ U在分布式训练期间,较小的CNN需要较少的跨服务器通信
    9 N9 l: n3 a, d在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
    ( r: `. c8 N% h4 S2 U较小的CNN更适合部署在FPGA和其他内存有限的硬件上
    + k. }" N* T/ i7 `+ `为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
    8 z: H. w1 w, V* f- o) J% q
    - R1 w. \+ V" I0 ?) _6 \4.2.2 SqueezeNet的三大策略; f  D7 D8 M! r3 U2 r8 ?9 t
    策略1:用1x1卷积代替3x3卷积
    $ }* M$ N- i! ^+ T% k* t1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。+ ~! c# Y- Y. T1 o+ g) i; x
      B, g4 j( |8 L7 i& A: J
    策略2:减少输入到3*3卷积核的通道数量. E2 z2 A6 p4 W& J( t! x: w
    对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
      r3 ~0 Z! u: X9 `
    $ {- U* x1 J' t' t策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
    4 Y' A6 _% Z/ `8 E( ~# l这里的激活图(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中。1 }( ~+ f% Y" L
    0 q+ z" p. g# T
    策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。$ P$ g' ~: j; W5 }

    ; B# T1 b7 G' \" m4 e4.2.3 Fire模块* }5 o+ P- t' r: y2 `3 L' u! q# s3 o4 \
    为实现这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的想法。4 R! l& R7 @6 b9 g) o
    * M/ u2 S7 G9 r3 S7 y

    # o9 A. d9 i, M& N! ~4.2.4 SqueezeNet整理结构6 m6 Z: Y9 V3 `0 v
    SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。9 @2 k; F7 z& o6 b

    5 E' T6 z7 ^9 ?# v* w" I3 \
    0 f% T7 m. L6 x) d1 G8 g& H0 a4.2.5 代码实现SqueezeNet1 g. v! w- M* O3 ^! p3 w: x: j- D4 I
    Fire模块的代码如下:) M3 G) Q9 |$ U2 P) g) ^

    + x6 W* p2 e2 v2 k' dclass Fire(nn.Module):# _* {9 s, g: g- W: C: A- B4 @

    0 e$ m- q. x) Z    def __init__(; A3 W! U& x. ^# |/ `8 m& W
            self,
    ( d/ l) K4 e/ O0 a* h        inplanes: int,
    % A0 C  Y2 Y6 q        squeeze_planes: int,
    ' H% V5 V" C- V. A, Q; b        expand1x1_planes: int,
    ( a4 ^' S, {; M        expand3x3_planes: int
    # \; r  `* |) o0 w  V; T* ^$ G    ) -> None:
    $ G; m% h( r# `/ R9 U+ ~8 v4 K2 U        super(Fire, self).__init__()4 [( B5 t" q+ r$ [+ [
            self.inplanes = inplanes2 Q! A3 R' W2 I; U- ~0 I9 V; `- U
            self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)2 j) ~: i7 A5 C- {. o9 T0 E0 P2 H
            self.squeeze_activation = nn.ReLU(inplace=True)
    , J+ I. z4 w- w0 m7 v        self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,% y( c" E0 @# W8 i* _
                                       kernel_size=1)
    7 p' P8 Z) p" @, A$ j/ y        self.expand1x1_activation = nn.ReLU(inplace=True)
    7 Z+ r6 h, a% }6 a  I% r# H# n/ u# x        self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
    0 z% Z5 l2 @$ m                                   kernel_size=3, padding=1)
    2 y. F3 k: o/ Z& u3 p! _: }* D        self.expand3x3_activation = nn.ReLU(inplace=True)8 K9 e4 b/ m8 r* M/ U

    + W2 d! @4 o: h, |! m5 o    def forward(self, x: torch.Tensor) -> torch.Tensor:3 P( _3 v- `* F1 r# c" _
            x = self.squeeze_activation(self.squeeze(x))  S, I: E) J. A+ ?6 L
            return torch.cat([1 J, y2 N- S% [$ Z6 T# _- ]# T
                self.expand1x1_activation(self.expand1x1(x)),
    & ~/ f( O( Z. N) L1 h0 _            self.expand3x3_activation(self.expand3x3(x))
    ' u; H$ s7 O7 y$ a        ], 1)
    0 [- c  [; B" K6 M+ W- q" ~: C/ f9 N
    17 y, N! W# z9 P- X7 N( E: d
    2
    / X! \( q+ @1 H5 ?4 J9 M- ~2 j8 k37 z/ w) t4 ?; T1 u8 B
    48 j3 F5 P( @" j$ U
    5
      @; T1 U4 W0 W* j! v6
    + t& _6 o( y1 ~/ u# g: B% C7& s* }2 r  w1 B' M# `5 b
    8& A. w4 H$ ]: B8 ^: e
    97 i  T1 E0 K4 _* _( ?& e6 h4 c
    10
    $ w* O4 ~7 o$ T4 c111 E0 W- ^/ g- ?7 Z8 ~( Q
    12! X* H) t+ l( Q4 P" N/ Q( h; J
    13
    " t; I2 i! g) V: \14" I( C7 [& n3 H( \# S
    15; \' x! {+ ~3 A4 \! d
    16
    ) K) K# R& R5 j/ c17  W" t" A" F' S1 ]
    18
    # ?, u2 n# O+ W- q19& e8 s+ A, j0 t/ v. ^
    204 c1 }) Z$ w& B' U  d, @3 l; K
    21& S3 q, L) i2 r1 J, L
    222 F- r0 e& @4 ?7 i3 K
    23( b8 v/ z2 I7 q9 H! u( R+ K
    245 o$ O2 }+ D8 D
    25' O0 F" g  `- s/ x  Q# C
    26, E, x/ S# y  S3 Q' \- `0 k! l# E. t
    SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
    3 A3 _* w4 i. s* \) U9 G2 w, t- C# Z3 {8 P, T* C, x3 E8 X9 w
    SqueezeNet1_0的网络结构如下:, l/ a6 n  _& l
    - r/ H6 f; W/ b! x6 [
    self.features = nn.Sequential(! ^! s8 i8 F! T- E/ t# Y- F3 F
        nn.Conv2d(3, 96, kernel_size=7, stride=2),
    5 E% p8 a; J0 }2 X6 R    nn.ReLU(inplace=True),8 M0 O& P. d$ b
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),8 G# e% ?- y# `" z/ I# z
        Fire(96, 16, 64, 64),
    ! v* I9 [" k+ ^+ I    Fire(128, 16, 64, 64),4 t7 y+ r7 R1 X( H
        Fire(128, 32, 128, 128),
    7 h& k/ B2 C! R% L- L    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    * W/ J# V$ X% Z6 I& A) H$ V    Fire(256, 32, 128, 128),! e4 g% Y0 @% }* g" _* g
        Fire(256, 48, 192, 192),  ?+ O% i4 C0 J, k2 A) d
        Fire(384, 48, 192, 192),! x& d8 E' S8 b) x5 s9 `
        Fire(384, 64, 256, 256),& Q& F% F' W" U: K- L
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),3 W- E7 t3 H8 E( _( e% Q
        Fire(512, 64, 256, 256),
    0 m. T+ v, ?2 G# O)
    + f2 M  r3 E2 Y& z4 p: ?: z8 Xfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)! t6 Z- e9 H# V7 H7 R" a
    self.classifier = nn.Sequential() e' \3 b, O  h# ~
        nn.Dropout(p=0.5),
    + d! _3 d5 q# P' p. ~" @, s    final_conv,* A5 \. }7 z6 @' c' ?* N( a
        nn.ReLU(inplace=True),
    $ j' h9 j! j8 l' @; M    nn.AdaptiveAvgPool2d((1, 1))+ r9 z2 W* H4 E/ K' I- O
    )
    # ]; d0 l% G; E5 k0 A. D8 T( L
    ( ~( B/ C" \* V+ k8 n5 n
    8 b4 o% m8 n  n6 s1
    0 ]& d' m. C! X' d9 ~' F2
    1 ]* e9 O$ Q/ L- |6 }! f. T3
    + v- w9 O. ^3 F4
    " n. s& Z9 h: F3 k5
    4 S: G* _  w; W  u; a6
    - Q; y3 L) s% H4 X5 r% u7( X) G- P3 O9 n8 j+ J" u
    8. b& v/ {9 J4 G9 H+ i( W
    98 m! Q4 |3 C# O! e
    10
    ; e4 g: y! l* x0 G11
    , ~: u" O8 Q9 P5 ?7 K7 ~+ s2 q12! j+ p% e0 l* M
    13
    + T4 z3 a3 l2 q9 g! r140 i/ T5 |" d" U5 E" Q- X0 d
    157 k" d" S- e6 d5 Y: o% V
    16
    2 A! H5 `9 d% o' \% Z$ ]+ e17
    - o- S2 e( O/ {- \7 E! R18
    ) n% ]7 y4 X: n) ~19
    0 m& a) t' o6 u8 E205 Z0 m$ f2 A. v+ h5 M) `
    218 x$ F- B. o" m
    22/ d0 y5 y+ u( A5 p
    23
    7 x( O/ y0 g5 R9 g& NSqueezeNet1_1的网络结构如下:4 X) D7 Y3 }+ _
    4 R  r# i- E7 i' K
    self.features = nn.Sequential(% f' F2 z) Q. j, k+ p  a
        nn.Conv2d(3, 64, kernel_size=3, stride=2),; d3 J) ]  D8 a/ ]2 @8 {# |- t* W
        nn.ReLU(inplace=True),; {  T1 a: V: E
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    2 I2 Y  p& U4 E+ ^( F8 ^3 ~( }    Fire(64, 16, 64, 64),9 m5 C0 \9 P1 ^/ @
        Fire(128, 16, 64, 64),
    1 n4 M; o+ y' i- @, T    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),; ~. I  V5 b2 g$ ]( l2 q$ N
        Fire(128, 32, 128, 128),
    + a! ?$ G, D/ R    Fire(256, 32, 128, 128),/ {+ |$ s1 i: ^: c" ?
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),, c: u! b7 ~: g. z. e8 d. D
        Fire(256, 48, 192, 192),) y) x  C! `/ n2 M
        Fire(384, 48, 192, 192),8 x( t9 U* ~' n" l
        Fire(384, 64, 256, 256),& I2 b7 E7 Q; ~$ T, i
        Fire(512, 64, 256, 256),7 f" m6 Q2 D0 V9 o$ g
    )
    0 c; l7 r: g8 E* xfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    " L" C1 I/ q/ E8 @) e, @4 fself.classifier = nn.Sequential(! e! ]9 e, _+ m0 m7 H
        nn.Dropout(p=0.5),* Q6 D) R7 g1 G. N' F
        final_conv,
    % T3 c4 b: n* l    nn.ReLU(inplace=True),
    ! D$ S" R. i3 H! F9 `    nn.AdaptiveAvgPool2d((1, 1))
    0 y4 B. t  E. i2 o2 E)1 h1 X# B+ s9 l! E2 ]
    5 p, L( a( g* \9 }% w7 b
    1
    $ d; O) f2 d4 i/ p  E2
    , K- H4 e+ q% w: f0 A  {% \8 q% |3. }; r, W/ T$ x; m
    4
    ( r1 c# ^! M- }5
    , d; i9 u$ F. K: t; a6
    - r: ~( a4 W5 Y/ N4 k1 y4 K6 D/ u$ d7
    6 o& p+ k2 J/ h0 Z0 O8
    & |3 T9 h/ s8 }  T' w  F9
    8 b3 O' X0 b* t. u4 r% D! D: S108 m  n8 G  Z& K
    11# u) p9 f9 d) {  |' p! w9 l0 ~
    121 A, b. L& L! O# H5 K; z7 _8 L
    13! g9 S6 ^! O2 x- o+ ^: `1 q0 E  M
    14& W8 o- B! R. N
    15
    1 g$ r/ `& O, |% D" h16  W5 w% |8 C/ i$ N; n% g- [
    17: u$ j7 a' }, G2 T& `; b
    181 Y5 Y; L+ b+ G$ Y; l
    19
    % c4 Q$ }4 G' a* `20
    * @  h, e4 q4 d2 Y! ?21
    ' m" x* Z( _# I& b5 f221 e* i" i* ~- ?5 K" Y: ]) h
    SqueezeNet各层详细参数量及其输入输出如下表所示。
    ' U( z3 x$ \' Q3 R' q9 u  T) Y
    & V5 i) B) N$ r+ a2 T
    : Z8 A" H( c7 E4.2.6 其他实现细节
    ' O- n' a# W1 f+ k( f  ^1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
    ) B- y$ y# _/ Q7 x6 Hsqueeze和expand层中使用ReLU# @$ V# Y4 f  t5 }2 b; n8 b
    在fire9之后的layer中使用ratio为50%的Dropout
    ! f" t5 r" }0 n6 P6 z+ v% B参考NiN算法想法,SqueezeNet中不含全连接层
    + P0 }8 k7 ^" @1 v! c/ V1 k% f训练时,前期学习率设置为0.04,然后线性减少
    " L4 ^4 N5 k6 \0 m: ~3 J5 j* D4.2.7 总结
    8 S( e6 c1 d: s% c% p本文最主要就是三点:
    , ]3 R, }' _5 I& j; D0 L
    9 V, n9 Y7 e1 B! d! _8 T1 {用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果' g( B' h, m' f7 x- s& I2 U
    减少输入到3×3卷积的特征图的通道数,减少参数量1 f4 L2 o0 e* Q' [1 F
    不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率- K' |4 c/ Z9 L% C) G+ Q
    ————————————————3 N/ M/ P9 b$ p: n' `* U/ c
    版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& o1 m/ W: F' H# N9 O
    原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100: I1 Q' n0 v/ M
    ! p" v+ r# k6 O( L

    0 [5 P. ]+ w0 E
    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-11 09:41 , Processed in 0.454894 second(s), 50 queries .

    回顶部