数学建模社区-数学中国

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

作者: 杨利霞    时间: 2022-9-5 16:42
标题: 轻量级神经网络算法-SqueezeNet
8 x+ U7 p$ u" ^
轻量级神经网络算法-SqueezeNet2 t; t) S; j# z- a4 {, b, a2 ^
4. 轻量级神经网络算法目录* ~+ a$ V5 {$ p1 j1 t/ ~$ f" U, G
轻量级神经网络算法
* K* I  U' k) W4.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+ a4.6 IGCV
5 Z8 _; n7 R- h% J5 c( i3 {4.7 NASNet
: U* X3 B, x6 ^6 N* d; D( r: U; m4.8 CondenseNet# Y8 u' [  B4 p, U& E3 |% ?
4.9 PNASNet1 d# m0 \6 x8 A: Y5 r
4.10 SENet
) y" q; L. W2 x" j4 d4 o2 h6 I4.11 ShuffleNet v1; M" \5 |8 i6 w! m
4.12 MobileNet v2/ n2 Y" F+ M5 c( s- d
4.13 AmoebaNet9 T1 i/ S3 ~) K5 T, z, [
4.14 IGCV20 j3 m. p$ q& m# [1 g6 f
4.15 IGCV3' Y7 g0 b; k9 `2 V& Y( Q
4.16 ShuffleNet v21 A8 n' X) [% t& [7 J9 i5 L5 b/ C
4.17 MnasNet
; \2 P4 R" {1 p! e* J4.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/ c4.2.2 SqueezeNet的三大策略
# x9 X/ S1 T9 q2 b- U; ~. W( D4.2.3 Fire模块  b! D" U* z1 J
4.2.4 SqueezeNet整理结构
6 J+ V/ c# L1 N: O. b( j4.2.5 代码实现SqueezeNet
4 p6 m; f9 A% W" m6 z3 ]+ j4.2.6 其他实现细节
/ r; U9 u4 G) q, r8 m6 F, J4.2.7 总结
1 }1 |0 Z, K2 L, M% ?& O, P4.2 SqueezeNet
3 F. w# q" F3 Y# I# G' Q6 b4.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; s1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
% I8 Y  l: Z: M6 i  Z% Q7 S1 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 s4 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 a4.2.4 SqueezeNet整理结构
$ t/ h& Y4 V7 m1 ASqueezeNet整体网络结构图如下所示,其中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( BFire模块的代码如下: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* E2
' ^! O: z! a6 z3
% v0 _& ^3 K; r  b+ d/ a4/ W# `8 [9 F6 `3 p! W% Z) ^
5# A1 G$ l0 e" [2 V3 I
65 n2 k& E6 w- ]9 F* M
79 r4 r# K1 {  b/ @$ R
8
8 V) w" D6 E  u, R! I9$ i: S2 [% ~1 m( ]- ?
10
  x# _. c  {! M$ ]9 e+ Z11
! k* X) e" s) n" g1 i5 j1 c121 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 |/ e156 X+ x/ K: R7 x- t- k5 z. z
167 m8 N  V7 {- G8 h$ B6 S, [
17
) G7 b% n5 s" t) F9 P& ]6 Z18
5 P. I- l0 a+ _0 |* ^0 X* J7 g19- L8 u, v8 @+ P# |- z
20: D* D, _7 `+ m+ E& c7 {: C. L2 ?
21
. j/ F* P, y3 v: O: Y( `. {  b22& `# D0 q+ p1 A. ~8 w
23
, {9 }& Q" ?( T) T0 R) ?248 X6 ^* t4 H7 @2 r( R: N3 Z$ {" }
25. F/ }% p; m& d, H( o1 _/ t+ B7 u
26
) f' j) ^$ E6 qSqueezeNet主要有两个结构,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 dSqueezeNet1_0的网络结构如下:
9 @: g2 E: ~$ |0 B* s2 i  G
0 ~5 @- L  C7 a& z; S( qself.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* Rfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
% f4 P: c+ z) l) N+ dself.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( M1/ o$ N9 S9 U0 N" \& V' ?1 U* c% Y
29 D% d5 l! R0 ?. e5 t) r; T- N8 |: _
3
- e* E, {9 y8 B0 o) ^6 _4
8 X' F  p9 u8 c' ~56 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 `# A9
% m# f: M. e, \( ]10- T) A$ g! n: u5 O
11
0 S( O  R1 u9 k" q12+ x' E' r- \. G: k" X
13
' D9 Q9 ^7 k) d145 F9 k! t- l! E) z5 V5 A
15, G% ^7 P1 I) F' x6 M
16# R1 L  {* D; O, o& R$ ]8 ^
172 E$ d. |: L- a8 h. M: o
18
7 a" b& D8 R- F+ L8 k! W19: C0 {% N8 |. N  r
20
3 k2 s$ `2 M! K7 p21& s9 Z. _. b8 b+ ^/ Z: O* n
22
, ~2 z0 }, O( l  c23
5 G/ I9 D2 V& G) lSqueezeNet1_1的网络结构如下:
+ y3 C. |5 R3 u+ E- Q6 c) f- O
$ }" U# f7 E: s8 l1 V+ U/ u# R( sself.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. Iself.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* k1% s2 j6 t! e4 j
2
, E! _% L0 ]4 E: u3 F) w" ~* `/ e3
5 P. \. @! w6 y) C4
$ q. a- ]- @4 o5# ^. ~' N1 M, i; }* j$ z
6+ c( J! O% r4 H) D
7
/ [' N2 I8 ?% h, H) \* T8 e8 i8
1 I3 [' s/ G1 y( w6 G+ L94 `8 g/ n. T0 g4 T9 d/ C5 i
10
* f( C. n" o# D$ A11
4 K& J) o( D3 w2 N12+ 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+ ^; Z16
' P1 U4 C5 L* z1 [: B( j17) |* 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 l21
2 J4 ]1 O  L6 y" x; L! K5 a0 Y22  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 X1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
3 U2 F0 i' x9 H4 b1 c3 hsqueeze和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