- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566251 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175098
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
2 p, I! w5 F- d0 Z轻量级神经网络算法-SqueezeNet
4 n6 |9 _# k1 s; `4. 轻量级神经网络算法目录: W5 x! p+ ^, S! i# {
轻量级神经网络算法6 I, u: {- C! j8 ?9 f0 e+ A
4.1 各轻量级神经网络算法总结对比( V2 z( t. P/ g( e8 B! o: C/ |0 X
4.2 SqueezeNet4 H: Z' b' \# @2 u7 p4 l) o v# n
4.3 DenseNet
" ~0 t$ j4 m5 }4.4 Xception: V3 q5 }1 S( L% i, s) B
4.5 MobileNet v1, F' ^: u' W9 T- j1 n
4.6 IGCV+ j' q8 H# g4 v) W1 Y7 x
4.7 NASNet
H( y" q/ |8 M4.8 CondenseNet( q$ n, u" b& s, n" ]
4.9 PNASNet h2 p% E' L2 t( b0 i( ^
4.10 SENet
X- j! h5 k! n) {9 R. l4.11 ShuffleNet v1$ @+ l/ m4 n4 T- a
4.12 MobileNet v2( z# m3 ]) H# z* E
4.13 AmoebaNet
1 Y: G9 \( N+ ^/ w4.14 IGCV2 z4 ]7 G% U% @$ U
4.15 IGCV3
3 J, E+ ^4 w: c( ~4.16 ShuffleNet v2
! n; B- R* K# e( H' f1 w5 h2 v. N& t4.17 MnasNet
7 E' f$ b5 d ^2 H# Y' n4.18 MobileNet v3 ^. _+ o8 x- \2 {- k v/ r
深度学习知识点总结
" L0 V, g T, e( s3 m, m% L* q
( O. A, p( [* E* x& x6 t7 g% s专栏链接:" F3 @& v0 g& X* V
https://blog.csdn.net/qq_39707285/article/details/124005405
, P( X8 V+ K! I本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。8 ]1 Z6 W- L) a3 d2 {/ a1 p
! z7 ^. A2 Q' R, E2 Z
本章目录
3 b2 J' G0 ^- N. p& Y# i7 u4. 轻量级神经网络算法目录
( }, z, D4 Q& Y! m& \* S4.2 SqueezeNet0 @, } w( t" x" }+ _; X
4.2.1 问题分析
2 e; m6 { `! q9 ~3 h4.2.2 SqueezeNet的三大策略
6 u3 \( j1 P% Q7 H6 \3 w$ H4.2.3 Fire模块% a% n7 h% w" ]( p6 Y" A0 \/ V8 B
4.2.4 SqueezeNet整理结构6 d7 [2 i- F) m4 c, P
4.2.5 代码实现SqueezeNet
7 }5 B8 R% |: G/ S$ N) ]4.2.6 其他实现细节* @- v) x5 V; W& J6 P
4.2.7 总结
/ k# D; o J0 G# |) ~4.2 SqueezeNet. g& r! c5 u; d( r3 q9 }
4.2.1 问题分析
0 s+ ]3 G/ o O/ g最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:9 k+ y3 D+ i0 \! W9 c0 z
7 D4 d8 U; O0 }- }0 m0 ?在分布式训练期间,较小的CNN需要较少的跨服务器通信
& }) O: t5 Q4 _在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
: y/ f5 I4 v7 \1 j2 L# q0 d9 n较小的CNN更适合部署在FPGA和其他内存有限的硬件上
( Z% R, p3 H- U# T( x+ Z6 U为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
4 P! U/ D$ s, }# n
$ c( H; H8 |% i! Y, Y: T* u* }3 ?4.2.2 SqueezeNet的三大策略* c0 J6 ~- j2 l4 K( o8 w; O8 H
策略1:用1x1卷积代替3x3卷积8 _. a. {% @- q- ]
1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。8 Q9 e5 c8 @. G. Z
9 D5 i4 }: H3 c/ N/ X
策略2:减少输入到3*3卷积核的通道数量: j0 D; I# A3 O
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
2 f# Y7 e; S9 {/ S' K& P) F
! w" u+ f1 \& x; W策略3:在网络后期再进行下采样,使卷积层具有较大的激活图, m( H% B* l! y- I9 l3 h
这里的激活图(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中。
; Y H8 t$ h R7 ?1 A* p2 p* m+ R7 d" ^2 @7 f# ]# ]3 H3 d, a
策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。( C; |) W8 X0 r% d
" ? H1 K$ F0 ]% I9 J Y8 Z4.2.3 Fire模块
5 ~$ D" d9 d2 ]( Q6 S为实现这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的想法。 |* a, X/ X2 Y* f# ~
9 E( A) C" e/ L1 E1 B6 D% r; A
4 o, D( b: ?9 h0 ]8 d4.2.4 SqueezeNet整理结构
/ w3 ?5 X& V9 J/ h* ]9 aSqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
% t4 }0 K9 _/ V% i! R
. ? M: A# _8 Z9 t2 x$ y$ b; ~/ y* F+ u/ y! ]2 T8 C
4.2.5 代码实现SqueezeNet
: E1 P& @0 I) [1 G/ s% e# p7 JFire模块的代码如下:$ }+ J+ S, S7 @
# t! l' k6 R7 \* ]6 j
class Fire(nn.Module):
3 Q o1 N* R1 W$ T# e, Q& f+ o. L. n
def __init__(8 [ i% A$ }2 b7 _8 l E1 Z5 {
self,; S2 V6 y6 h# \1 w& ~
inplanes: int,
. K5 k1 ^" q2 V squeeze_planes: int,6 R) W% |$ c8 P" S9 F: Q8 d
expand1x1_planes: int,% [ j6 ~& ^: c( K7 _& p
expand3x3_planes: int4 a: n6 [9 e" [, ]9 {9 |. E& C
) -> None:
* s* h* i4 ^ R super(Fire, self).__init__()
; {1 P* F$ K m: X5 l: \0 _; T self.inplanes = inplanes
8 x/ U/ b/ k6 C5 Q: \% c; t' ? self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)0 o; J/ h0 a E% }# E! N
self.squeeze_activation = nn.ReLU(inplace=True)7 ]/ v' E, ^. i/ h+ o
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,& |8 Y# j" ^+ ]2 D( L8 c
kernel_size=1)5 e# j- I$ L8 a8 o: A& ?0 V
self.expand1x1_activation = nn.ReLU(inplace=True)5 e, q9 W8 {+ U
self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
3 F6 N( Y2 I4 E5 q% H kernel_size=3, padding=1)
* n6 G4 x9 f% H J+ @ self.expand3x3_activation = nn.ReLU(inplace=True)
- E5 `2 _) r- h$ n3 p7 U H) q& b7 Y; [% h I0 v6 X ~
def forward(self, x: torch.Tensor) -> torch.Tensor:! j0 P1 O$ i# g
x = self.squeeze_activation(self.squeeze(x)); _- t7 M6 ~2 {7 _8 [
return torch.cat([
9 T: w# d. S& i6 C% y/ X self.expand1x1_activation(self.expand1x1(x)),
y% _0 m$ G6 J. _$ [* a; I self.expand3x3_activation(self.expand3x3(x))
! L& a9 E9 Q* C5 H- Q5 i! m3 y ], 1)
4 x) g! @, o/ G% l
; q2 g' j) }0 g8 ^15 N; D% R4 ?% R0 h! x' t* x
2/ q7 ? c2 r1 B& \) k5 t
3
/ Y3 D' |! e- N/ @/ d4 D4; H/ F' J( c- ]# E- Z2 B) |* ~
5" f5 y3 w* c' G+ b
6
' S9 d/ V4 t5 y, M7
0 s; d+ M2 S' ]* k; E8
* D& D3 Z |# i4 o ~. B! `/ q9
# a; |/ ?4 z1 B, x9 ]0 p1 x1 ^10
. t: a- b# s0 W& |6 V8 B11
' j# }/ x; P) u# X12
+ H: m: ^) h" V% Q7 c: f2 C13
- Y) f0 C- F2 D* Q# a14
+ |5 I* o u) G" J1 C' ^$ L15, V- e! [) A4 y% j
16
+ T9 o( q6 B- W* u }( A177 I4 R) M$ A6 V* B' t7 W) {( S$ @# k
18$ d- B/ K9 }3 M- S' K3 ^
19, K3 A2 j! t$ r4 W' g# g, [# Q. N% J
203 `- L2 x0 P8 j* v* z2 H
21
% S9 D& \3 [3 E3 V9 d) i22
F6 e8 l, i; c' R23- L0 R; I6 J" [
24
; [, Q. C3 [+ `- ^, L; r25, c1 I5 W+ V; V$ ?
26 H* R1 z+ S% M- O8 ?
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
' p8 E. C0 w, T- \. v
) e- L" R S& p, {/ ?+ `5 CSqueezeNet1_0的网络结构如下:
1 Y1 G$ L7 F* N' g) r& X0 r# Y: s! ?3 f" g3 g7 m
self.features = nn.Sequential(
6 g# J+ y. l) `. ? nn.Conv2d(3, 96, kernel_size=7, stride=2),# ^' \ S' D! X4 j- D, H0 t7 O
nn.ReLU(inplace=True),
0 h5 v( |, B6 y) x; N nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),3 u2 r) [ Z$ ?0 K( Z
Fire(96, 16, 64, 64),
! P) y$ S1 v; o Fire(128, 16, 64, 64),
7 T( S5 f1 `# M& i' n5 J Fire(128, 32, 128, 128),
$ o- ? i: a/ C- p8 Q# K9 v5 J% ? nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),+ [9 Z. W: |, H. |
Fire(256, 32, 128, 128),
B0 [, M2 M) V$ R8 S7 i Fire(256, 48, 192, 192),
$ f& {2 V% R; b5 R% ]+ B Fire(384, 48, 192, 192),
8 i q: {% H! N% F" R1 | Fire(384, 64, 256, 256),/ B! C2 N. {) b. U k
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),1 Q4 I, l4 Z/ q6 Y2 T/ x, p; ]* e
Fire(512, 64, 256, 256),
+ w7 r. ^3 H/ Z. ?* S5 b" o* L: F) k)
1 y) T& V/ W! cfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
% C! S! Z8 d: e0 R! n& T; kself.classifier = nn.Sequential(
! P& L. {0 I- e: Z, P nn.Dropout(p=0.5),
! m$ @+ y, d6 h, L+ Y final_conv,
. B M( [, g1 \4 L" r- t nn.ReLU(inplace=True),
, s4 d2 I1 s! x9 o nn.AdaptiveAvgPool2d((1, 1))8 _' E2 U! U: ^, ?$ [% `% t
)
8 \% O. e6 ]( A# Z& X
7 H/ W6 t; H% l0 K' ]- s& l+ `4 H7 Y! b1 m0 U2 E
17 O/ p" H0 u `$ |
2! ]) v. ^: a6 V
36 N& E- t/ W1 h6 n
46 _5 X" y1 y% C% S$ U7 O
50 F1 }; M' j2 u/ v4 S
6+ ?5 d2 \: ?( W
74 ~0 v# s# m7 T) E5 X0 J
8
* g: S0 w/ C7 w+ {3 Y9
" }5 }" s* _- z10
2 x7 H5 r% @" k5 _: u) ~. b11+ k5 z3 @! \: v' F5 B
12
. n0 \' B4 L1 o13
+ @2 L% ]5 Y k. n$ B14
& G/ S9 i; n% a# l: Y- ^; q15
' V! g X( k/ V- g5 b165 t7 B0 ~. p6 d8 |& F
174 F3 v/ U5 e. b- b
18
+ a4 g4 }. U/ |19- W$ b, Z5 m! t' t7 Q6 r$ C
20
2 s L* N4 C% B" G3 h' n/ |- w216 ? T0 j! y# l* D* P, f+ P2 L
22
0 \' c n& t# z; E" Y23* U) D/ {( ]9 Q
SqueezeNet1_1的网络结构如下:7 v# }) h6 a, A' G2 m$ H' M, V
1 R1 A+ n* _! a! T: o2 u6 Rself.features = nn.Sequential(
& o; Y+ [1 R5 I9 ^ nn.Conv2d(3, 64, kernel_size=3, stride=2),$ N8 p7 }! @- A0 v: s
nn.ReLU(inplace=True),
7 N+ m0 x3 P' U% k% B8 ~, _! o1 H nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
& M! R% }4 r: f# x$ d) { Fire(64, 16, 64, 64),6 R1 ~* M# s1 f; [9 d& z; W9 k
Fire(128, 16, 64, 64),
+ h: @, Y- U! o0 e% B0 a/ E nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
% G4 x+ R5 q( ~ Fire(128, 32, 128, 128),# E) t5 e3 p% w- T
Fire(256, 32, 128, 128),! m% R! q3 s8 A5 h" p
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
: y/ a! E' o+ ^ \ Fire(256, 48, 192, 192),
( ^. }# L5 K. U9 L9 b1 F Fire(384, 48, 192, 192),
. J3 q5 s# y* }( P9 A* F Fire(384, 64, 256, 256),
3 ~8 T* m' h- }* D Fire(512, 64, 256, 256),4 U& ~9 j, l) h$ q8 K1 y6 v
). P, j0 i$ Y# `( u5 J: O
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
4 u5 ?$ S& ~: _9 _% Fself.classifier = nn.Sequential(3 i" [6 s" ]# s7 G1 I/ |) J
nn.Dropout(p=0.5),2 F# o: s( h2 H4 l3 H
final_conv,
( y2 E0 X L# O8 ]8 t8 G4 r nn.ReLU(inplace=True),& n+ {5 D, t6 W' J& t/ \, w
nn.AdaptiveAvgPool2d((1, 1))- u5 m$ _" z3 @3 d1 c4 F
)
2 O5 I* r& S* D B
: q; u! `; N/ l# L1 R1 {" S1 O+ X& g9 u& X
2
y# F8 M5 ^& X7 v! ~, ^3& f n# V/ G0 C7 w+ k3 R) C( P3 u6 P! L
4! P0 |# n/ k- s2 s- d" u& _
5; Z2 H! Q% T+ _3 c7 u1 J
60 D1 a+ ?8 V" X% P9 K: X
7
7 J G5 z9 Z5 E/ [8
+ |8 d, P& e: w* d" _+ K93 U) J e' @0 ^* N; f% T8 X
10
( [2 q1 H9 p0 _11' x* \- @6 ?8 a1 `
128 u8 h+ W0 B/ [7 R5 t9 f) N$ R; Z
13
6 s$ y8 S4 E( R8 A* q6 f14( I. V# J C# p: h; e8 _" N
150 C( d1 ]$ Z% M& [. a
160 G- q" a/ d6 J- e( C7 ?
177 n- B* ?2 G6 e" }4 H1 t; u
185 t8 d; ?7 c7 d2 c. x
19
K- D; p4 s/ M$ {, q. u% |; t/ V20/ W' ~" c" T4 ~1 h3 \- Q, q; q
219 `% |- i4 w& }/ ~; _% V
22
+ Q$ |) b& E. E. n% ?" f% O) |SqueezeNet各层详细参数量及其输入输出如下表所示。& ^' p+ [7 E' `5 N
. g: n) Q- Q7 }3 T9 {1 F& } x7 G5 O: W
4.2.6 其他实现细节' g( I+ ?; W1 U& H
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding V# u* Z7 w0 i) K% o
squeeze和expand层中使用ReLU
+ M. ^& h8 F( y$ I在fire9之后的layer中使用ratio为50%的Dropout
m7 a; X* Q- ^( a0 J参考NiN算法想法,SqueezeNet中不含全连接层
& G0 R& k, |3 R3 m4 Q; T- A* ?训练时,前期学习率设置为0.04,然后线性减少; h4 K7 D/ [. K! @0 L9 P" z9 h3 h
4.2.7 总结9 ^- l( t8 A6 z
本文最主要就是三点:: M2 e- F& v- ^/ M% b7 \! {
- |8 _3 C% `7 W) j
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
7 ~4 P$ e: t: _2 O2 f2 T减少输入到3×3卷积的特征图的通道数,减少参数量
; S! f- \3 @) K" I) [+ `不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率4 i0 V% w! K3 z* R2 }! s; Z- ^
————————————————) v4 A8 ^/ i' ^) g o! B/ P7 W) J
版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 ~: H* ^# N, l! T! }
原文链接:https://blog.csdn.net/qq_39707285/article/details/1264981009 ^- B: K( }# ]5 m4 V- F
4 g+ s6 |. j! ~: \0 J9 ^4 V# n4 i
: s: D, p2 F6 U |
zan
|