数学建模社区-数学中国
标题:
轻量级神经网络算法-SqueezeNet
[打印本页]
作者:
杨利霞
时间:
2022-9-5 16:42
标题:
轻量级神经网络算法-SqueezeNet
8 x+ U7 p$ u" ^
轻量级神经网络算法-SqueezeNet
2 t; t) S; j# z- a4 {, b, a2 ^
4. 轻量级神经网络算法目录
* ~+ a$ V5 {$ p1 j1 t/ ~$ f" U, G
轻量级神经网络算法
* K* I U' k) W
4.1 各轻量级神经网络算法总结对比
; G! G0 T! A* \
4.2 SqueezeNet
, ?% G9 w- K U) g9 L- Y
4.3 DenseNet
; _2 }+ P6 \) q. W/ |
4.4 Xception
& L5 R) j6 W- C% J" h+ R" J- d; x i
4.5 MobileNet v1
3 E. V- t; \+ u! c+ a
4.6 IGCV
5 Z8 _; n7 R- h% J5 c( i3 {
4.7 NASNet
: U* X3 B, x6 ^6 N* d; D( r: U; m
4.8 CondenseNet
# Y8 u' [ B4 p, U& E3 |% ?
4.9 PNASNet
1 d# m0 \6 x8 A: Y5 r
4.10 SENet
) y" q; L. W2 x" j4 d4 o2 h6 I
4.11 ShuffleNet v1
; M" \5 |8 i6 w! m
4.12 MobileNet v2
/ n2 Y" F+ M5 c( s- d
4.13 AmoebaNet
9 T1 i/ S3 ~) K5 T, z, [
4.14 IGCV2
0 j3 m. p$ q& m# [1 g6 f
4.15 IGCV3
' Y7 g0 b; k9 `2 V& Y( Q
4.16 ShuffleNet v2
1 A8 n' X) [% t& [7 J9 i5 L5 b/ C
4.17 MnasNet
; \2 P4 R" {1 p! e* J
4.18 MobileNet v3
( |3 e: j0 n% V7 u0 F" c. ~1 m) _
深度学习知识点总结
* `, N1 D& A$ ]& r/ d
: @# e% ^! |- ~ @: U7 l0 ^
专栏链接:
+ T" z; \- a; H3 `
https://blog.csdn.net/qq_39707285/article/details/124005405
% [0 G/ j9 F2 p- @" r; c* s
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
* J( l: v, I# H
( P) L# N) u8 i6 [: c
本章目录
' O" n4 {7 d. Y0 c( ~
4. 轻量级神经网络算法目录
% Q& p5 o0 x- h) @4 D
4.2 SqueezeNet
" x$ J7 {6 t* Z
4.2.1 问题分析
& D7 @/ y$ J0 `! A8 @4 n/ c
4.2.2 SqueezeNet的三大策略
# x9 X/ S1 T9 q2 b- U; ~. W( D
4.2.3 Fire模块
b! D" U* z1 J
4.2.4 SqueezeNet整理结构
6 J+ V/ c# L1 N: O. b( j
4.2.5 代码实现SqueezeNet
4 p6 m; f9 A% W" m6 z3 ]+ j
4.2.6 其他实现细节
/ r; U9 u4 G) q, r8 m6 F, J
4.2.7 总结
1 }1 |0 Z, K2 L, M% ?& O, P
4.2 SqueezeNet
3 F. w# q" F3 Y# I# G' Q6 b
4.2.1 问题分析
( l+ ?7 p$ _0 Q$ G: [" r
最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
' O( m" c% s }
2 ~0 e; P0 c0 a; o
在分布式训练期间,较小的CNN需要较少的跨服务器通信
( V0 t3 H* I3 ]2 c3 m* k7 u& Q
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
4 Z) v: r$ D8 m" s
较小的CNN更适合部署在FPGA和其他内存有限的硬件上
' J& s6 y" S! q: ]9 e
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
8 @2 P# T6 Z" f0 {/ j. H, F, c
' s2 l( T+ O" v% {3 @+ k; }
4.2.2 SqueezeNet的三大策略
9 v% p5 s" \& x0 i
策略1:用1x1卷积代替3x3卷积
! C" E' Q% L9 u6 @7 y: x; s
1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
% I8 Y l: Z: M6 i Z% Q7 S
1 s, r1 ?! ?$ J) v
策略2:减少输入到3*3卷积核的通道数量
$ F y. q K6 a, p' T8 [
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
+ r( W' O0 i& g0 b& ~9 ?' _! M
9 w, h, E# `$ Y5 Z
策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
# o, ?, g' |1 y* e7 ?
这里的激活图(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中。
* U. h# u; U9 {/ E2 `6 s
4 z) _, z! g" A" C; W* x
策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
! }' V+ d" T! B' F2 T& a
' Q$ C, N3 u* _( F+ k: I; |
4.2.3 Fire模块
* _. Y* g! a* [4 G: E1 D; n
为实现这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的想法。
9 j9 w9 Z& [, v2 I) A" j
4 \% {6 |+ R6 n- M6 A
! U0 q A0 Z) }& ^3 a
4.2.4 SqueezeNet整理结构
$ t/ h& Y4 V7 m1 A
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
6 I) W% b5 W/ l% f2 M" }1 ], a
+ _0 M2 {+ B! [( ], p6 z: [+ y: d2 U
5 ]/ e8 L# R; z9 K1 G0 M/ o1 n1 y$ W) [
4.2.5 代码实现SqueezeNet
- c# D9 w6 D/ w n( B
Fire模块的代码如下:
7 [# \- `7 t/ V
0 X% n% Y2 |7 s; K; _
class Fire(nn.Module):
. O! b2 {- T" `( R4 L
) f1 e1 v0 @* c- ?3 _* u6 ^
def __init__(
: d$ Q9 T2 a' R e7 k# E
self,
5 G$ v4 Q3 i" ~+ w+ i
inplanes: int,
0 J* e1 a7 L0 N5 x$ A
squeeze_planes: int,
4 z9 T, f/ i% C& f [! c
expand1x1_planes: int,
& P3 ]4 d! G" N1 H4 E; o
expand3x3_planes: int
F% v$ _6 X" b* x) H# O
) -> None:
# E5 O! W) x# j. x
super(Fire, self).__init__()
/ n1 A1 f% f% r; A7 T
self.inplanes = inplanes
" f& N- } r, ?" o; N$ a
self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
- u5 p8 Q I. t; t$ ?- w, j
self.squeeze_activation = nn.ReLU(inplace=True)
, w" z' B& ?7 S- C' [
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
. L0 E! u# I+ r# t; C: H5 `- J
kernel_size=1)
, }% W6 X/ I6 E, @- E
self.expand1x1_activation = nn.ReLU(inplace=True)
( f1 T* q3 `+ m8 ]+ w
self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
* {3 `4 i: v2 H5 {
kernel_size=3, padding=1)
h0 b- ]) z' U7 J% u) T2 E
self.expand3x3_activation = nn.ReLU(inplace=True)
; Q. `) U4 \2 i, G4 p) g/ Y
* d, b! w/ d5 I0 K
def forward(self, x: torch.Tensor) -> torch.Tensor:
* I+ a( m8 a4 u' U
x = self.squeeze_activation(self.squeeze(x))
( R; L! ~) {3 Q# @3 H% F
return torch.cat([
6 ~+ ^3 p! l. P/ O* x# o3 q
self.expand1x1_activation(self.expand1x1(x)),
$ R& b+ N( D3 ^$ n- x
self.expand3x3_activation(self.expand3x3(x))
D4 V4 h& @1 Q5 ]
], 1)
" ~2 C: j ?/ y" e- m
/ q, @* h7 e e1 I9 K# k
1
5 E+ Z' p4 y( X! Z* E
2
' ^! O: z! a6 z
3
% v0 _& ^3 K; r b+ d/ a
4
/ W# `8 [9 F6 `3 p! W% Z) ^
5
# A1 G$ l0 e" [2 V3 I
6
5 n2 k& E6 w- ]9 F* M
7
9 r4 r# K1 { b/ @$ R
8
8 V) w" D6 E u, R! I
9
$ i: S2 [% ~1 m( ]- ?
10
x# _. c {! M$ ]9 e+ Z
11
! k* X) e" s) n" g1 i5 j1 c
12
1 m* Z5 h$ v. I' R- Q \% z; S; l& ^6 i
13
* j) j! w2 `7 v7 U1 C9 @0 H
14
3 d3 ?) j- I& |, D5 |/ e
15
6 X+ x/ K: R7 x- t- k5 z. z
16
7 m8 N V7 {- G8 h$ B6 S, [
17
) G7 b% n5 s" t) F9 P& ]6 Z
18
5 P. I- l0 a+ _0 |* ^0 X* J7 g
19
- L8 u, v8 @+ P# |- z
20
: D* D, _7 `+ m+ E& c7 {: C. L2 ?
21
. j/ F* P, y3 v: O: Y( `. { b
22
& `# D0 q+ p1 A. ~8 w
23
, {9 }& Q" ?( T) T0 R) ?
24
8 X6 ^* t4 H7 @2 r( R: N3 Z$ {" }
25
. F/ }% p; m& d, H( o1 _/ t+ B7 u
26
) f' j) ^$ E6 q
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
" E3 I& h( X. v6 }5 K' X
6 r& a& G8 Q8 P0 d
SqueezeNet1_0的网络结构如下:
9 @: g2 E: ~$ |0 B* s2 i G
0 ~5 @- L C7 a& z; S( q
self.features = nn.Sequential(
& D q4 k! V" x5 Z7 c2 \
nn.Conv2d(3, 96, kernel_size=7, stride=2),
6 l9 F8 O1 y4 P/ E, C
nn.ReLU(inplace=True),
$ S1 y! y+ j3 D1 X
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
: w0 O. X2 ^3 a! D) ^/ L. x Y+ ?
Fire(96, 16, 64, 64),
) g* c* p( a5 R# }( p
Fire(128, 16, 64, 64),
. A ]0 w% W( X
Fire(128, 32, 128, 128),
* Z5 D+ z& R9 ?& W. U M
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
) B; Q& a9 a) |( G+ C
Fire(256, 32, 128, 128),
7 \3 s$ T, u: u4 `6 |
Fire(256, 48, 192, 192),
/ [7 n1 @; J% T# N" n. q
Fire(384, 48, 192, 192),
5 {% u; ^( ^- H; f
Fire(384, 64, 256, 256),
6 t5 [' {- j# q
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
- J$ h9 y" n5 _6 P G
Fire(512, 64, 256, 256),
* B0 s2 C0 }4 `' B4 a1 S
)
* X# U& {/ K* R
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
% f4 P: c+ z) l) N+ d
self.classifier = nn.Sequential(
* \1 ?, n( v$ V" [% C
nn.Dropout(p=0.5),
7 f6 F( i2 e4 Q
final_conv,
8 _( Y- l: w$ {$ Q; Z" a; w9 z6 T
nn.ReLU(inplace=True),
7 K" m7 e4 U9 @' H
nn.AdaptiveAvgPool2d((1, 1))
! I6 Q( L6 D/ O$ l J: c- [4 a
)
* `: n$ @- P" z$ ` v- r
+ }8 U3 v9 h; g, ~ K
2 S' B' Y4 R5 @* V" k/ m( M
1
/ o$ N9 S9 U0 N" \& V' ?1 U* c% Y
2
9 D% d5 l! R0 ?. e5 t) r; T- N8 |: _
3
- e* E, {9 y8 B0 o) ^6 _
4
8 X' F p9 u8 c' ~
5
6 S0 c' c9 S6 r, u
6
2 ~: J9 e* f& v# V/ z' ?
7
, z& u9 n3 r) t/ f3 r7 ~0 e/ c
8
2 N) U4 c1 `, H: R7 `# A
9
% m# f: M. e, \( ]
10
- T) A$ g! n: u5 O
11
0 S( O R1 u9 k" q
12
+ x' E' r- \. G: k" X
13
' D9 Q9 ^7 k) d
14
5 F9 k! t- l! E) z5 V5 A
15
, G% ^7 P1 I) F' x6 M
16
# R1 L {* D; O, o& R$ ]8 ^
17
2 E$ d. |: L- a8 h. M: o
18
7 a" b& D8 R- F+ L8 k! W
19
: C0 {% N8 |. N r
20
3 k2 s$ `2 M! K7 p
21
& s9 Z. _. b8 b+ ^/ Z: O* n
22
, ~2 z0 }, O( l c
23
5 G/ I9 D2 V& G) l
SqueezeNet1_1的网络结构如下:
+ y3 C. |5 R3 u+ E- Q6 c) f- O
$ }" U# f7 E: s8 l1 V+ U/ u# R( s
self.features = nn.Sequential(
E. p1 S }% Q# F& q2 W
nn.Conv2d(3, 64, kernel_size=3, stride=2),
3 |# D& G) ]: v' g! l5 d% j9 f# {
nn.ReLU(inplace=True),
* G- w! h9 a. \! v/ u
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
2 U+ F, f, }9 [ K
Fire(64, 16, 64, 64),
. P' c j+ B. t+ [; P3 O
Fire(128, 16, 64, 64),
) T0 i3 s8 z/ O* w
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
q; j( B/ h" F. P% Y
Fire(128, 32, 128, 128),
& O, m3 z1 J. z/ d2 ~6 v" s6 H$ p0 U
Fire(256, 32, 128, 128),
0 N0 S* i1 b! @# o1 p
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
0 e0 r5 a4 b8 M3 `4 @, ~+ ^# _- ]6 z
Fire(256, 48, 192, 192),
1 ^$ l( s& W6 z" o, U7 @: o
Fire(384, 48, 192, 192),
6 g$ f0 d Q4 u: q; Q/ M
Fire(384, 64, 256, 256),
" S7 m H: ] M0 Y$ z; i
Fire(512, 64, 256, 256),
8 _- s- i" ~. m
)
! X* Z6 b0 T0 S% V8 z7 Q# N/ q
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
5 b ~# E& ]6 |! F. I
self.classifier = nn.Sequential(
8 s4 I0 |8 b. F% }
nn.Dropout(p=0.5),
: n! [# F& |' s0 _; v8 G
final_conv,
2 P9 h5 j6 M* T; ]: F/ B* J* R
nn.ReLU(inplace=True),
. u1 H7 h3 j+ u
nn.AdaptiveAvgPool2d((1, 1))
! s% y. Z8 ?* X4 h6 N
)
$ M2 m& t0 I. F" [% ^
; [1 W" _" E* k
1
% s2 j6 t! e4 j
2
, E! _% L0 ]4 E: u3 F) w" ~* `/ e
3
5 P. \. @! w6 y) C
4
$ q. a- ]- @4 o
5
# ^. ~' N1 M, i; }* j$ z
6
+ c( J! O% r4 H) D
7
/ [' N2 I8 ?% h, H) \* T8 e8 i
8
1 I3 [' s/ G1 y( w6 G+ L
9
4 `8 g/ n. T0 g4 T9 d/ C5 i
10
* f( C. n" o# D$ A
11
4 K& J) o( D3 w2 N
12
+ S" M1 I! t5 ]0 R0 n# |1 \
13
+ |% O3 l* T. s9 m
14
( e% N( R0 x5 A/ `
15
) L8 f, O' X* ~( j+ ^; Z
16
' P1 U4 C5 L* z1 [: B( j
17
) |* Y C( k5 ]) T; d
18
+ W6 i4 X9 }' v, E
19
+ I( X* [+ \! K$ _
20
" @' W$ H/ W' X$ D& K3 M, y4 m6 l
21
2 J4 ]1 O L6 y" x; L! K5 a0 Y
22
v& n0 T( ]1 I
SqueezeNet各层详细参数量及其输入输出如下表所示。
/ ]" m/ g0 A/ ^" U
; G8 C; K8 [5 o- `
% r/ o. K$ X2 ]9 ?5 J* |
4.2.6 其他实现细节
1 S4 S3 ?1 ?" a& h5 g6 X
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
3 U2 F0 i' x9 H4 b1 c3 h
squeeze和expand层中使用ReLU
; |* @* _4 Z$ X8 A( J- X& T
在fire9之后的layer中使用ratio为50%的Dropout
: b4 } V3 |7 v$ X
参考NiN算法想法,SqueezeNet中不含全连接层
; P! ?! S, Y3 g' y5 S
训练时,前期学习率设置为0.04,然后线性减少
) d! A: L! ?4 T* r* N$ [
4.2.7 总结
4 U# e% Z: B# B8 b; T: c) P
本文最主要就是三点:
4 T4 I8 c, `) {( w
& P( N2 w4 F5 {4 {# p
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
, y' I8 G6 v# H( O2 M% b
减少输入到3×3卷积的特征图的通道数,减少参数量
- W7 [2 J1 Y' a. f. M. E
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率
& `8 N0 `3 @; J
————————————————
; s* f! u9 c% l) Q
版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
3 }; m8 J$ ?* V
原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
8 l. w1 H- P5 g
# R N3 q0 _0 t2 F
) P" z% F, i" ?
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5