数学建模社区-数学中国

标题: 轻量级神经网络算法-SqueezeNet [打印本页]

作者: 杨利霞    时间: 2022-9-5 16:42
标题: 轻量级神经网络算法-SqueezeNet

5 |8 U8 ^7 @3 p8 H0 T! [/ E4 a轻量级神经网络算法-SqueezeNet
  a& v* R  ?7 W6 q" r4. 轻量级神经网络算法目录. k) e6 [% I# Z& k' h) V/ C3 h
轻量级神经网络算法
+ G$ M' K7 U) b6 Q' N) _  D! r4.1 各轻量级神经网络算法总结对比- f% [: [! ~) |) k1 s# s! O8 i
4.2 SqueezeNet
- P9 f1 @9 ?/ A0 G: v: K3 B4.3 DenseNet
0 S' G7 G8 `% x6 C3 Q4.4 Xception3 Z+ Z. v9 Q6 S$ G
4.5 MobileNet v1
6 D0 @' Y! Z9 s4.6 IGCV
) u3 X2 P3 J: |4.7 NASNet# @9 n  r5 j2 P+ f
4.8 CondenseNet  K/ r3 w; ]; p8 b+ {$ W4 h
4.9 PNASNet
, J5 G3 v, n& z+ ~4 O" t+ Z4.10 SENet
8 }8 `$ q- ]6 q, c+ J6 l4.11 ShuffleNet v1# q5 d! P, \$ l
4.12 MobileNet v2
% S0 L6 |# f( V9 j9 k5 C' }4.13 AmoebaNet8 I" C0 t- Q5 L) M0 T3 k
4.14 IGCV2
8 ], L( I9 r6 v* @2 p4.15 IGCV3- ^7 }) E6 d/ P/ G* [0 m
4.16 ShuffleNet v2
$ ~5 L% |+ _, G) G& }8 W4.17 MnasNet" K4 e! B0 v9 c
4.18 MobileNet v3
& z1 c% `/ O; V3 o0 r深度学习知识点总结
& C* H: X" t7 G) n# I
% C, v) \" g, i; L- a专栏链接:5 C) f0 B( S1 s# c% i
https://blog.csdn.net/qq_39707285/article/details/1240054057 p" u, X4 t8 P! b: X
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
4 Y1 q4 H2 U2 N3 E) l
7 m. q! J; [, S, `$ ]$ L* Q8 H本章目录
: q% \$ J) Q& E. {4. 轻量级神经网络算法目录5 G8 V# l9 B7 v$ X# a2 b1 g
4.2 SqueezeNet# n. F& ^9 S: g# S% E7 K6 _) L
4.2.1 问题分析
3 o6 C2 P/ a8 s5 I# k) f4.2.2 SqueezeNet的三大策略2 c  M$ r0 |1 P; K. b
4.2.3 Fire模块
4 v( v) i- l* r5 w' b4.2.4 SqueezeNet整理结构
$ g/ x4 O/ w2 H  ]+ y7 f1 w4.2.5 代码实现SqueezeNet
6 K' g( G! @- c( l3 N, O6 n4.2.6 其他实现细节
$ y: H6 k0 b. \4.2.7 总结7 e! _5 |# G  k; O
4.2 SqueezeNet6 ?" H5 l7 i- m  J) R' H
4.2.1 问题分析
& ]5 [0 O! {& M最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
8 p2 Y2 p. W, \. I+ h4 D5 T& P
7 B% ^" Z: a; G. R5 T$ e在分布式训练期间,较小的CNN需要较少的跨服务器通信
) v6 m8 _% L9 Y/ x, \8 n! {在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入) Y* Z3 t( O6 k
较小的CNN更适合部署在FPGA和其他内存有限的硬件上
( N1 k( D+ H6 y5 r为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
$ m- g+ o6 Q5 `1 n4 N( N% ?% T( @- |1 W( y2 m* n# Y" ^. f/ {
4.2.2 SqueezeNet的三大策略$ a/ f2 r. f4 t0 K
策略1:用1x1卷积代替3x3卷积
" ?+ ~5 ]9 L( e4 F/ L1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
" _4 y$ f: g  }
5 o: a, A. F; r4 ~% M  U策略2:减少输入到3*3卷积核的通道数量
. Q; p9 I/ y. z0 H& R对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
+ m; @" \9 C1 l
7 z( B/ l/ q) T6 o; }  ]! R策略3:在网络后期再进行下采样,使卷积层具有较大的激活图) Z1 H. ^# @6 G; E2 ~* c$ N
这里的激活图(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中。" d4 Q7 b, b$ H- p# {

0 n# M; d/ _3 C策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。! V6 U9 b0 U) @5 k8 b( n

# }  h- x) m9 [8 v4.2.3 Fire模块
' V$ G% h5 B4 l4 k5 a, b4 f为实现这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的想法。+ V. [4 Y) N; S# b$ M- i0 |
# j! R( v3 T; s# z

8 P4 A6 N  S& s4 w$ g- u/ {0 D4.2.4 SqueezeNet整理结构  C  J: p2 b+ N$ z& \" G
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
+ J5 q2 c' I; P) Z5 G: F/ w0 h, v3 B8 b

, S2 X" i6 K6 C, v% l$ q& `4.2.5 代码实现SqueezeNet9 v1 t. t& t6 m, l. n4 j6 x& }
Fire模块的代码如下:
6 t8 w) q0 h2 ^: J& D5 n/ N/ ^# Q" t9 i& Q( A; v! N# C
class Fire(nn.Module):
. L3 ?8 d, D6 ^
* \6 R( z! \' _    def __init__(
' l$ Q/ ^. w, T# h0 W% d        self,
: d" H. N! ~1 f7 g        inplanes: int,/ h, i( x. Q4 J; i
        squeeze_planes: int,
: d* Y( N" }# Y4 Q" m' w4 x        expand1x1_planes: int,
+ A- H1 k4 A" C7 @+ b! b        expand3x3_planes: int
2 Q6 r0 W. \- X1 m( e  T    ) -> None:1 K7 ~- h' y- V# {* R' `5 @8 z
        super(Fire, self).__init__()* `( U: F+ d( ^8 `6 F- i- c
        self.inplanes = inplanes
! X% e7 L9 M- `2 ]        self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
; J# z' W9 Q/ L& Z3 [, y        self.squeeze_activation = nn.ReLU(inplace=True)2 |- v+ i& G% e' \5 p" ]) T, x
        self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,6 K( q  S- r. m" D
                                   kernel_size=1)4 j" c' U" G3 @4 [( J6 H' r
        self.expand1x1_activation = nn.ReLU(inplace=True)
8 X6 U% V6 p1 B' H% e+ z        self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
, u" `- F8 O( ~' {+ I6 o& k                                   kernel_size=3, padding=1)' M$ t( t/ Q4 V0 v
        self.expand3x3_activation = nn.ReLU(inplace=True)
5 `* {' G# F% A& |" ?1 a/ ^  a2 B5 k! g: s( i0 K
    def forward(self, x: torch.Tensor) -> torch.Tensor:- ~8 c1 z& X& }5 D
        x = self.squeeze_activation(self.squeeze(x))
/ b" m) L! N3 l% D% E: E0 z        return torch.cat([
7 g0 {* S0 k% j! ]            self.expand1x1_activation(self.expand1x1(x)),
; E8 L( u( N6 l# L: I; `            self.expand3x3_activation(self.expand3x3(x))2 ^# D3 ?* {6 K! C( D
        ], 1)
" g2 _1 l2 P# L# m) i, t; d7 E8 ~$ p2 O, h
1
7 I  A& H& ~. \/ O! }# N8 q# U. T23 S  ?4 j" I* w9 w
3
- x9 p* T; P! T3 d9 q4) ]% ^- K: n3 T6 M
57 X. q+ N$ f( N7 O# ]5 z0 N# x
61 y% B3 w% f9 c5 J
7$ }$ L. \. p  Z9 S6 o1 T
80 j3 O4 O  f( c2 x' x2 B
9. X! Z, W& o& O: C+ R8 q# _
10
2 J( @1 F8 v9 ?0 Z. q; ]( w! j11
* L& M+ w7 r1 T! _  `3 g: k# w125 W# p) u7 n' x4 i
13
+ T% g; L( ^, `; p/ d9 C  O8 t14( E  ~& O, L1 `' y# d6 U% U6 }
15
- {  P! \: J. `& K4 @7 Q8 G4 P* l16- o# ~8 N3 i& Q
17/ g3 z* h9 o" o# k! d% o
18. [, @2 N# J! H3 H
196 N. c6 r8 |* D. f* R$ ~
20( @: e6 ]  S3 l" t  |4 B, f
211 n# C6 E& h  m
22
6 i7 Q/ J$ y, x6 W  e+ R+ I# @233 o, `! l8 P% N, ?/ d0 N
24
& v2 _" \  U; h0 i! y- j25
2 J/ T/ a9 M4 |4 [, s" \26
# y* N3 Y% _$ V. R( L: i1 YSqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。: Y- p2 V& Q; _6 l# c  T

: q+ e7 k. R0 ASqueezeNet1_0的网络结构如下:
# \" x/ ^' ~) s9 D
. c" M5 p3 w7 c0 Z4 v+ ~) T: Y! u' _% ^6 vself.features = nn.Sequential(
* w; q. [+ J& ^6 _- N    nn.Conv2d(3, 96, kernel_size=7, stride=2),$ Z4 ^( Q6 A) X# b  r' ~0 T- G
    nn.ReLU(inplace=True),
& {  w- o6 i& w" h& J    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),+ {/ c7 l: \5 n0 z
    Fire(96, 16, 64, 64),3 o) D0 l9 N5 p, z
    Fire(128, 16, 64, 64),
* Y' `. U( L2 ]. z, W    Fire(128, 32, 128, 128),
+ [/ M1 B5 Z2 r    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
3 @9 W4 T1 [$ p; _" b    Fire(256, 32, 128, 128),
1 h! n1 `+ a+ q$ G& d    Fire(256, 48, 192, 192),2 K! d8 }4 |7 |- P
    Fire(384, 48, 192, 192),+ G$ t1 u  d/ X* l$ d
    Fire(384, 64, 256, 256),# g, W  e% t0 u) `3 `" A
    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),& u8 ?# \/ Q$ Z. M. B& R# P. B2 L# o
    Fire(512, 64, 256, 256),9 _8 c/ I6 f' h6 T, A& f
)
' t: v4 l3 x+ w7 Q1 ]1 Q" wfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)& v4 x7 _5 n6 k1 _4 j% _# u1 g
self.classifier = nn.Sequential(  i7 H7 k$ W4 k# P
    nn.Dropout(p=0.5),
! L' s+ b+ ?4 V4 `, r: N    final_conv,
3 o( w8 j0 G- I2 W1 i    nn.ReLU(inplace=True),% G/ a; l$ f% q- R! ^
    nn.AdaptiveAvgPool2d((1, 1))
! q2 P+ c5 J5 c)
+ o/ j: Y, M" o6 r. M' n
) H0 e: d6 |, J. S6 [: p# X# ?* t. Z" g! D' p# m- |3 b
1
. y$ L4 z( i+ E% ]3 Z, d# E2
5 P, ?. j. a1 c* d* I7 u3$ y  \# C3 w  d. C  w) }3 z2 }
4
! N, ^9 R' Q6 z7 D7 s0 L5 c2 @5
  ^* E) Y! o% f& L! _6 M7 a6* H: e' W8 l/ p, J, Q1 i( ~# P1 w
7
0 C; E/ S1 J! g  o2 X6 P: P# M  F8
! H8 D5 |( g2 P* T3 r% q9
" m9 e+ @: G& F: H$ {! m5 G  z10  S9 a" b( c9 u) {. d3 K
11: \8 o* P& K/ L
12
& D. h1 R) E3 ?+ S) n  u13& q9 y; e/ V% F6 b( {
14: W% Y) w% K* G3 @
15
0 _; U9 y: t0 x- @16& g, W- Z6 S$ F5 a8 D3 q) v
17
; c, I) U( a, Z* q7 J18
. F, V7 T2 k, i$ A19
7 m* b8 r8 ^* s1 Y$ R20% I" @, X: H* y
219 }! M& f9 d* S2 `; S. {" h; [
22
! }! ]( M% i! U: p4 I23
/ T: K! T# Z1 CSqueezeNet1_1的网络结构如下:7 I. N! F4 R* w, E  t% Y7 l* b. ~
6 h! x  s$ k9 O2 R% a  O. T
self.features = nn.Sequential(. V" z  f0 i- o' x6 M/ P2 l0 m8 Y: `
    nn.Conv2d(3, 64, kernel_size=3, stride=2),
: V2 N# T  _& D% r3 [9 b$ J$ U    nn.ReLU(inplace=True),. d* l3 h* F& E3 I$ x; n/ ~' l
    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
* F  p- Q$ ^" X    Fire(64, 16, 64, 64),. _" l6 a$ k8 E
    Fire(128, 16, 64, 64),
8 b$ k' T2 a7 V- ~0 G7 N    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),, u+ d, F4 `4 m4 U- C) S1 a: f7 I
    Fire(128, 32, 128, 128),
1 I7 [* k+ H6 P; _5 Q9 N: [    Fire(256, 32, 128, 128),3 F8 l; I" P# o$ n
    nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
4 L; E. V2 c) L    Fire(256, 48, 192, 192),
8 c4 b' `1 O3 Z9 e    Fire(384, 48, 192, 192),
- O' a& @8 t  Q1 m$ P    Fire(384, 64, 256, 256),
2 F5 ?2 A! Y; G+ u" ^    Fire(512, 64, 256, 256),
, m" c# `) i1 p1 `6 j)9 @, Z. N/ A3 O* A! {9 ~
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)" `) b5 M" w" v: j2 D. w9 e
self.classifier = nn.Sequential(
* Q  N' _% j2 \* a9 p6 S    nn.Dropout(p=0.5),
: B, l% K; T6 w8 R# m    final_conv,% y1 \3 ?% i1 |5 n& ?; S# X- _
    nn.ReLU(inplace=True),. i4 q' x: [% t1 e; p% @$ ?
    nn.AdaptiveAvgPool2d((1, 1))
' H5 p% R2 E2 K)1 l' h% K9 s. {' O* o6 A! S1 z: p- _
5 V: ]. G1 k2 m; G7 P! |3 d
1' K8 L( q, M: I5 X, @1 f( L
27 k, x/ ]. \( p1 K. D! k
3
! d& ]2 F" \0 _" e) b" `4
$ T5 M: z# |3 ]7 e5
9 T; h0 t9 r. C2 s. N. [$ k4 B6
  z9 I1 s" J8 s8 V( t8 u6 H7: m6 R  t- x9 b% N; w' f8 p( P
8' x; \" a2 R: y3 X- V/ k- v) a
9
( I% j6 O* s0 w, R10
. K: X7 i' ~0 }+ B11
0 u: B$ {7 J# t& c$ \12
5 g* f- u, m/ v5 }' W13  ~2 q2 X( ?% a: ]' V
14
' a9 x8 u; V) S. x15  f  ?5 V3 X. ~9 e% S: k
16; Q3 I, t4 `6 i! s% R5 a
17" \6 F9 m" R6 V. @2 z1 W
18
. R( D: m: J8 A# N19( d/ b7 e' J% o' |& w+ l
202 J  v# S- G$ t6 ~, c
21% S5 [2 C0 S4 T/ b
22
& g4 ?7 q  T  ]4 x3 D9 u* ^, ~/ PSqueezeNet各层详细参数量及其输入输出如下表所示。+ j1 Q( t7 W3 M8 v3 W3 `4 p

, O1 s9 \7 i; Q7 W! [. P4 ^8 N- M6 U, F# E( u
4.2.6 其他实现细节
  `  M/ ]- l; a) Z: Q1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding& P" m1 ^) ^% q$ D0 c7 W( \2 Z& U
squeeze和expand层中使用ReLU0 I3 P( O6 H- n% Y; z
在fire9之后的layer中使用ratio为50%的Dropout
, L7 m2 H4 d" r参考NiN算法想法,SqueezeNet中不含全连接层2 H1 T. o' w. P) s( E
训练时,前期学习率设置为0.04,然后线性减少# I. l: g$ i: e' P
4.2.7 总结8 q3 ~+ N  F' Z4 T4 A9 a
本文最主要就是三点:
: R7 r- h1 P) k! V& U* _, y6 Y) E( Q5 ^- w6 t7 d
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果4 U6 y" \  |2 o# Q, i
减少输入到3×3卷积的特征图的通道数,减少参数量
8 U- G1 x, N: u# @5 k6 C3 u不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率- y, _' L% p& d3 C+ {8 Z3 Z
————————————————: f2 @, h' h1 j9 o& D! o/ B
版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
. w- ~3 U2 W8 y' n6 \原文链接:https://blog.csdn.net/qq_39707285/article/details/1264981009 p2 f7 c# ?9 r4 [' M0 Z4 u& j

& L% V9 ]7 E  V5 l) U& J# C) Y
) E3 Y" u$ c# I6 y& h




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5