- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569615 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176107
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
! }1 X4 `4 [/ M* P+ C轻量级神经网络算法-SqueezeNet
. s# D6 R* W3 n: a$ x4. 轻量级神经网络算法目录! @$ i# L0 Q5 v$ {# a2 v6 i
轻量级神经网络算法
8 F1 M* k' v1 n6 \4.1 各轻量级神经网络算法总结对比
$ E% d# i7 R# J9 V4.2 SqueezeNet/ E3 B! `* d3 D: _
4.3 DenseNet
7 }! w( U7 [* ?- E3 f* j5 L4.4 Xception
1 x& |4 p% N7 k, i7 g# Y0 ~4.5 MobileNet v1* W; @9 L+ T0 P
4.6 IGCV3 a7 X$ c! P- l- g+ v/ L# v
4.7 NASNet7 w2 f( I6 I+ {' P5 v, \% z
4.8 CondenseNet
+ w# D9 t; ]/ ^0 \7 f4.9 PNASNet
* `! f4 f8 V7 g8 D9 U, N# J4.10 SENet4 q+ d, [+ {* q M
4.11 ShuffleNet v1" Q: A# ]( w+ H2 Q* D) q) L
4.12 MobileNet v2 H) y! x# e& Q. [
4.13 AmoebaNet% k3 R- I v2 l" y2 ]2 g2 _
4.14 IGCV2, i( ?* i, Y& E Q- ~/ Y; k
4.15 IGCV3: s2 _# t" I$ [) n7 z4 K
4.16 ShuffleNet v2
9 H0 o' g4 w- } c! q$ J4.17 MnasNet
. E& v* p$ \" b0 H+ b4.18 MobileNet v3
y c( n/ H9 g2 e深度学习知识点总结( Q- {; N, ~5 D! j- g# U% ]
5 x2 x# x$ U4 i# g9 o4 n1 I专栏链接:
4 k Y. Y' A+ A' J% r1 ? ]9 v! ihttps://blog.csdn.net/qq_39707285/article/details/124005405: I Y! A. j; }) T" d/ ^( z& s
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。( Z; s2 B! Y4 s; O; n6 r% Q
6 |# u' v2 ?6 p, i4 m5 Q, ?
本章目录' i/ f2 K0 {7 B4 b; d
4. 轻量级神经网络算法目录 _* u' N, d, D, Y1 q
4.2 SqueezeNet
0 q' |! L( W% C- P2 o4.2.1 问题分析
/ ?% p- C* f* I/ r2 ?( e1 C7 M4.2.2 SqueezeNet的三大策略1 g5 Z, k# Q3 u+ b( Z& s
4.2.3 Fire模块7 G5 u% C( D2 ~: F8 b& X$ e$ {1 h
4.2.4 SqueezeNet整理结构
+ r% W9 f0 V6 Q! q' O4.2.5 代码实现SqueezeNet8 O$ ^) j1 p6 w+ x/ H
4.2.6 其他实现细节
% u, v, g7 M* g" S+ I4.2.7 总结2 N. z" ~0 \* c# ^
4.2 SqueezeNet# b$ [" g M j/ b- h3 }
4.2.1 问题分析% C0 A8 ]% B3 x' y
最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:: \( Z, A! u8 ^6 }, b: {
5 V2 P4 J/ z6 q& h- z! H; p
在分布式训练期间,较小的CNN需要较少的跨服务器通信
( `4 V; F7 F2 \* _: z0 X2 d在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
) p) L1 n" P6 s3 ^3 T; l/ w5 j较小的CNN更适合部署在FPGA和其他内存有限的硬件上/ i* d: B- M: q/ [+ h
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
1 g) \# X- |: ~ P9 z) G3 L
! l+ D. ?7 X( u+ I4 _4.2.2 SqueezeNet的三大策略
" n1 w& |% ^* K6 w& I5 ~策略1:用1x1卷积代替3x3卷积
7 g s$ z5 x7 u6 B/ B g1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
' g7 m$ |8 o- N
( a' Z" W! y/ r" }4 @策略2:减少输入到3*3卷积核的通道数量
% \! ^) I( q$ n: l( \& P7 K& c对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
" [- g7 |/ S0 c+ f# q% Q9 A9 i: F
* M4 b; k* X! Q1 U策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
' A$ |4 O. O. ^4 ~: W# m* ~这里的激活图(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中。7 @* A& q0 R& s
" ]- a% b' _8 }7 v2 {& t策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
8 {; f5 c1 M% A7 B ?
; ]! x2 X1 {1 W: e6 F+ T! G4.2.3 Fire模块
# t. Q# g& ^' T0 S8 S; j+ [为实现这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的想法。
4 }& L. ?4 W) p( v0 j
% U7 v6 B2 l( b% ~8 f
0 s, I0 Q( z2 L4 ~2 p4.2.4 SqueezeNet整理结构
3 f& G- x1 ]0 a, y; o8 NSqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。: y+ Q+ ~+ M0 R5 n& L! r+ X
" Y3 `8 O* s( {- ]
) R3 L. g* g7 Y8 o1 X
4.2.5 代码实现SqueezeNet
2 E5 R `8 Y6 ?2 `3 [5 ?- L2 M MFire模块的代码如下:# q* t9 n4 P+ W0 X* Y
0 @: `) T. j; q/ n# J7 Xclass Fire(nn.Module):
; |( o( ^! ^9 ~3 [: c, P0 V
8 \% H( [8 i/ h9 P1 @* H def __init__(/ r, a4 a* G; R* V9 R; Z0 H
self,# R9 h3 r1 `2 O2 k% G4 K
inplanes: int,9 t+ i. S" x9 v- n3 ]1 z
squeeze_planes: int,
( p/ {# |* [5 q1 [& p: p expand1x1_planes: int,; ?) {7 `: C6 v
expand3x3_planes: int3 X# t1 O( Q) T' _1 Y" B2 V3 w
) -> None:! r8 y' {, H: g. C
super(Fire, self).__init__()
- N" l: G" w0 X$ o* j; }( j self.inplanes = inplanes
( q+ ?' [# R z' @6 r self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)3 I3 p8 @' ]+ [" f, f% n
self.squeeze_activation = nn.ReLU(inplace=True)5 a8 k$ h$ B8 q$ w3 v6 s
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
5 {. y8 Q. v2 h" E% O3 f$ ~ kernel_size=1)
$ I. m9 K- [7 k( W% p" Z1 i% G self.expand1x1_activation = nn.ReLU(inplace=True)
# e6 D( u& H, M1 U self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,3 d+ Y u d1 w
kernel_size=3, padding=1)0 Z- Y8 Z" E. O1 p) u/ M
self.expand3x3_activation = nn.ReLU(inplace=True)% U. J4 \8 F- W
2 e8 g1 O6 _: N def forward(self, x: torch.Tensor) -> torch.Tensor:/ w' Z- u# ~. U4 d- Q
x = self.squeeze_activation(self.squeeze(x))
- w8 y$ E: J8 \( ~5 y return torch.cat([
# ]0 |: O8 |5 E. N" ]3 y1 p( F self.expand1x1_activation(self.expand1x1(x)),5 y1 l9 f& [/ e
self.expand3x3_activation(self.expand3x3(x))4 u& F: J- X) H# Z" i& ]7 x
], 1)* t+ z O, D# w6 P* {1 d3 O$ ]
9 U& `- p2 R5 E9 t3 b" k9 u% E, P1
' x; k- k1 T6 Q/ k/ X- B) K' `2) |. }% ?! p# u$ T$ o" n
3
' \$ {: q2 {' }( ^4
4 D- E3 J2 B" N3 A. x; y& K1 R3 S5/ U5 }$ i' }- [5 x( l9 u; P
6
' m: n4 U( f/ ~3 }9 l7( V: o, }' p7 j m4 p
81 d9 m" e' p* @! N: ?* _7 Y* K2 Y
9
( o# }) b/ y( x- l10/ k1 A# j2 l8 l5 c: _) l
110 n1 y( A6 I+ N4 O" V
12
8 P- A% J5 Z( P4 L1 w% t3 s- q1 N13/ a, S9 Y6 c. |- I* P; k z7 F
140 X# I% k5 O! n( g8 ]5 M
15; x7 S: G1 C O( h
16
: d3 a- m" p8 V2 k17
5 ~- r, I1 s# Y) i18
' e4 l. p! p! n" c* k$ d191 o5 m( ?( a* I8 t- k! ~
20
" `) s2 h1 W# H5 s i& E21
; y% K0 Q8 U8 X. P- a" h; I2 I22
0 q! ~( w! {% n23
& G O0 f, }% d4 @' `% v24
7 F: _/ i' x" N _( c255 d9 T, L, ?, V" F9 G& E' _
263 k7 q# X" |7 A5 U4 U
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
( D5 T' I+ y- [. K, ~ H4 C
/ W- J' ^ ~4 q. h9 v; l, V" qSqueezeNet1_0的网络结构如下:
k( y! ^+ C4 F% D; f' g' C
/ C( R; u. g7 v v$ Nself.features = nn.Sequential(4 {$ G( f/ M, s- H+ C' K$ j+ E6 T
nn.Conv2d(3, 96, kernel_size=7, stride=2),# f" [- B& D' C' a6 I
nn.ReLU(inplace=True),
9 v5 k8 l, V: `. } nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
' D2 ~2 J# X* p9 R/ } Fire(96, 16, 64, 64),9 c4 r0 N* W6 f. W0 r
Fire(128, 16, 64, 64),- N( c$ F6 o* g
Fire(128, 32, 128, 128),
. r& D5 } [* S1 G) H: V nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
+ @4 m1 T' C3 O! ^4 H! ^% _; N Fire(256, 32, 128, 128),
9 U0 u9 _* K. P/ w8 ~7 r+ n Fire(256, 48, 192, 192),; ]/ A. W' Q' `: D. [. _, P8 ~
Fire(384, 48, 192, 192),4 Y2 H$ @4 D, o ?
Fire(384, 64, 256, 256),4 h4 X' R8 R: e! e
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
) w* r: n7 h# ~* U* p3 M+ b Fire(512, 64, 256, 256),3 R% H4 P a0 S' H
)
% p3 ?7 ?( G% m, o. `final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)% p3 w! ]4 D# }) x* c: F9 J
self.classifier = nn.Sequential(
& Z! _# P! Z5 p" f7 S# u nn.Dropout(p=0.5),6 r- @) m7 V8 t3 l' L
final_conv,* S, T- v- {: B
nn.ReLU(inplace=True),& ~" g( I; m* ` B7 K0 }2 N
nn.AdaptiveAvgPool2d((1, 1))7 }/ Z0 m. V: ^) I
)
- k I5 _7 H* b7 J3 m7 P# R/ ]; q' Q4 h& E0 Y- A2 j
& g o U" J5 K+ X0 T+ s3 @17 p% s, ?& d. i2 P6 a# X
2
) F! `8 u% O R2 p3
- `( t+ I+ e, x1 N, O46 W7 Y, ]( c. c' P4 j7 u
5
) \7 O% l9 S. ?( p+ t- s6- F, }+ b3 j+ N
79 h& k; o A0 a- F+ G
8# V/ X4 W% }6 i y6 w# H5 t
9% l' y, u- C3 c0 G+ p- I* T
103 X% j$ p' ], _
11$ r5 K; T' t, u0 F2 L( ]
12
3 r! e7 F: b5 W4 Z F13( p5 _+ K" K1 [7 x9 k' x
141 ?9 y/ k) L, a- u% H- s" ?
15( c# j' l- t3 | v) v" @
16, L; T( M( a1 ^% @
17
9 a, a- a) h( L5 i18/ x- u* I& L. M% I7 k) H7 Y
19
+ b7 `0 ^0 a4 R20
# t6 k9 L2 a2 G0 e1 l2 S7 F: h8 j) n21
8 A2 [0 |9 `6 ~% z: T4 j3 E22. c7 m- j2 W, `) W
23$ T \6 _1 L* D9 L# r. d
SqueezeNet1_1的网络结构如下:
0 i+ C" n" W8 n
s3 q0 }* l, C1 T6 ]0 cself.features = nn.Sequential(0 R N! ^+ o4 x0 b* o1 Q
nn.Conv2d(3, 64, kernel_size=3, stride=2),
0 Z! ~$ i8 n7 o7 z" S! v nn.ReLU(inplace=True),8 t/ Z/ U% {5 [' _
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),& Z# ]4 m( o. y
Fire(64, 16, 64, 64),
5 C' V8 M8 m$ p) z* @" w M Fire(128, 16, 64, 64),8 g8 t& d& i& [+ H
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),5 K- q0 {, |3 P
Fire(128, 32, 128, 128),) t6 j" E1 s) E" {& N4 y* b2 D$ i0 Z
Fire(256, 32, 128, 128),( {: p% Z( L k. l0 a
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),9 @6 a. m. }# K' A& B: E8 F
Fire(256, 48, 192, 192),
# D0 e0 i2 R; K' o, E5 q9 k Fire(384, 48, 192, 192),' N% S2 y9 ~4 x) q# a& l! W5 X; @
Fire(384, 64, 256, 256),
2 ~ _! @: t5 ]9 g Fire(512, 64, 256, 256),
7 v" U4 P7 B3 S7 o0 g)# f8 D, p' W- y' m" }' Y) I
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)1 d4 s# H, k7 b% q9 ^( M/ v) F5 z
self.classifier = nn.Sequential(
n U6 H- I! R# m8 i$ r nn.Dropout(p=0.5),
* P, ~8 ^7 z8 `6 } final_conv,9 n; n) ] B) f% p4 `5 o% q: |0 f ^( _
nn.ReLU(inplace=True),- G, z+ l( z1 i; ]* Y6 Q4 Y
nn.AdaptiveAvgPool2d((1, 1))
3 \' V' c# P7 B, G0 `. f)
" G1 q! Z: m: }2 p! C
( b3 X" @/ G: R: Q- [* S9 m2 ^5 f$ }1
0 ^4 P. T o: h8 w& p8 I8 N21 w% ~+ C. a6 \* x6 D
31 P1 X# v0 l% K* ]: z. Y# \: U
4: w- A5 U1 z' }
5. t6 q: v* h6 T$ ~
67 w: Q4 X4 O& ~6 h
7$ a: s( |( }# T' C% b! Y
8
/ H" E Y1 q0 B; \2 \: l! S* p9
8 N: ~3 A) V7 k103 d) M- q8 \& }3 B# u% Y' ]. |
111 ?2 x$ g+ |* ~3 A& m& L, n7 A
12
; V# F1 r0 }" q+ ?8 E# U3 b13( M3 S2 K5 r# C P. R) f
14# ^. t* ?! i2 o- ]. s' j, Z( z
150 F8 m- ?/ U( T5 p. t7 D
16
& a2 C0 z5 B. J17
# n+ Z7 N2 j) I0 B18. i5 q- o' \7 G, Z$ U+ u9 |
191 m5 f' I# ` d$ ^" I8 W4 V8 c9 E# i( E
204 d2 n5 |. F7 N
21
8 d9 D, }# n; q22
2 N4 ?/ C( f3 m+ c' j' F( sSqueezeNet各层详细参数量及其输入输出如下表所示。3 R8 k* m7 T2 B1 M* r
$ A- Q0 S; n2 G( i
9 r7 z- z; X0 \+ _4.2.6 其他实现细节2 W* I( ~ V* ~
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding4 c m! v& d$ J
squeeze和expand层中使用ReLU
l& O. E. }# a在fire9之后的layer中使用ratio为50%的Dropout
' U% F6 }7 u \: F1 M/ U6 {参考NiN算法想法,SqueezeNet中不含全连接层
1 M( l! P9 h; P! [/ D, o& N2 }训练时,前期学习率设置为0.04,然后线性减少3 H( ~8 ?, ^: t2 s! K% A
4.2.7 总结
/ _9 g6 I, K1 A3 f0 B9 h7 T本文最主要就是三点:
+ I% c2 K; i0 [7 M E0 `' ]
6 y" N+ `. G' z8 B用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果" z# |, j& y, Q7 Z, d5 z
减少输入到3×3卷积的特征图的通道数,减少参数量- ?" V% \, M$ t. H
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率
3 B& G% n7 @* t" s+ K3 q/ b7 m————————————————
8 k2 }( ^$ @. b* \; J& w版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
* {( ]# \ Q0 L+ y4 L/ L$ v原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
+ ]' k/ G( J5 |% M- U! a9 S) G: v: R7 \
( U( _! U, W4 D7 I5 q9 l) e0 J0 S8 X- [& _) K, K/ g; [
|
zan
|