- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563300 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174213
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
- |# a# v9 @& M% G' _* c轻量级神经网络算法-SqueezeNet
( X4 K: f/ `7 _# U) Q: N: g4. 轻量级神经网络算法目录& {! A7 S: G& Z$ Y- Y- H
轻量级神经网络算法
3 q. w" f/ y1 P# O% Y# Z2 Z4.1 各轻量级神经网络算法总结对比
7 J2 a+ }! }6 c5 r; A' J3 A% E N4.2 SqueezeNet
; J$ I, ]6 F4 e0 V* B1 f4.3 DenseNet
3 b' p4 s" f9 G0 C/ g$ ]+ A4.4 Xception
' _" H( A6 n( ?$ D7 f6 Y4.5 MobileNet v1
: m. W5 v. U! i& ?3 Z5 ?( m4.6 IGCV3 r; p/ O- J0 a) n' O! B
4.7 NASNet
5 V* p( d+ j4 P6 V4.8 CondenseNet
! _/ {& g6 [& s# B; Y4.9 PNASNet. a: g' O9 B7 x. o: Z! A/ L, C
4.10 SENet
# B- y$ d) u: _6 ~4.11 ShuffleNet v1
& @+ \" Q6 C5 g5 ^2 d; G4.12 MobileNet v2
' K+ ~! h V6 p4 i# |# u$ E" b4.13 AmoebaNet
" {9 |& w+ k4 @& n5 ]' q% h# ^, W% o4.14 IGCV2
( S [, X9 c/ U6 O4.15 IGCV36 R! y5 J: L J8 |
4.16 ShuffleNet v2
( Z7 v9 W @+ p, {3 A4.17 MnasNet2 F; F5 `4 [8 n. G7 N H
4.18 MobileNet v3
( W+ e. V( O! t7 B' g' h. s) C( t深度学习知识点总结1 @% m8 m, s$ g5 A" u% g
9 \, D; u! G4 Q I" d F6 l8 X8 Q专栏链接:
1 n) I! |6 _4 w+ x* i* s* V9 ?/ `https://blog.csdn.net/qq_39707285/article/details/124005405* j. ]: Y& B2 B) y1 z
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
2 r' i( W# C0 G) B: j4 i" Z0 D1 C0 g4 p2 P! X
本章目录% z# \: V& v! }
4. 轻量级神经网络算法目录
1 K9 p) r! y. w/ V3 j- C: q4.2 SqueezeNet
% u- D( ]7 J4 M% }( U; i, `$ h$ f0 y4.2.1 问题分析
; U' d$ m% u4 T, n4.2.2 SqueezeNet的三大策略' t p: m$ R+ [2 G+ G, J
4.2.3 Fire模块
0 j. }8 N" y9 ]! N, a! H2 D- x3 V* |4.2.4 SqueezeNet整理结构& l+ o" K8 J1 _: D! o
4.2.5 代码实现SqueezeNet k0 f. `$ J8 R, Z; J
4.2.6 其他实现细节
9 p& i5 G& L' U6 _) G+ N" }! D% _4.2.7 总结
9 W% O* @) |: v: V, W5 m' Y4.2 SqueezeNet
U6 t( A9 C& B+ X3 g9 X4.2.1 问题分析
0 s6 {2 H1 P( z! z1 V) N最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:7 Y$ r' ~) z6 p5 ]5 ^& L
6 L* L" H+ V8 m2 G在分布式训练期间,较小的CNN需要较少的跨服务器通信, ^0 h. Y/ O' c
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
3 u) r" N9 o8 v6 k" r较小的CNN更适合部署在FPGA和其他内存有限的硬件上' g$ |- Z2 k. N2 N6 q% o# `
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
. E+ m: o; c% [8 j
. N! y/ ^5 j+ |7 R$ h- _+ {8 }4.2.2 SqueezeNet的三大策略2 f8 ~# y8 i* p+ y$ F3 `$ \
策略1:用1x1卷积代替3x3卷积
. H+ g2 `: s& ~- s4 U$ z0 B1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。$ J+ C, F) U3 A, z" L* s
) ~- h4 Q: d( `+ r K
策略2:减少输入到3*3卷积核的通道数量( s" k8 r7 W. F, j1 n1 `3 E2 F$ i
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。( U% _/ t K# I- Y
' z; z! L1 W8 e7 K0 q F6 b
策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
3 x- i# ^3 U9 y. f. L+ P) W这里的激活图(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中。- K+ R9 p3 w6 p: k. ^4 r q' Y9 J
( X3 I6 q4 y$ ]8 Q3 N5 T策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
( D4 U$ Y: o4 A8 ]4 Z$ D1 K' v
[# H: m- P4 V l4.2.3 Fire模块
4 v7 G6 C0 o5 [2 }/ u: Z为实现这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的想法。
J: ^' S: c( \* x; ~. X& Z% Y c ] D
) p. h( b; N: q, m/ f% X; W
4.2.4 SqueezeNet整理结构: d- | r- f0 @0 V
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。0 m4 Z$ h! V% O$ w" F
8 w N! Z! ^& n! ^' ^% X
. y0 j2 p4 L4 a& l# w# K# x! `
4.2.5 代码实现SqueezeNet
# g& M1 W- \3 ~! ^( [+ w, O! cFire模块的代码如下:
8 h: l: x5 y/ d5 l' [
3 s/ P$ s4 i$ b% O3 a# L5 zclass Fire(nn.Module):: g5 s/ y! {) S$ t, F
8 k0 \9 j9 s4 Q% w def __init__(
& Y, L, l8 z; @ self,
2 R9 y- y, e" ~" G( t inplanes: int,: t2 q4 G3 Z [# U
squeeze_planes: int,
8 E5 t2 T* c! B. J( A4 h expand1x1_planes: int,) m: g( u1 a* |* o: z7 v4 d# M, Y
expand3x3_planes: int& e: ^. |1 T: w8 l2 J" D1 s8 a: E- w1 W
) -> None:% Q8 C% M% d/ L# o! j3 @
super(Fire, self).__init__()$ H& Y) X4 E# J; Q0 B# t1 i# C
self.inplanes = inplanes# R' Y7 O! v( f1 l4 Q) N
self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
! I8 j, g5 R8 P( L, D* d; X self.squeeze_activation = nn.ReLU(inplace=True)
" H3 ]" ~3 ~7 Y' M' s3 U! p2 k, R self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,$ c( v+ k7 c& z1 J
kernel_size=1)
( p, }+ c& A7 `' V8 [' E. z0 [ self.expand1x1_activation = nn.ReLU(inplace=True)
. j, O! B0 J* v. \! Q' r3 b self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,# S% D/ O* ?- O: w& k; |
kernel_size=3, padding=1)5 j9 f$ q5 H" U* m
self.expand3x3_activation = nn.ReLU(inplace=True)% z1 Z- B3 U. _: M( m- J
% \6 S W1 t0 u5 S' _* u7 N
def forward(self, x: torch.Tensor) -> torch.Tensor:
, z# Y1 c- Q* P/ m& X* Z) t x = self.squeeze_activation(self.squeeze(x))7 g: M2 K+ y0 R& f4 V! x
return torch.cat([
9 R/ K! `# t7 r# M( k self.expand1x1_activation(self.expand1x1(x)),3 @9 z% M; k" V, C. C8 {
self.expand3x3_activation(self.expand3x3(x))
6 o' ~3 I1 Q. V$ n3 }+ I U/ H1 ~ ], 1)0 t- Y7 u% F' B. r& A
0 I2 h" [: |! L% R$ b* m1
/ Q3 _& D. ?$ \, H- C2: ~7 ^) J# J- |1 ^
32 R- W/ k3 x5 i: G! T& m" X
4% a% ?2 B* [9 M5 U# Q& B
5
3 n, L3 [2 J8 t$ U+ g) }7 V! ^6* U! O2 G% Y- N6 r7 W
7
8 S& a0 }: i8 _, [3 y( y8. x. N- B Y" s' z! a4 u$ S. b
9
4 w0 g% a3 S) J8 B- N* R1 \7 r10$ K6 b u: N5 S$ K5 L
11
6 d+ `8 O* X! H# Y12
% |2 d. l2 S) e; T13, a) [3 F" e2 ^ n+ W1 s
14
4 y0 Y! N- {4 b5 i$ q15
) v# b2 O" ` ^3 X3 Q, c3 ~ d160 P9 U- W% L$ `: S
17$ G- u& a8 H3 F# ~, l( z. L
18
. \7 O% q0 z+ R% \: m: D$ C8 g" C19, w I* I1 \/ Q6 O$ G& M" w6 ~
20
6 g! w$ \- l$ c/ C21% X- R9 d) x0 a
22. w% v9 A/ e A( L
23
. D! @8 `& j7 ^/ `. }$ Z241 i$ w9 t5 i4 g7 A
25
9 K$ W; w7 c8 a; i, ?26" P2 y$ M# D+ ]" m6 ^0 r! o2 I
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。# ]: c) j/ C( W
1 J5 R0 g* A Z( O' }9 O" o
SqueezeNet1_0的网络结构如下:
' F4 H' V0 I, h# g) v( ?; a
* _0 S4 u+ P( R/ d" rself.features = nn.Sequential(. Y% K6 V3 s& L% ?1 `: h
nn.Conv2d(3, 96, kernel_size=7, stride=2),
9 y) b: N. n! v. h nn.ReLU(inplace=True),
2 S0 u I/ K5 o( T. W6 L nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
* W3 }- _' |3 H3 \- x1 K) T, i Fire(96, 16, 64, 64),; P2 l" V6 w. I+ C( C9 }' a2 X4 A# x6 A% }
Fire(128, 16, 64, 64),
' b; w' t+ Z6 F6 t Fire(128, 32, 128, 128),1 g; W$ o3 }. F: W$ K
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),) d7 A2 ~4 q6 t7 X2 v7 `
Fire(256, 32, 128, 128),( S9 d+ v# z7 w, m% s
Fire(256, 48, 192, 192),
, a8 y$ n( V7 b0 M, C8 Y1 ] Fire(384, 48, 192, 192),
: n R* a1 Y5 y. L Fire(384, 64, 256, 256),
' M' w# w2 W7 c9 n5 P% k. m4 m nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
) k! w* }% L: r4 r8 r k V7 ?# t Fire(512, 64, 256, 256),0 q9 @$ v6 c, G4 k3 T
)
" G7 J0 {0 t2 }, \& bfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
1 ^8 _; d+ N8 \! i) o1 ?self.classifier = nn.Sequential(, ^. p' K0 w2 u9 Y
nn.Dropout(p=0.5),
3 ~% A( }$ H( e( O final_conv,
, a/ @! _0 Q' L Q3 r; c! c nn.ReLU(inplace=True),
7 R; a8 H# {0 P0 x X nn.AdaptiveAvgPool2d((1, 1))
* L$ x0 R( v8 N)# u2 T" T! B& q
6 l1 O) W3 | k. T" D
$ X% K8 h- a$ q% h
1
6 K1 f# [& {/ b! d7 Y6 @- g2
3 f- t c& h$ r* ?9 h+ r2 }3 B3
& a1 x. s/ C, v+ t% T4 a) y4
5 l: @$ G: }% ], P5" e# g h( y/ G- {6 T* ?- j4 Q; J
6
. j9 ?. O) R( o% B5 }- \7. h. G5 J/ ^% ~- C
8
& _; g2 G1 E* M. X' ]2 _9
2 |! h+ h" L! J0 i- T5 z! J4 Y6 n10' {, n1 w0 G0 t1 U& ^
11( K" \* o0 a( n0 `
12
" T9 C! ^+ V! {13( ]9 }5 E7 @) q+ r y& z
14* V8 C2 X9 d+ x9 ]- A
15, u0 S3 a, o- c) X9 y8 y% F# [; J
168 A& W, H9 @3 ?7 S
17
9 ]1 a0 Z. i5 h6 F- s m8 |18
( E7 V0 P5 t4 c9 L; J0 K19, Z/ S$ t% e. z$ b: A
20
9 C& V2 x& j5 ?: M6 J21: m/ m% f6 O% f* A
22
. l7 z2 L) l& M) B23/ Z7 m7 d6 k% m' t
SqueezeNet1_1的网络结构如下:( e( v0 F- l/ U4 W* L
/ U. x" A/ `: L# Q( z. l2 S
self.features = nn.Sequential(; \- p$ {/ _) K- x( a9 u, [
nn.Conv2d(3, 64, kernel_size=3, stride=2),
7 M7 h% S. {( E* W: A nn.ReLU(inplace=True),
+ \4 d& R5 H% r; W, |/ n# x5 v nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
; @% P( N+ W1 y. r/ U% @ Fire(64, 16, 64, 64),
5 u9 s/ t' d5 F7 V! ?3 ?7 J3 w4 j Fire(128, 16, 64, 64),
: g! ?. o2 x& u, I' u nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),! P- f$ J0 u! b J3 Z$ c
Fire(128, 32, 128, 128),
# C, m" H7 f& A6 R3 t9 K Fire(256, 32, 128, 128),
1 C7 c0 R" E2 p7 z0 o- X nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
" @& ~* T5 Q" } Fire(256, 48, 192, 192),
0 D: k7 }% h7 v( L& U Fire(384, 48, 192, 192),
! c7 {; r" S+ k Fire(384, 64, 256, 256),5 y* h/ P' Z$ T F
Fire(512, 64, 256, 256),0 q J6 ]. e& F& b
)
" e9 Q6 ?6 V8 s. J. a/ m$ Ifinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
9 p6 h! H( h5 e: R; Y/ N/ @self.classifier = nn.Sequential(
; I4 a7 Z: q- M2 e5 w nn.Dropout(p=0.5),2 A! f+ ]8 z3 f; I% k
final_conv,
: K- ]' a* o1 T8 a nn.ReLU(inplace=True),
( _/ t' m+ A) _! {5 E: N! h0 U nn.AdaptiveAvgPool2d((1, 1))( R9 | r# v0 m* ` }
); \9 N8 d1 i. O( j$ y* q6 }% O
. {; v+ _7 p5 L/ ?0 r+ V+ J
13 W G% Y( d6 r9 `% U; A
2* R0 q6 s0 S( l0 L2 u. B
31 V" g: M/ Q! L+ j$ f" |
4
, m, h# e7 m) {5; h( N9 e' A9 x3 |
6+ C. s' e' F% j" ~# V7 o6 a3 I7 u
7( @0 r* H4 n/ N* n& [0 `- S% T
8
- c% O0 B; y ]9 ]1 Y; a& D9: n/ ^- }4 J* k2 x. Q2 W
10
7 X, t# F" e+ b& U9 E0 f11
6 P+ }3 n$ }1 P2 ]# h/ r' z12
2 c* H. x: w4 s! ]9 e13) ?2 U. L$ [+ n+ G: [4 }* ~! c
14/ g/ C( N- o; q7 u4 k& x7 [' D
15
' z. [0 } x% F4 L$ J* W6 k2 M16
' ]# i- e7 I! S% o9 [+ s17
9 l! K$ [+ ~' F18
5 r/ X( a3 V4 r9 [+ F( j: L19
3 B$ A V1 E5 Y20) B# x1 |; F6 J3 ` c
21
+ y% u2 Z0 L1 Y6 l& f22
* m1 C& S+ L' }( I3 W9 y5 SSqueezeNet各层详细参数量及其输入输出如下表所示。 `5 @$ D `0 W% n% N6 x1 d
4 O8 ~! `+ S' h! J; }0 o) T
- p% s6 _& Y: n/ B/ o4.2.6 其他实现细节
) f& q9 o2 ]( [1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding3 ?) _3 o. y% W0 l. H) C
squeeze和expand层中使用ReLU0 D) N4 X& @3 I# w: n
在fire9之后的layer中使用ratio为50%的Dropout' D" M0 \$ B8 C @) M, ]4 d
参考NiN算法想法,SqueezeNet中不含全连接层
+ M, x; _1 j1 S( ^' d3 \训练时,前期学习率设置为0.04,然后线性减少
% \, c' Z C7 w, Q+ R& G4.2.7 总结9 a; [. f- L0 z5 X' G) g1 P
本文最主要就是三点:
1 Y& T1 n! [3 L
2 }6 M9 a& w: M9 ?% ?用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
0 ]) ~( Z. O1 t6 T# Z3 T' u减少输入到3×3卷积的特征图的通道数,减少参数量
! A: M5 H: P, V. ]: P8 _- j6 p不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率. V# ]4 ]6 e# @, o# A0 J
————————————————
* u8 K, r9 w0 d8 z" E1 s& K版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
& F# H+ f; @6 |原文链接:https://blog.csdn.net/qq_39707285/article/details/1264981006 G) \% D6 i5 Q% p- ^
" s- n- x! _: z" A; r& C' B
- b; {* \! b4 ?- V4 H. o
|
zan
|