数学建模社区-数学中国
标题:
轻量级神经网络算法-SqueezeNet
[打印本页]
作者:
杨利霞
时间:
2022-9-5 16:42
标题:
轻量级神经网络算法-SqueezeNet
5 |8 U8 ^7 @3 p8 H0 T! [/ E4 a
轻量级神经网络算法-SqueezeNet
a& v* R ?7 W6 q" r
4. 轻量级神经网络算法目录
. k) e6 [% I# Z& k' h) V/ C3 h
轻量级神经网络算法
+ G$ M' K7 U) b6 Q' N) _ D! r
4.1 各轻量级神经网络算法总结对比
- f% [: [! ~) |) k1 s# s! O8 i
4.2 SqueezeNet
- P9 f1 @9 ?/ A0 G: v: K3 B
4.3 DenseNet
0 S' G7 G8 `% x6 C3 Q
4.4 Xception
3 Z+ Z. v9 Q6 S$ G
4.5 MobileNet v1
6 D0 @' Y! Z9 s
4.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+ Z
4.10 SENet
8 }8 `$ q- ]6 q, c+ J6 l
4.11 ShuffleNet v1
# q5 d! P, \$ l
4.12 MobileNet v2
% S0 L6 |# f( V9 j9 k5 C' }
4.13 AmoebaNet
8 I" C0 t- Q5 L) M0 T3 k
4.14 IGCV2
8 ], L( I9 r6 v* @2 p
4.15 IGCV3
- ^7 }) E6 d/ P/ G* [0 m
4.16 ShuffleNet v2
$ ~5 L% |+ _, G) G& }8 W
4.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/124005405
7 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) f
4.2.2 SqueezeNet的三大策略
2 c M$ r0 |1 P; K. b
4.2.3 Fire模块
4 v( v) i- l* r5 w' b
4.2.4 SqueezeNet整理结构
$ g/ x4 O/ w2 H ]+ y7 f1 w
4.2.5 代码实现SqueezeNet
6 K' g( G! @- c( l3 N, O6 n
4.2.6 其他实现细节
$ y: H6 k0 b. \
4.2.7 总结
7 e! _5 |# G k; O
4.2 SqueezeNet
6 ?" 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/ L
1x1卷积核的参数比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 v
4.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 D
4.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 代码实现SqueezeNet
9 v1 t. t& t6 m, l. n4 j6 x& }
Fire模块的代码如下:
6 t8 w) q0 h2 ^: J& D
5 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/ ^ a
2 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. T
2
3 S ?4 j" I* w9 w
3
- x9 p* T; P! T3 d9 q
4
) ]% ^- K: n3 T6 M
5
7 X. q+ N$ f( N7 O# ]5 z0 N# x
6
1 y% B3 w% f9 c5 J
7
$ }$ L. \. p Z9 S6 o1 T
8
0 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! j
11
* L& M+ w7 r1 T! _ `3 g: k# w
12
5 W# p) u7 n' x4 i
13
+ T% g; L( ^, `; p/ d9 C O8 t
14
( E ~& O, L1 `' y# d6 U% U6 }
15
- { P! \: J. `& K4 @7 Q8 G4 P* l
16
- o# ~8 N3 i& Q
17
/ g3 z* h9 o" o# k! d% o
18
. [, @2 N# J! H3 H
19
6 N. c6 r8 |* D. f* R$ ~
20
( @: e6 ] S3 l" t |4 B, f
21
1 n# C6 E& h m
22
6 i7 Q/ J$ y, x6 W e+ R+ I# @
23
3 o, `! l8 P% N, ?/ d0 N
24
& v2 _" \ U; h0 i! y- j
25
2 J/ T/ a9 M4 |4 [, s" \
26
# y* N3 Y% _$ V. R( L: i1 Y
SqueezeNet主要有两个结构,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 A
SqueezeNet1_0的网络结构如下:
# \" x/ ^' ~) s9 D
. c" M5 p3 w7 c0 Z4 v+ ~) T: Y! u' _% ^6 v
self.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" w
final_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# E
2
5 P, ?. j. a1 c* d* I7 u
3
$ 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 a
6
* H: e' W8 l/ p, J, Q1 i( ~# P1 w
7
0 C; E/ S1 J! g o2 X6 P: P# M F
8
! H8 D5 |( g2 P* T3 r% q
9
" m9 e+ @: G& F: H$ {! m5 G z
10
S9 a" b( c9 u) {. d3 K
11
: \8 o* P& K/ L
12
& D. h1 R) E3 ?+ S) n u
13
& 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 J
18
. F, V7 T2 k, i$ A
19
7 m* b8 r8 ^* s1 Y$ R
20
% I" @, X: H* y
21
9 }! M& f9 d* S2 `; S. {" h; [
22
! }! ]( M% i! U: p4 I
23
/ T: K! T# Z1 C
SqueezeNet1_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
2
7 k, x/ ]. \( p1 K. D! k
3
! d& ]2 F" \0 _" e) b" `
4
$ T5 M: z# |3 ]7 e
5
9 T; h0 t9 r. C2 s. N. [$ k4 B
6
z9 I1 s" J8 s8 V( t8 u6 H
7
: 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, R
10
. K: X7 i' ~0 }+ B
11
0 u: B$ {7 J# t& c$ \
12
5 g* f- u, m/ v5 }' W
13
~2 q2 X( ?% a: ]' V
14
' a9 x8 u; V) S. x
15
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# N
19
( d/ b7 e' J% o' |& w+ l
20
2 J v# S- G$ t6 ~, c
21
% S5 [2 C0 S4 T/ b
22
& g4 ?7 q T ]4 x3 D9 u* ^, ~/ P
SqueezeNet各层详细参数量及其输入输出如下表所示。
+ j1 Q( t7 W3 M8 v3 W3 `4 p
, O1 s9 \7 i; Q7 W! [. P
4 ^8 N- M6 U, F# E( u
4.2.6 其他实现细节
` M/ ]- l; a) Z: Q
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
& P" m1 ^) ^% q$ D0 c7 W( \2 Z& U
squeeze和expand层中使用ReLU
0 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* _, y
6 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/126498100
9 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