QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2885|回复: 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
    6 u5 [7 ?# [0 T( [. c
    轻量级神经网络算法-SqueezeNet0 m' G; A2 p. T" b) J
    4. 轻量级神经网络算法目录
    6 O- c8 F9 z0 [1 t% _; ^& e轻量级神经网络算法
    , |* k0 {* P* W, b4.1 各轻量级神经网络算法总结对比# t% w% ~# c0 \* z7 g* k
    4.2 SqueezeNet" p; [  Q# z7 g2 ]; \4 s6 O
    4.3 DenseNet( p1 c. w, N* h  |( ~* B
    4.4 Xception2 i/ i( m+ h: _
    4.5 MobileNet v1
    5 z, B4 m0 {/ z2 Q, A4.6 IGCV
    ) V' G2 I$ D/ z5 v  ?4.7 NASNet
    7 f) q' ^$ W: P) Z( v/ B- o; z4.8 CondenseNet
    # [  [1 M1 u: |9 O# J4.9 PNASNet. R! ^+ Q& j4 e$ d" R, [( ?( i
    4.10 SENet
    , _, B/ i8 k! G6 ]) e4.11 ShuffleNet v1) r$ n& C/ f2 G2 U* {
    4.12 MobileNet v2  F5 r0 h( ^# Z/ n6 F* ?5 G4 Q
    4.13 AmoebaNet
    ( u2 F* O9 V* s/ _9 j4.14 IGCV2* ?$ ]6 w5 `) |. T. d, C. ]
    4.15 IGCV3
    ( v1 T! z, }/ d. S: @$ \4.16 ShuffleNet v2( P; @" p4 j% S2 k( N+ Z; q! L
    4.17 MnasNet4 y! V; J' z9 h2 ~3 O/ M. E* A/ m
    4.18 MobileNet v3
    " T. I+ b" ?% n2 k, w深度学习知识点总结
    1 Q4 R. t8 p* Z% ^7 R5 G4 D2 R2 ^% `9 \; |+ S
    专栏链接:5 r; q3 y& W; p/ L, t& Z7 p
    https://blog.csdn.net/qq_39707285/article/details/124005405
    % h( e6 f+ `# |& P" w4 ?* R. `本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。  c8 T7 I( a  @1 W/ X

    9 A. Y1 t2 R  n& {: T本章目录
    5 p0 B' K7 g4 z2 C! ^: N4. 轻量级神经网络算法目录- f4 S! Y" y' D0 z3 E2 t
    4.2 SqueezeNet
    ! R' C/ Z# D3 D  F2 O4.2.1 问题分析1 {/ M$ D: n" Y. S2 o* u/ m
    4.2.2 SqueezeNet的三大策略4 v# B- N  R* q# o* E, h
    4.2.3 Fire模块
    , j4 b" q2 G8 M, @: Z4.2.4 SqueezeNet整理结构( G6 k1 \' \- X# z
    4.2.5 代码实现SqueezeNet9 ^2 ], Z! I, V7 Z$ [
    4.2.6 其他实现细节
    ' e9 J- Y% A. j+ m" A4.2.7 总结* H" g& D! f+ X  U* b( J
    4.2 SqueezeNet
    6 j& w( P& x  S3 D, [; j4.2.1 问题分析
    5 r* _/ c+ K0 F" l) z+ ~7 V4 D最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
    " f- I5 h3 X( f, j+ ^1 o3 G& N  l* [# L
    在分布式训练期间,较小的CNN需要较少的跨服务器通信
    & _- h/ t# T7 |在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入9 l4 H* G/ f6 }  e4 E8 r( t
    较小的CNN更适合部署在FPGA和其他内存有限的硬件上& C4 ?4 C5 C6 m( a
    为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
      P8 K) a7 t& w7 y
    5 t2 v1 e( c7 v0 [- f' B4.2.2 SqueezeNet的三大策略0 G3 D/ }) ^9 m6 z' {
    策略1:用1x1卷积代替3x3卷积
    ; w* J' D/ h) i$ {' O% c" v1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
    * Q+ m) d0 d+ N1 B) q6 a$ v+ e. Z! L$ k1 i
    策略2:减少输入到3*3卷积核的通道数量9 B) G# X0 [# [7 a
    对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
    % \0 k/ q3 L+ d6 ~4 Y6 }" c8 a
    $ s$ A- T( I" z策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
    6 }, @3 n' k* b/ u2 ?这里的激活图(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中。
    5 B# |9 }2 b) e' x* \' L9 [4 L1 f
    策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
    3 g" w) ]6 h, M( H9 T9 n7 [- I! u; Q0 g6 F
    4.2.3 Fire模块$ S( a7 J  a2 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的想法。7 x( m. N7 a; m
      ^4 c% M8 P, R: \- h
    ' j% ~" L) [' T: j
    4.2.4 SqueezeNet整理结构
    8 {0 `) H4 B# CSqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。9 b7 o8 g& ?" x+ q; C: I' L

    - n) w$ e, s) {9 Q! I, t( H% G1 d% j; W* F9 _4 h- q0 R6 ^/ H: W
    4.2.5 代码实现SqueezeNet6 o) o: |2 d) s4 v7 |6 @6 ^: V
    Fire模块的代码如下:" ?! N2 Y" P8 K& x
    ' H& E$ a2 j4 B# J
    class Fire(nn.Module):
    0 h) q# b) U! l) X: ]3 B8 f% f4 i7 i- e( m( H8 D
        def __init__(
    7 m5 l7 T* K6 `/ v4 T+ [' O) i' L        self,& t2 n/ d/ e) i" s9 ?/ j8 J* n
            inplanes: int,! V( U0 N; P& g5 z
            squeeze_planes: int,4 t. a3 s4 L' D7 d
            expand1x1_planes: int,4 L% r: L4 R7 {8 n+ q" D8 r6 u
            expand3x3_planes: int$ z3 @) ?; a* p; X2 l' a
        ) -> None:
    : _( h2 \' K6 B: a  ?; ?8 k' _        super(Fire, self).__init__()
    # z, d: P3 U  }( y: D! K        self.inplanes = inplanes
    # f+ Q( X4 J+ R* O- ^        self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
    ; S' d: |$ i: V: ^6 f4 U5 P* y, v        self.squeeze_activation = nn.ReLU(inplace=True)# X/ b3 w" r3 p0 t3 p
            self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
    + x; A+ U2 |. v) g) K! ~( T                                   kernel_size=1)  a8 B" f' J' M. C& z# ~1 F1 u
            self.expand1x1_activation = nn.ReLU(inplace=True)
    6 ^, i3 ]- M. L4 a        self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
    9 \8 f- n. D* z; U7 Z: Y3 x                                   kernel_size=3, padding=1)) L! P1 a# b0 r2 U- Z& [2 \
            self.expand3x3_activation = nn.ReLU(inplace=True)
    2 k8 I% R. I/ Z4 [
    + M8 i1 ~/ o5 @  q  C2 H/ \# @    def forward(self, x: torch.Tensor) -> torch.Tensor:( W' o, @/ v7 |1 h' i
            x = self.squeeze_activation(self.squeeze(x))
    1 ^3 D. h+ h% v$ z, ?+ _        return torch.cat([
    4 T/ K* M5 G4 s% `( x/ K, X            self.expand1x1_activation(self.expand1x1(x)),; v- l5 |" }/ H
                self.expand3x3_activation(self.expand3x3(x))( T: P* c8 w5 O  Y, a0 j
            ], 1)7 A+ g  R  f: s$ E. @, T
    / u2 H# Y3 t1 I4 @
    1% P( q& g4 I  }1 ^1 [+ d( ?
    2
    : `% n+ s2 J1 r3 W3
    1 j, n4 ?' w  c% g4! o6 u0 b3 ^7 [$ I( g
    5$ |" V5 X3 N( \3 W! X3 f1 _
    6: `) M$ U3 _' ^, e1 e2 `
    7
    4 q: b$ F3 ?4 W1 ~% g$ h' k, S8# n0 l6 o) X7 M1 M, [0 ^, I9 b
    9' ?  o" O7 f3 [% ^; d, ~0 R
    10  H& O7 N0 O3 T
    11
    4 j; J" S. J9 l0 K  g) R* T123 }- k2 i- E% C
    13
    6 E# |9 k! O% b1 ]14
    7 y% C% d7 t% j+ P9 L  |& o15( N9 `! t; j( |% w/ n9 X" P* `4 f
    16
    9 g# A/ T3 i# _% D' V0 u4 Y, o17
    3 j  y, J( r+ S$ i7 ^& t0 ^0 N18
    : n9 B0 P- e* h; A0 Z  M" s3 }8 p19( p1 Q% r2 V% `) p% m9 m5 @0 E
    20
    5 e' p. }9 C6 R1 [212 C- b/ [0 C8 U. d+ f% q% y
    22
      O- d$ e6 C. K0 D6 B9 o/ n23
    # E5 m4 o. r  G24
    ! ]4 f6 i% L7 }& D3 X250 o$ g/ m6 v" w& V, q2 T2 x
    26
    - [8 O7 Z. A  J7 `! R3 N  vSqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。" J" \  o. L8 J, ]

    ! g7 j* ?7 K$ O4 I; E) ASqueezeNet1_0的网络结构如下:# y+ a( E; r+ D
    " L) s. [# d( V% P2 q
    self.features = nn.Sequential(
    $ }* ~, D, c# k    nn.Conv2d(3, 96, kernel_size=7, stride=2),
    5 U, G; a2 Z7 e    nn.ReLU(inplace=True),
    / B, k8 |. e  [# ~1 e    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    . J' I& f5 D% s8 d; w    Fire(96, 16, 64, 64),
    6 R& v. W  S/ o$ E, U$ J    Fire(128, 16, 64, 64),+ e# O' n2 e6 \8 x; V
        Fire(128, 32, 128, 128),
    $ O8 G: Q. e  s    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),) R0 C2 p8 }% O: v; J- t
        Fire(256, 32, 128, 128),
    $ i) A% L: |0 _" g    Fire(256, 48, 192, 192),
    0 r2 ^; `9 v* [. `" y    Fire(384, 48, 192, 192),. S/ m$ s2 L4 |; R- c! A
        Fire(384, 64, 256, 256),
    2 I3 k( T/ `5 z! r* M    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    , r+ Z) z& X5 ]    Fire(512, 64, 256, 256),( F1 q0 W! s6 t& u
    ). G3 {* G8 \& P/ Y
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)3 \+ P* y% n8 Q3 |. g
    self.classifier = nn.Sequential(8 t. n4 @, H& Y
        nn.Dropout(p=0.5),
    : f0 P0 _+ T( f    final_conv,
    & M( a* a6 f: [    nn.ReLU(inplace=True),
    : r# x. r5 e5 }6 T    nn.AdaptiveAvgPool2d((1, 1))
    0 ?4 |+ N& |4 p2 ?)
    4 T5 J" W. |% F$ ^( l& [& Z8 `5 K; b1 z5 n3 U; U8 [9 v" y
    / b! d* l" h2 s6 X3 S, b- m
    1% ]7 S8 i( |+ x6 y2 j
    2  e( |) h- {1 x( ]4 \
    3
    9 r1 e1 r6 D9 ^: _6 `: F' R4
      B1 K( |; x+ U, C59 v, B, o/ v0 Y2 Z
    65 e" e! }% ^4 A& D% [
    7
    * z$ l6 {" N- c+ w- }7 V8- \; S) f: n* S" L, k; r
    9: s9 ^9 C7 F+ {: `" Z8 Z4 X
    10
    ( l; B5 e, w) B- T( @* J& k2 N11
      I( ]2 l% c& C- N# u6 q  e+ R4 w12
    ' [5 U4 N1 s4 L/ Z* A13* ~; J3 r2 }* t% w1 ^: j4 W
    14
    , \( e# k8 X, t! D8 `0 h+ I15# S5 f( _/ W+ e$ C, H
    16
    4 E* C# y- u  i# e178 I4 p9 [5 |% b6 G: [
    18  O4 g- p6 t& c! a: W" d" T
    19, j$ A8 J& A. m; L
    20# h; E2 T& A6 j5 d
    21
    2 S! K1 ]8 a1 A7 w: N22
    + f. a' B5 r% r3 v, e( N/ ]23
    # v9 q3 }$ d! B" j& L; }: ZSqueezeNet1_1的网络结构如下:" Q. v: R! {. G/ `4 |. i
    2 ]- G- o% P: b5 p# H( u$ I; u. ?
    self.features = nn.Sequential(* ~* X6 L3 s$ L  F* m
        nn.Conv2d(3, 64, kernel_size=3, stride=2),8 V+ X( V1 s7 f( P+ ]
        nn.ReLU(inplace=True),8 S& @* ^* i6 Z7 _, i
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    ( P, D7 g$ ~2 \( M/ a$ x! f# V9 x) _    Fire(64, 16, 64, 64),
    & O% v2 J: q  T! W1 A# }    Fire(128, 16, 64, 64),
    ' w- S1 N$ V$ O2 e& R7 U( V    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    7 A0 b, k$ @0 `) Q* R; ~, ~    Fire(128, 32, 128, 128),
    # x9 g3 H4 L1 _- ~$ ^) p2 g    Fire(256, 32, 128, 128),2 L. M, |7 M: @9 m& F* P* Y
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    % X, L7 Q- B4 G5 z' B, E    Fire(256, 48, 192, 192),
    $ B8 C8 f3 [5 n& k! E% O. i    Fire(384, 48, 192, 192),
    7 _/ _" l7 a6 v- g  M    Fire(384, 64, 256, 256),6 R  a+ ~# U+ X5 S
        Fire(512, 64, 256, 256),
    ! \) w% z' ]( ]+ P)
    8 ~2 ?) V0 z, I& s! a5 gfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)1 e0 w: x$ R9 m! q5 _6 B
    self.classifier = nn.Sequential(
    ; a- k" @! A1 |, z( N    nn.Dropout(p=0.5),& s% J: |: q3 y. a* V# W
        final_conv,
    8 z0 ]% A. u! r& Y    nn.ReLU(inplace=True),1 N! j# H1 M8 o$ b8 r  l5 j
        nn.AdaptiveAvgPool2d((1, 1))
    7 b, R1 p5 J1 W+ e$ a& Q) d+ a/ n)4 ?  D, |2 |+ U3 L* O* V

    0 e' o4 K; O8 o2 p1' G: Q1 R" f0 r3 e' r& e  e
    2
    4 v3 X1 A* Q( O7 d! @$ z- Q3
    ' h* n0 F# ?) _$ O3 a4& m6 u" J% z* q  P% u
    5
    2 _) v6 C% Q2 `* O5 `6
    ' z* b! p! @  G: D" J. ]; ?. ^75 _* m& J9 L( l; e* H9 k
    8
    1 p9 \" m2 f& V1 C# q8 R) m  I9
    - \& [6 d! q  J4 I( b/ n107 X: ^* T0 V9 H; Z4 W( f
    11- f5 O/ u4 I6 v2 f  W
    12
    # T$ n: L7 G' b. k- w1 o13
    / c5 Y! Q6 s2 ^) S14
    * w  z- k: {; w153 @2 `! R& M  L* O2 i
    168 r) @% ^5 V; |6 N1 O
    17
    8 X+ F* m7 c) r1 l1 ^18
    ( s: {4 R1 N1 A19
    " R3 E/ z- b( y; n20
    9 w/ c: N3 R2 z- G21
    * z" O  g5 F3 b# A. b3 l/ ~22( d8 ~- K5 R* z2 Y% Y) {2 b7 `
    SqueezeNet各层详细参数量及其输入输出如下表所示。
    ; T% u# o7 o8 `
    3 x' [8 l  t, ?
    # U# t# U( `8 R4 _# n# ^( x4.2.6 其他实现细节/ e- J; q2 |& @% {/ Z
    1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding+ ?9 E# h+ i# ]1 d5 s2 K, a$ f
    squeeze和expand层中使用ReLU
    1 d# v5 j/ w/ ~% h" b在fire9之后的layer中使用ratio为50%的Dropout
    9 s: g# `+ t( q  G+ P" m+ }参考NiN算法想法,SqueezeNet中不含全连接层
    1 j- Q  r4 c+ E6 \7 J3 |6 p" k训练时,前期学习率设置为0.04,然后线性减少
    3 H6 M  n7 Y8 n% ?( H- l4.2.7 总结
    - Z( e# s# f; M; \& Q本文最主要就是三点:
    8 F1 v) d: V, r) n  y6 X
    ' x2 N8 g$ @3 n1 j% Y3 z用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
    : k" o* p  u0 H$ K减少输入到3×3卷积的特征图的通道数,减少参数量6 K3 A7 A& F0 ^  Y
    不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率7 w/ ~; x- n5 T" H. i: h& I6 [+ x
    ————————————————
    ! u1 b" C( `( p4 g3 s. t8 t版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    1 w) e3 i- X  O5 m/ k) u8 L原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
    7 |# X! w* `: y: F' _; F( T8 j2 z/ {
    ! N. W9 j8 r# }" E4 R/ z$ 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-4-10 15:55 , Processed in 0.333541 second(s), 51 queries .

    回顶部