QQ登录

只需要一步,快速开始

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

      b7 f- x. [* r轻量级神经网络算法-SqueezeNet; u0 r, w- M0 {) B! v% x
    4. 轻量级神经网络算法目录
    3 t$ e  S3 r) O* b, V9 e( N轻量级神经网络算法
    2 e6 X% S; |% w6 s! u% q% G2 a4.1 各轻量级神经网络算法总结对比
    6 O% n8 V- |9 M$ b4.2 SqueezeNet# z0 w/ F* r* v/ c
    4.3 DenseNet2 B- R1 n. p) k
    4.4 Xception
    7 g! t; ~& m( M1 ^4.5 MobileNet v1
    ( O# `/ A! g. G4.6 IGCV
      a& O  \5 e  [4.7 NASNet
    $ j( \' b& X; [( ]( u) s! X4.8 CondenseNet! {: O7 L" p2 ~7 f' ~" |. R9 X  Y# I
    4.9 PNASNet
    1 h0 f  [$ p0 }; p4 P4.10 SENet5 C& k) x) D- M$ k' R- ?3 D8 V
    4.11 ShuffleNet v1' W' d0 h7 Z$ a: }" l( b: R
    4.12 MobileNet v2
    $ D/ F* ?$ G8 c1 X4.13 AmoebaNet
    . l4 u; G) Y7 a& G, K  {! x4.14 IGCV2/ Z' U2 S1 ?5 g' k
    4.15 IGCV38 |6 R7 b! e8 A
    4.16 ShuffleNet v24 [8 e4 o% {- {8 Y" P& S) o5 \/ j
    4.17 MnasNet
    2 G/ @- Q' u2 }% r" n) R! B: u+ ~4.18 MobileNet v3
    " T# e) A% i, M: [3 q) C. y3 @4 ]深度学习知识点总结* j" Y, ?7 V# P, K$ W6 L  Q6 s9 z

    3 g8 Z% ~8 F, m9 O专栏链接:# I: o# Q* T" c' T1 X$ M6 |
    https://blog.csdn.net/qq_39707285/article/details/1240054052 a* s5 ?* b/ z, N% {2 v6 P) @4 }# Q6 r
    本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。% f, S$ l# _5 n% l2 N7 h
    / v! Z( g) z* b2 I* ]7 V1 T3 Z. Y* O3 Q1 J
    本章目录3 |& q: d0 q7 Y- Y# F
    4. 轻量级神经网络算法目录4 M! y& T0 l1 n2 \
    4.2 SqueezeNet0 V; W7 ?6 D" O: V
    4.2.1 问题分析
    & E6 |/ |3 T# z: @% S4.2.2 SqueezeNet的三大策略" y& g3 J) v* U# E! L; \5 ~0 r8 }# L, ^
    4.2.3 Fire模块
    3 G: R# V8 ?/ d5 U7 b- F# v4.2.4 SqueezeNet整理结构
    7 R2 s1 Q6 S' q5 L4.2.5 代码实现SqueezeNet1 ?1 A7 U/ _% \7 O% W: v$ I
    4.2.6 其他实现细节
    7 f  \" L. z) s0 U3 e+ n4.2.7 总结  D8 [0 L& x8 H% _
    4.2 SqueezeNet* [) `1 Y6 b8 E. Q0 F
    4.2.1 问题分析$ n; z# Y, y# e7 W
    最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:, E# b4 b1 z6 f3 s* Y3 W

    9 \" b$ V- t2 R; w! Q. E在分布式训练期间,较小的CNN需要较少的跨服务器通信; Z% x* L2 s2 g/ N' U! C% L
    在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
      s- c1 N9 u0 i, l, _较小的CNN更适合部署在FPGA和其他内存有限的硬件上% Q+ P- Z$ X' N1 n) R6 C
    为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。" a& K+ ~* P. _1 ?! M) S3 Q- r8 S

      w- }6 _4 R: S4 W% d; I1 \4.2.2 SqueezeNet的三大策略
    9 e! ]$ k8 |4 d2 @/ j策略1:用1x1卷积代替3x3卷积" S6 U+ w" M* J7 N
    1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
    0 U5 T3 q* Z8 e& Y) C4 G, j
      x: R/ l* w+ V& D; u& ~# ?( J! Z策略2:减少输入到3*3卷积核的通道数量
    $ ?  x7 H( `6 s9 ^对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。, c+ c' j, m) A+ u3 g
    % R9 N  r) g7 l% K' j- S
    策略3:在网络后期再进行下采样,使卷积层具有较大的激活图, N; t  M3 U: R; z: s: a( m/ E
    这里的激活图(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中。
    . g; |9 P6 o5 g+ p! T- c) V. T
    * L$ M5 U4 c% R) B0 v& f4 G+ M策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
    , L- y, H4 ?$ v& c! K! V* t3 q$ x) S& p$ K( C
    4.2.3 Fire模块% e* K$ _% U  T" X
    为实现这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的想法。
    ! X$ L3 c( [* v2 Z
    8 u  ~& c/ ]0 t/ x5 y" i
    4 c) _) h; z2 I4 i0 w4.2.4 SqueezeNet整理结构% b1 m2 R7 t4 Z' [& Y
    SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
    " Z- u1 E. X1 h1 r& A1 F- e. ?7 k' h  F9 X' B! A
    9 `$ G) U$ t7 q1 ~
    4.2.5 代码实现SqueezeNet
    : |0 T: N, ^# XFire模块的代码如下:
    , a- r* ?1 @. s! k" L* I0 @
    ( e3 C4 n% r" B& ]* v% d6 Z+ dclass Fire(nn.Module):
    / N5 @( o& k5 J6 Z+ f( T- s  K# k
        def __init__(
    , N* a3 g/ s! g% n& v& m, g% {7 G        self,
    + ?0 ^2 _6 Z; F0 A        inplanes: int,% D8 ?9 B$ O4 W+ |; p& l- {
            squeeze_planes: int,
    . K" t5 h7 I: P& X( N3 k% b* F        expand1x1_planes: int,9 e; \2 E$ l7 x& |9 |4 b, }
            expand3x3_planes: int
    - u$ q: q/ E8 i( r0 E7 b! c$ z  i    ) -> None:  I/ ~( C5 B/ E: O
            super(Fire, self).__init__()
    ! U1 C/ Z0 @; Y5 c) w- d5 b9 t        self.inplanes = inplanes
    3 m% e, \2 u* J/ P        self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)! V( x7 _# Z! J. j) I9 \$ y1 ?$ m
            self.squeeze_activation = nn.ReLU(inplace=True)
    # z3 q3 E- ?" V5 `6 W; S        self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,% b( ^$ ]- X- m
                                       kernel_size=1)
    + S  z; w: d/ M9 R0 V0 b        self.expand1x1_activation = nn.ReLU(inplace=True)2 p( j7 B; {  g& V
            self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
    $ |% v3 O7 [8 d& q                                   kernel_size=3, padding=1)
    8 E) ^7 b6 R2 d4 S        self.expand3x3_activation = nn.ReLU(inplace=True)
    & U9 C: g% g1 Z1 y# L* O; m2 u- n  W/ v0 _  F1 [( n; l7 x' ]: T6 B
        def forward(self, x: torch.Tensor) -> torch.Tensor:
    ( g( F$ v. Y, e) M# ?9 z        x = self.squeeze_activation(self.squeeze(x))
    % H" O- A+ B' J3 m5 y        return torch.cat([
    # j: ]. I9 e4 I5 H. n            self.expand1x1_activation(self.expand1x1(x)),/ J/ j( m2 a* h8 ^0 E9 e
                self.expand3x3_activation(self.expand3x3(x))) |) z4 {1 P+ I; P
            ], 1)0 O2 b$ ~5 F& g7 _
    0 b/ g! B# B, L, s& ?3 Y6 }6 N
    1# Z  l6 a4 g2 O" n6 K; v
    20 u( I+ I* F1 l
    3
    / N$ {% l4 a+ V- y( ^. t  x4; V% y( f0 x+ L; V: M& F7 Q4 z+ G
    53 V7 B; u+ z8 N& J# @9 @5 Z/ C
    6: g. J3 Y+ w. n7 ^
    7
    % k9 E) P) x( Q! }) `* K% b8; Y& H6 p8 @  i3 @8 ]
    9" }2 Z7 U0 C# `- g9 _) E
    10# Z/ s1 l" S/ P
    11
    ( i- H+ E6 A; `12
    ; x. z2 y4 }$ k/ O) Q( |8 i13
    7 x$ M; J: {5 P' P2 i14
    . U: A; ~0 x0 h155 F5 @4 T" f5 o6 l1 Q
    16
    * ~1 B1 B2 x" V7 x+ T175 {1 H, [! T+ H( ^! {, y( W8 ^
    18; I% n) h) ~, V# I8 J  f& P* B
    19$ t( p) n. x5 T' ?
    20
    8 K) [! G' A, R$ b$ i6 Y21. ^& E6 ^4 s" v* i
    22# v( _8 R# _8 ]! }, _
    23
    # G3 c- {9 Y" \2 D& V: ~- f24
    / V! T! x/ `" A1 H' b25
    7 u! u! d7 I7 ~26
    * q0 Y+ ?. e2 a+ H/ D- e9 ~SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
    % Q; F; e$ h0 [  `8 ?& ^. g: D% M
    - Q$ ?8 H+ t4 i" V% V7 d' n6 YSqueezeNet1_0的网络结构如下:
    $ S- u6 t0 J4 _8 C6 e& X# U8 @- _& w7 A* `: T2 S- O
    self.features = nn.Sequential(
      c" J2 {* Y3 p! h" I" B9 ~    nn.Conv2d(3, 96, kernel_size=7, stride=2),. j7 L. d$ \8 ?6 F5 W: a
        nn.ReLU(inplace=True),
    ) [% J& M8 y4 {# x  q# d    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),. E* R& {  l+ S9 r) b( s/ x
        Fire(96, 16, 64, 64),, q+ x( [  ?: K- B. R6 |$ j: \
        Fire(128, 16, 64, 64)," P& ]' u8 J- K& K
        Fire(128, 32, 128, 128),
    7 ^, @. |8 a" h; U: B2 m: ]    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
    . J( O$ T) V1 i    Fire(256, 32, 128, 128),' A4 |. Y( ^( v! i5 q0 s
        Fire(256, 48, 192, 192),
    . C* V0 S1 r! s& q: ]2 Q" J6 {    Fire(384, 48, 192, 192),
    1 [3 P! |, G" w9 w" ^    Fire(384, 64, 256, 256),9 h$ w! t3 X3 f- H* ~
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),& g( T4 [% t. O, c. L; e% U
        Fire(512, 64, 256, 256),7 X8 D7 H6 q5 k7 ~2 o( `
    )6 b# P+ F9 f. P" K' w
    final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
    0 n1 x. q! x9 }! t* b$ dself.classifier = nn.Sequential(
    # K% p0 e! E2 D. c; e3 b0 u    nn.Dropout(p=0.5),
    ' k1 m8 t; |2 z% F    final_conv,
    7 w/ P, p/ e( s% ?( P    nn.ReLU(inplace=True),/ ~4 }6 T' ]' |
        nn.AdaptiveAvgPool2d((1, 1))5 g. X/ O- N+ C
    )
    , P$ H* P) V/ {. R8 W) B  H
    : O" d1 S$ N2 p4 W" L& r1 i; P) a
      D' \9 O+ \; e8 y+ B1
    + ?, x, e: H5 x8 K2
    ' g7 N# p: \. x* |( J37 l5 F6 Y# X, [$ n7 B; I
    4, U2 |' ^- l4 c  }; Y" ?! {# S
    58 d9 q' U0 i8 G* w( Q5 b
    6* U3 ?: ?, M4 D3 X8 i, m( P
    7* k9 v$ ?% A2 u$ m" y6 T
    86 k4 p  K  S, u
    9
    0 j6 w  I( U; I2 q8 O. Z$ l( d10
    " n7 C  ]1 N2 v3 z- w! U11
    - n- H( |1 w1 C- R8 Q6 ]$ v12( A1 S% D6 i) p! E: _4 G  V
    13% g" z) b: K" r) X% x4 w
    14
    ) U, K0 z' ^0 j15, e+ [- @/ A) n! [) [% w
    16
    0 F  D/ l* c0 x" h7 ?. ~; V17- r2 N. s. i- r1 t4 P4 b) P
    18
    & [' y7 _0 m% T' q19
    - @8 Q) F6 u  v20
    3 t. r5 M" l2 H7 d/ }5 i21
      V  {7 A: j% I" K7 U22& h- ~: [, w4 J$ v4 ]8 \! `
    23) ^  v9 A) U2 A2 e2 B- A3 Y
    SqueezeNet1_1的网络结构如下:* L& ^; t4 B) i+ ~! u' k/ E9 B

    / T( n* |0 c' Vself.features = nn.Sequential(
    9 h0 F7 @: v; F; X. e, U    nn.Conv2d(3, 64, kernel_size=3, stride=2),
    3 n* k1 c1 |$ A    nn.ReLU(inplace=True),7 Q$ t5 h: c9 t$ R& J* [
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),. o) b( z, D5 W# ^: J0 p
        Fire(64, 16, 64, 64)," r2 X& b. \8 a: C* R( q
        Fire(128, 16, 64, 64),
    * C. |+ o: m( F, a    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),* u: b8 V& X% U2 v4 b
        Fire(128, 32, 128, 128),+ @, j  Z$ z# j2 I7 T& @, [
        Fire(256, 32, 128, 128),( h6 m- B' C. \- I* W
        nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),0 i- n, w) n% j+ M0 {+ q# v% N
        Fire(256, 48, 192, 192),
    7 s1 h, O# T  E" |4 l    Fire(384, 48, 192, 192),4 D- k: k& R) w, K1 s7 V
        Fire(384, 64, 256, 256),8 ]" u* k5 j3 j5 i5 s# u- I6 m. y$ F  I0 Y
        Fire(512, 64, 256, 256),9 L0 M; ^3 ?, }
    )
    ( P( U1 t5 K, T7 {6 Gfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)0 g; T3 g8 Q  S6 x$ R$ f: _
    self.classifier = nn.Sequential(
    ! Y! n; z: a5 [. P. T* q    nn.Dropout(p=0.5),
    & h1 }; |; |( @- K; f7 @! S    final_conv,. q& i0 v$ e( U5 }5 x
        nn.ReLU(inplace=True),
    . }7 O0 }* b: i" z    nn.AdaptiveAvgPool2d((1, 1))
      R( C' B3 N* U$ I  ]; \; r)$ Z: t! S9 Q, A4 ?
    $ E8 L9 t! \$ b: ^* R. L9 j" j8 f
    1( G; o+ K6 U2 N* |9 Q( J) @
    2
    9 U: a) Y, X# Q0 B+ M; i9 C3
    : D9 A1 Y6 h1 e" V3 ~  Q4
    * J4 H# {% e: J& z5
    / A% `2 A" {  r0 X64 C4 J9 U2 [8 L6 f
    71 ~0 z* h8 X% V5 f0 O1 w
    8- n* g& H0 f7 K
    9
    ; q! F, i$ N( j& y10, p; Z, g$ W% |: a
    11
    ( }" V9 j5 u- k2 Z12) C8 i. L1 B% x* o0 W
    134 M6 e6 D1 q9 L" d% }! A- W* }3 W
    14
    . h4 T  r5 |  B8 K/ r15# [' e* x, ]  C
    16
    / F' |, \7 U/ Q- d1 K! ?177 f; p+ _  [5 k% B8 D; N
    18- J, G0 I& b/ P& ~. T7 L- H& K3 X
    198 B5 O% p& H# ^2 [. H3 a
    20
    % T3 V0 N& _, j  o  e21
    # j5 h4 r1 ]; q1 |22
    0 @1 \7 ]3 p8 j1 E/ y2 O4 c3 ~SqueezeNet各层详细参数量及其输入输出如下表所示。, E2 Q" H) z9 i- G; `" d) U
    7 j! _& f+ b$ B5 V2 I
    9 Y* C9 Y; |1 m3 ?" w: t5 ~: _. s
    4.2.6 其他实现细节4 n5 L, h+ g* Y& @5 O, k  ^
    1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding) P9 r7 K% o! o- i& b, `
    squeeze和expand层中使用ReLU2 K9 Z) T) t1 s
    在fire9之后的layer中使用ratio为50%的Dropout# d5 o5 X. W+ {8 i4 |8 h9 R6 r; Z" Z
    参考NiN算法想法,SqueezeNet中不含全连接层
    & s; f" F2 [9 N) F' r1 T0 t训练时,前期学习率设置为0.04,然后线性减少
    & E5 C" m2 l- a5 ^7 g; p; [4.2.7 总结
    " S! ~& A7 O9 k* S; ?( b& c& Q: u  c: g本文最主要就是三点:6 {5 f$ `- b  \" N; @

    # u' K* i4 p2 ~4 F6 |用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
    3 ?1 V7 Q% x% A7 s- d" t# L4 i减少输入到3×3卷积的特征图的通道数,减少参数量& D$ w* X5 M6 U
    不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率9 ^9 l' S+ `  e$ p1 v! {/ g. l
    ————————————————
    : e1 o# L0 ~- r) p; L版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    $ ~) `9 x" R. \8 m6 \1 @6 f* q原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100$ \3 Q4 W9 K& O  ?, z0 n
    5 L' Q, T- S6 C9 ]6 b7 ?; B
    ; r# F6 g, _: 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, 2026-7-30 11:21 , Processed in 0.507017 second(s), 50 queries .

    回顶部