- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563328 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174221
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
! k5 {* u( J% C$ |/ M. _/ [; ?1 g轻量级神经网络算法-SqueezeNet7 q1 G; M' d5 y2 @
4. 轻量级神经网络算法目录: D; e: L! J l) x* N) ]* a4 T
轻量级神经网络算法
3 W: W$ w* R% J. p: z) P p4.1 各轻量级神经网络算法总结对比
3 v3 ?% f" N: N- G6 h4.2 SqueezeNet
% N: L- h6 r+ x: P4.3 DenseNet
( Y% Y" w5 {( y9 |4.4 Xception* x& W( c: c) J
4.5 MobileNet v15 |, [5 W- b9 |! R
4.6 IGCV8 i1 w1 {$ R; H) p
4.7 NASNet/ ?* P C3 J! |+ W
4.8 CondenseNet; ~( b0 O9 E* I& M* _- L
4.9 PNASNet
6 V) o, O+ X! g; X+ A2 H4.10 SENet# u- |9 O* ^6 ?
4.11 ShuffleNet v1; J# O* {: a/ u% ~9 J9 Y
4.12 MobileNet v2, M( e1 V9 E+ Q8 |$ v1 c
4.13 AmoebaNet
! e1 V6 h' w! C4.14 IGCV2
; q7 D6 B; n1 `3 l2 J" r2 g4.15 IGCV3
3 c. s1 r/ h& _' ]( _4.16 ShuffleNet v23 a9 L" \ o' ]( b
4.17 MnasNet& v! L% J6 h3 l+ i7 w. h; O. `
4.18 MobileNet v3# S6 Q8 L: }3 Z( e: k" x2 y" d
深度学习知识点总结
# u* |# M( R0 Q7 ^: P9 V1 Y9 L6 F* h; R* z) e7 W
专栏链接:; ?: D9 u1 {2 k7 q2 c
https://blog.csdn.net/qq_39707285/article/details/1240054053 f+ ~# \3 ~* Q0 d3 y1 E; {6 {: {3 y
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。% f% L" |' K) w9 y% _
# p4 h3 A5 x2 p, d* p0 h1 L, h本章目录' P* Q2 U, ?( k1 Z
4. 轻量级神经网络算法目录
. U5 X6 l: M2 C& E4.2 SqueezeNet
* C) V* a( D: w+ y+ n4.2.1 问题分析
$ d* i8 R# I5 E: t3 ~9 v$ w. g* k4.2.2 SqueezeNet的三大策略* y, L% }7 z G5 W
4.2.3 Fire模块5 }& b8 {6 C5 u
4.2.4 SqueezeNet整理结构
6 N* r9 y1 U9 B8 [" m- x2 ?4.2.5 代码实现SqueezeNet
p& E7 r5 }7 o$ T/ X- q4.2.6 其他实现细节
) ^: Y& r$ E! }1 l* L4 ^& z3 n3 G4.2.7 总结* ~( J' I* E4 Q v) R- U, x
4.2 SqueezeNet
4 N$ p/ P5 c2 [" o- v. V/ q& s4.2.1 问题分析/ Z2 @8 G& H4 ]# {3 w5 u N+ w3 `
最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
( b3 p4 D0 `0 N* x/ k- Y1 U
1 c$ \, _ A q/ ]在分布式训练期间,较小的CNN需要较少的跨服务器通信' }' ^3 ~* m; M3 m; e2 w: a8 r. c* o
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入4 p9 z- ~- V6 c9 U9 O) A4 U
较小的CNN更适合部署在FPGA和其他内存有限的硬件上& `1 O: o. B- e F2 L b/ {& s" \. m* n
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。: ?; D' [" g! }* }7 W( V0 p/ U9 ~
, q3 E0 A; s4 Y4.2.2 SqueezeNet的三大策略7 O* p: {0 m! |) H( h( k
策略1:用1x1卷积代替3x3卷积
, s* {# y4 X& I1 i) k1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
, G5 L& g1 _* t& A: ?8 ^ q- V
+ j, n0 \; r7 W! V策略2:减少输入到3*3卷积核的通道数量
7 I& Z. M3 F$ d) r( t$ B0 U& Y5 a对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。7 {+ j0 Y" D) w: y
8 e" O1 ]1 C8 f8 P1 J策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
: L6 u# C( X6 A2 l$ ^* K这里的激活图(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中。) v1 {1 A i( A/ V: H
3 Y% L6 \; {0 X& A
策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。' l0 p' k; p b+ X$ w0 L
5 q4 O! D7 R: q- u( U
4.2.3 Fire模块
( ^0 ~) q4 D* ?3 G8 u% Q为实现这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的想法。: ^ ^2 a. M4 m' _5 a& u
# A; [3 y3 Q; S( i& n8 O: y% S! H1 k& @$ F, g
4.2.4 SqueezeNet整理结构
" C6 S& w* z) u hSqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
/ s3 R+ o- e* o; s7 k3 O- r9 m
& T6 g% C" X: ^! y. n! r5 @$ p+ s4 B$ ~( R0 ~
4.2.5 代码实现SqueezeNet; f8 @7 S |' P* U0 c0 O8 p' @
Fire模块的代码如下:8 r" j) C+ m$ \& a( \) P
( V, ], \& h9 ?: Q
class Fire(nn.Module):
) C0 h5 M' n; U# c+ ~; F7 x7 E# e: d* y1 k8 Y
def __init__(
5 o9 K* J8 Q% M, u3 v% h' H3 A' N self,- G3 t/ j$ d5 S2 {& x' U. ^
inplanes: int,7 W/ b; x- A" `/ m
squeeze_planes: int,
7 R9 T9 p% Y ` expand1x1_planes: int,; t- D( d0 V' ]4 T4 ]. b
expand3x3_planes: int
( q' ~5 s( j1 M; e ) -> None:
# f# E0 c* G- k F+ e) K- K0 D super(Fire, self).__init__()' L2 ~& K& A7 F3 z
self.inplanes = inplanes
+ H* c; v' w" F self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
; j! p3 a0 @) S+ } self.squeeze_activation = nn.ReLU(inplace=True). u) `8 N; U5 t
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
$ w, I% Q' d6 ^ {/ F( V kernel_size=1); X2 @8 ^& L1 ~) n: g3 @) J# |
self.expand1x1_activation = nn.ReLU(inplace=True)! Z! Y" E0 N+ r0 Q# ~& d3 j
self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
7 ~+ E! `8 t; O5 r7 F5 G3 F+ c3 h0 t: s kernel_size=3, padding=1)# v# ^: [: s4 ?9 v6 t4 h# Y z
self.expand3x3_activation = nn.ReLU(inplace=True)% w* d8 S* f7 [" g- P
4 W' _* I6 h$ G4 B, w5 `" W8 k def forward(self, x: torch.Tensor) -> torch.Tensor:2 ~+ U) d8 h1 t- b! N3 E8 ^
x = self.squeeze_activation(self.squeeze(x))
5 ~& m# X; t2 d+ H$ [* s return torch.cat([ ], i1 ~/ j& Z8 F$ k: y7 \/ E4 b
self.expand1x1_activation(self.expand1x1(x)),
- C7 P0 _$ M, |6 ? self.expand3x3_activation(self.expand3x3(x))! W; p. z: P+ o s2 P' N5 O
], 1)
; {6 P" N# X. G$ A" C4 P3 z6 B2 h' q- I9 m) @
1
# M; A" ~$ E, o1 @2
/ Z( [, t( v) G5 Z4 C30 G7 U& Y/ C' J; D5 z6 V# @
47 I; r) h, \) i) P c$ q* c
5
7 I: _) A6 J J6. _% U( o) U. W9 O
7
$ H5 T$ D) d9 V& b) |+ ]( l8- J3 [* Y! |$ c H
9
" e9 S# { Z( Z v1 r0 P100 a v! [1 e) I' Y: g( Z- Q/ l. u
11, w" `/ Q/ V/ Z: x& S! l
124 d# P% Y# t6 R/ o4 T
13, ]9 F- y9 _) s0 r. C
14
5 }* Z' T8 h# I( {- q+ q4 G156 {' `6 R8 c; H
16
, z0 X r6 X/ h; ?7 E5 w17
% n% `9 r) f& `# x& [; L4 Z188 u: ?: ~/ F& r
19! N: O9 p8 k: f) v: b
206 \9 _ \/ Q& d5 F
212 C$ m" b" `+ f) H: ?
22
) J- u/ I+ x5 I235 @, T H- @0 t6 S# r! n/ P; b% K
24
9 c$ _! Q$ p: Z25$ N9 r y% S# i: h0 t6 u2 ~2 r
26+ z$ e. M- t/ }& X0 E, _
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。8 Q. s% l* S! j/ ~& C* J/ Z# h5 V
; P: C- Q3 F P! V7 P; n! B8 A! wSqueezeNet1_0的网络结构如下:
# L4 T$ V- P5 k
+ y) j& Y& L) T( u9 R I0 l1 zself.features = nn.Sequential(
! c( q2 m) E% X5 E( f2 S nn.Conv2d(3, 96, kernel_size=7, stride=2),! ]# J y- a _1 V
nn.ReLU(inplace=True),
# z7 t! a" p/ L" s nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
0 r* `2 F# }4 b: @ Fire(96, 16, 64, 64),
. S, r. H; S- s$ Z5 P Fire(128, 16, 64, 64),# q% Z! |8 e8 q1 z8 i' s' C
Fire(128, 32, 128, 128),
* f6 |! m' {) {8 {7 b7 I nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),5 v3 U% h* \9 u" ^# ]$ |) s
Fire(256, 32, 128, 128),# }! I9 Q0 U0 s5 Q
Fire(256, 48, 192, 192),2 d& l+ i7 v" A/ _( t% f R
Fire(384, 48, 192, 192),+ C/ n2 p4 A1 Y( X- c0 V ]( v8 `
Fire(384, 64, 256, 256),
3 E! z2 L6 y3 ^. \* ` m% t nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
, A! i! Y8 z- x! }- F Fire(512, 64, 256, 256),
. F- w ~* ], \1 X7 N); Y1 I: I. X9 H9 m
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
1 t! G6 |1 m5 K) ?self.classifier = nn.Sequential( C: W9 M& N4 p* y0 c
nn.Dropout(p=0.5),
% C6 ?3 D& p# b v/ E, E final_conv,
- m' o/ f. o. [$ a) A/ M1 a nn.ReLU(inplace=True),8 e9 T2 K; Q' L" m
nn.AdaptiveAvgPool2d((1, 1))
; @* O( D% S, ?" A* K/ x)
8 q7 j2 W- c4 Z# W& |" b8 ?; A/ @% b* X" M. V; |) F( J3 M3 W
1 s( z) f# }, a, |0 N1
/ ~0 Q3 ]# W' P9 o3 z2) w' t6 U- o Y4 l" u& {
3& D9 k) y* v0 d8 S
4
1 |) J0 e# R# S: c* T; b: S. }- ]+ L5
! @; b( }9 ^ s$ l64 ]5 X6 n! c( n* U& Q* V
7( [ F w2 o B& G/ t- t7 o0 y+ f
8
6 L; x# Y, \3 I1 e1 u9: z5 t% v' v4 W$ m( t2 ?
105 ]# p( ]1 G2 B1 b5 O! z
112 s' v# E1 X* R$ r, e. P7 @# F
12
% ~* u) u( W4 \) \- o8 k5 ?) [13
0 X9 M" i& R$ g6 [ N' H/ o3 |4 q14: ^; C" T. g+ c' b/ O: c0 b. t
15
+ j8 C" ^9 s# e" e6 D+ c/ Q; ^162 h: i# m6 _0 `% F8 q& i4 l1 }
17
; o" F5 R3 q. T+ ~* }* w) l18
& A5 U8 B$ W. @# W L195 G& Y) @& W6 ?, Y) K+ [
203 u# p7 x3 Y, p$ b- [$ C
21# B7 Z! }2 O' Y& R; r& s
22/ }5 o- J' V1 L& a& B
23
0 [+ z9 b! i& _' aSqueezeNet1_1的网络结构如下:
1 C: K0 W. A8 c/ r' I( `/ b
( q4 d6 Y3 v% C6 q5 ?! Kself.features = nn.Sequential(. @) y" Q# \* O- `
nn.Conv2d(3, 64, kernel_size=3, stride=2),
: v) G5 ~4 H6 E9 o3 Z nn.ReLU(inplace=True),
' n! A+ p( d) \ U: l6 y nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
% V* G8 m" u- x, A3 G- l- S& c Fire(64, 16, 64, 64),8 y! b3 j' b! J2 ~' g, v" Q8 U0 Q
Fire(128, 16, 64, 64),* p! L/ s2 e4 m4 z0 w
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
& u" a, H, y, @0 z& i* y9 \ Fire(128, 32, 128, 128),& W2 N1 B; w9 O* i j2 F) F
Fire(256, 32, 128, 128),
' _1 A( |2 z4 _- j( N4 U. ?6 r nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),5 ~4 a& m& D5 ]3 @. ^
Fire(256, 48, 192, 192),. k6 r9 I, Y+ Y) {! S- _( e
Fire(384, 48, 192, 192),
2 s' h: Z$ ^5 }% ` Fire(384, 64, 256, 256),- x, Z" `7 h2 u0 J0 s/ h; X9 k6 t
Fire(512, 64, 256, 256),
3 w: \! C" o) f! H/ T7 E)% E& `. g' {5 I* l- I' m* M1 _, B
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
- y) z9 P8 l( Tself.classifier = nn.Sequential(
8 d: W+ q. f9 `7 | nn.Dropout(p=0.5),$ ]0 e2 b* M+ m( P% b
final_conv,6 Y- x- Q, m- H& A: b- |3 K
nn.ReLU(inplace=True),
1 \4 b2 Q, z5 E nn.AdaptiveAvgPool2d((1, 1))8 m, N7 B. R% `8 b7 u
)
: n z. w' f" h1 Y) L- Q+ h/ R
1' x3 y6 Q# B# M7 h% A" H _9 K
2
" s5 d! {, ?" q5 w3 B! V) z1 }% X* i3, ?+ K- Q% X9 S" Z
46 ?9 O: _5 J" m5 O M4 i- v; U% a Y0 [
5
' [3 ~4 V1 T4 q; R4 k& f, d$ O, J: a6
0 d! [) j$ U" ]' _3 |7 B7 m( I7
( s/ d& Y: p+ r0 T; k0 V2 t# S84 ^, s& I, `" D/ k
9
4 d. X/ G6 j$ Y% W- z( y2 k6 ~: g' K10
- \' i: r- K0 X! Y8 o7 q1 U- i* ]9 x11
. w7 q x5 t9 c+ T" Z12+ ] N4 W0 p2 N
133 P, A) y7 J' u! A4 n
14 |. \9 J6 d, H
155 w3 k/ ^# Z% R& J
16- B# O2 G x: ~8 ~% s# a! Y
17
, x* E$ ]! b: s! R9 j4 q$ z$ i2 R0 e9 u18
: J* \1 N0 M* [" c9 _ H1 Q8 @8 K19
! k, _6 j& O* W s6 M20
: y( s& j) \4 Q21
! ]$ U; @" a \& O6 e0 [22
, o, E+ {1 v$ `$ Q& x; [SqueezeNet各层详细参数量及其输入输出如下表所示。# w2 V% p" o! R( I& S0 d' t, O1 e
0 g! M7 B6 P1 J5 ]/ B& \. s% N
" @3 C# A, N: g2 @% U4 g4.2.6 其他实现细节
1 Z: ?# q6 d2 p) d1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
( e* O' j9 }& j. d Gsqueeze和expand层中使用ReLU
0 G1 W0 ~( H; R在fire9之后的layer中使用ratio为50%的Dropout
8 M7 c: O! p% u: c I7 f2 c& o参考NiN算法想法,SqueezeNet中不含全连接层. ?9 {& K c) l! ^$ J" Y0 \. r
训练时,前期学习率设置为0.04,然后线性减少7 D5 ]2 t" h9 l+ k0 r" Q
4.2.7 总结
3 }: U" z9 Z# M本文最主要就是三点:
^ _: V) \" U* v; q( X" Z, p2 L" h' P
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
% }( r& l/ j1 Y8 L减少输入到3×3卷积的特征图的通道数,减少参数量
! {8 q; W+ i/ _( g4 w7 ?不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率4 E% Q! a. k6 P3 X% B5 o% _! C# a9 k
————————————————
+ w( t8 a5 X) T: A8 K5 ]4 {% Z7 h版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
) j2 ^# e, D4 S+ n9 p7 R原文链接:https://blog.csdn.net/qq_39707285/article/details/1264981003 d" J( {/ V; \2 a4 }3 u& K' w
3 j* F$ y+ q) u0 B- D/ J& v2 Y5 R
0 }& c2 i- t$ k- c) _ |
zan
|