- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564663 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174622
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
& L/ E* a1 b: f; S; z& n$ r
轻量级神经网络算法-SqueezeNet
' }# V! c, l: @/ _# t: A4. 轻量级神经网络算法目录' B8 W6 {' T. Y0 t) O
轻量级神经网络算法
& t/ U! n; t% Q ?6 X/ {0 p4.1 各轻量级神经网络算法总结对比* K/ f3 C2 j& i% Y0 j
4.2 SqueezeNet( }4 R* Z; Z8 \, D( [4 B& m
4.3 DenseNet- @/ r8 T9 x$ c1 m1 ]* x
4.4 Xception
" J$ f$ U0 D, g/ j% H4.5 MobileNet v1, R- c! M9 b- M. M- {$ I$ h+ @' x
4.6 IGCV
" Z7 h7 t/ r9 k+ T) @9 \& Q/ s5 h1 M4.7 NASNet7 Y3 m6 _: M$ w
4.8 CondenseNet( o7 r+ h4 y3 s
4.9 PNASNet
) u' u) a. q& P& F7 F0 g4.10 SENet
( O8 B) X) n- ]% h: c+ v- c4.11 ShuffleNet v1; J& M5 E7 z. }0 g: e5 d+ U
4.12 MobileNet v2
' g+ U! f! H7 B# O$ M4.13 AmoebaNet- N& Z; a! P* u8 A/ D( C
4.14 IGCV24 W2 U0 Q5 l# ?5 I/ Z% X1 B
4.15 IGCV3# y( E- o: M, b9 Q: A
4.16 ShuffleNet v2
1 l; Z$ Q4 i8 t( m4.17 MnasNet
3 }4 a5 G; b- o+ n- ?$ E! _4.18 MobileNet v3% |' U* f) K+ e9 Z) k/ s
深度学习知识点总结
6 H- O k: l' z2 a" B- c( q5 c B+ T5 R+ e; _* ?' h
专栏链接:9 I' [! s& T- n- f) U( w
https://blog.csdn.net/qq_39707285/article/details/1240054055 X& |' y8 }/ Y. ^
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
8 \0 Y4 v6 O$ N4 O: `- [ W
' @( b+ U- b. O9 R& s( e9 k5 p本章目录0 u& x! g0 K8 X
4. 轻量级神经网络算法目录
# Q5 r( r/ M8 y& ]3 t) n a) V4.2 SqueezeNet, O) o& S9 V( z1 o0 z
4.2.1 问题分析- H) Q( `" I/ K B8 P# h" d2 y
4.2.2 SqueezeNet的三大策略
7 X) L- Z9 ^" T, `3 Y4.2.3 Fire模块
+ H5 ~$ H0 ?7 {8 m% H0 J4.2.4 SqueezeNet整理结构
" G) V) D9 a G( w/ V" q$ W% v4.2.5 代码实现SqueezeNet
$ }: { n$ y6 t3 k6 \( E4.2.6 其他实现细节
0 c& ~1 F; F1 D0 \" y p* m4.2.7 总结5 l# P. Q: }, z( E
4.2 SqueezeNet9 P8 d! t' }+ c4 C
4.2.1 问题分析
( q+ t7 H- k( a3 g. I( f$ e- Z最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点: L7 C" f7 ]2 |5 L. e! W
( j% @ z4 D( y- @# J4 h$ I9 ?
在分布式训练期间,较小的CNN需要较少的跨服务器通信1 v9 K) h7 m, p7 X+ }8 I* D+ J
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入' e+ p3 R6 N; d' A0 x8 I0 O6 S
较小的CNN更适合部署在FPGA和其他内存有限的硬件上2 R1 `. j7 D( x+ ~7 P
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
4 U8 _& x! z) g! N" J% a" t7 u9 `. ]& i: ?, m7 M: }) r6 K+ E3 g
4.2.2 SqueezeNet的三大策略
. F, v6 F. P8 N/ w策略1:用1x1卷积代替3x3卷积
; Y! e) \, G" X2 `, ]% \( [7 v1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。% H: U4 L9 s5 a: ^
8 D2 @; E' X* ]; l+ c% {
策略2:减少输入到3*3卷积核的通道数量) S8 i S* {7 d) \' U0 b6 X
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。4 {2 I5 f. j" Q- g7 q9 X% Q
/ t) @" S( a! w* F- M5 s C0 v b
策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
) S1 z+ ~6 Q$ P; s) 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中。
/ X: K! D& X# h* u0 ^2 h+ F' \) u1 d+ [) U, b) s" P
策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。, q& |2 x) ]! O* `4 ]
6 N: ~, h6 d& M, V/ z# R" h4.2.3 Fire模块
+ ~+ G( d( R% h为实现这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的想法。( y0 Q9 R" u4 B& _& x6 Y
0 Q4 c. A8 d) b/ `8 B& E4 f
; t, k/ n" l. \# ]3 k4.2.4 SqueezeNet整理结构
' z5 t$ I+ j2 k& Z8 |) `% tSqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
V$ a/ B3 B& z- u/ \8 v/ ]# ^) f
; d7 w3 v; y. N. ~5 D- [4.2.5 代码实现SqueezeNet5 T5 K4 ?+ c F, L
Fire模块的代码如下:
* @8 B( C# f$ u. p% h, c& k# \
& w' U7 }: p. b. w v! p2 Qclass Fire(nn.Module):
- l9 V8 d* u+ ]5 I% W
0 M3 M' a% ?1 |! E' V! x% H' V. y def __init__(
0 h" G* w0 w. p/ z self,
} Z$ A# { h y0 Q/ \ inplanes: int,
; O7 L6 [- H$ K' f squeeze_planes: int,
1 x H! Y3 S) O+ ?! a9 w expand1x1_planes: int,; v) i6 o+ B" m5 L$ T5 @
expand3x3_planes: int! b7 R/ u4 O& i. w b$ h/ j
) -> None:
. j; i" W% ^9 S super(Fire, self).__init__(); Q2 G4 z7 l" j8 a; p
self.inplanes = inplanes
: Q: ^9 d5 @7 i+ Y self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)0 r8 Y6 ?, a9 N3 {
self.squeeze_activation = nn.ReLU(inplace=True)$ P1 f, g4 v6 M1 y6 W$ v2 I0 L1 ^# z
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
- I7 ?! g, [% |7 f) L* F kernel_size=1)2 M2 `% E* p- A) K, M7 g# i
self.expand1x1_activation = nn.ReLU(inplace=True). W ]! N$ b3 ?3 Y G
self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
& c4 Q) M" H" v kernel_size=3, padding=1)% e! h6 a. ^" `; D9 ^
self.expand3x3_activation = nn.ReLU(inplace=True)
, f- ]. E, E! n/ T% X* r
/ ^0 Q0 x# e2 G c" y def forward(self, x: torch.Tensor) -> torch.Tensor: E" q0 z, }, ?! B( t2 l
x = self.squeeze_activation(self.squeeze(x)); b' i- Z* v' d6 ?1 z5 d
return torch.cat([ F0 N' |3 {, f
self.expand1x1_activation(self.expand1x1(x)),* }) _: O; C, g3 V
self.expand3x3_activation(self.expand3x3(x))) @3 s" v; X9 G6 p1 S. l2 M0 ?) r
], 1)0 l7 `! R6 S; {) A$ \
! W5 O) I% L( r& Z6 m5 i* y! u1
# |& v. C' n6 ~. M; a" S21 J! n! M2 O4 ^8 x% P. T/ O
3
9 T8 U, I3 R* V, z* a! U4
+ {9 M& u3 S& n6 m& ]- t& @, f5
! F9 y7 }! @9 k- s6
' O) l/ t f( p( [7
+ }+ K# i9 Y) K" m1 `% Q83 L0 s* V4 Y' ^3 X
9+ n& Q: ^6 S6 B B8 T# m. W$ l4 ?
10# S5 U# N0 M L
113 ~7 i2 z: M2 {0 X, V2 q- O
12
5 X, f* X- f3 |8 e# z$ d N" I* L! i13
5 J) l0 B* u! N: H) m; t14/ u8 F, H# r. w: V2 z5 A* @0 ]
15
/ P4 Y! P1 d. f: _16
, A, D' e! ` F a. u17# s7 j. S* k/ g$ o0 l' ~
186 j! s# d' E& w" p, m4 S# X
196 ^! l$ v5 R3 y. t+ j' S0 X$ N
20
9 A* ^6 I; T" q p8 |217 L% x9 s1 ^1 e9 t1 d, ~
22 T5 p2 I" D; J2 Z* T3 Q1 M
23 ~9 _5 f: `, {) y6 P. t2 R
24
) g. v& ^6 h8 ~8 G/ X/ t25
9 Q9 ?% \$ {( h26& p/ n/ L" U# z$ j
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
9 Q$ f: F; d( z3 x) T, J2 o, e$ }# D, m$ m& a& S
SqueezeNet1_0的网络结构如下:5 ~" c$ W5 g3 z, Y/ ~
3 j2 W- j ~, w' z( r5 k' X' J
self.features = nn.Sequential($ o Q- _8 T+ }. u8 g. P1 |' [
nn.Conv2d(3, 96, kernel_size=7, stride=2),9 l+ [& V7 ]5 i5 S2 c6 _
nn.ReLU(inplace=True),
$ h' G3 p( v0 C8 s* r* l) U5 T nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
" L8 l2 K' g5 } Fire(96, 16, 64, 64),
1 E! T( w+ ?! G& X Fire(128, 16, 64, 64),
?, b0 m( M$ a Fire(128, 32, 128, 128),
1 L" t4 C: C# Y7 `* ` nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),9 ~; o5 F8 @: Q+ s
Fire(256, 32, 128, 128),2 b/ F. h3 M, x* ]& q
Fire(256, 48, 192, 192),
2 u8 ~8 ]& | g% L: G Fire(384, 48, 192, 192),
$ A/ b! W6 y/ t5 _1 C Fire(384, 64, 256, 256),7 f1 @% w# W9 H/ I
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
3 z/ w; R' f8 t: f8 M! b Fire(512, 64, 256, 256),
% x7 n6 o3 [% C2 C) D: W/ J)6 m3 n0 ^: C' P+ I' q; q/ z
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)0 x* i# X) `1 A; \
self.classifier = nn.Sequential(
0 M" x. d; m( y) Q, V1 b6 n$ n nn.Dropout(p=0.5),
' P1 L; Z8 [7 s2 J7 v% t* g final_conv,, J5 Y+ i; x4 z5 H1 S. O, ~
nn.ReLU(inplace=True),
8 o( x6 J3 R2 A4 C4 h( M- B/ V nn.AdaptiveAvgPool2d((1, 1))
/ h' O( S& i9 ?( \5 S)! M2 I8 v9 L% {# Q& _; Q; E
* D7 [3 O( W# P" r
9 A9 J, j5 ]; W2 Q) n
14 n9 N% i' ~. U. o
2
8 @! ~) J9 }. T1 @3- w( q/ L; j5 Z: @4 t
4! `7 Y: M c% M+ a, b
58 E5 g: f u5 q! y) o& [$ j- n" J
6
9 ~/ ]! Z) R& T7* p& {) {7 i l
8
# S \* F4 X! @95 T& S# \# _# W/ X8 |: W
10
G$ u: n" S) r: F- B: N8 p11
; v$ k0 a1 U8 ?12
/ K& S, i3 u' s+ f13
% R# o8 i' D2 @/ T6 X0 g147 L/ B! J T4 O
15
( ?, d0 b9 w1 U) M2 V16
: ^! J; Z( |7 t6 {5 l17
- q$ O5 }& F4 m! y8 U181 D1 e% I' R! ]; @
194 N l ~; B8 @6 J! J
20
; V0 Z9 L2 L2 _+ T2 a" R4 }218 E9 L+ U/ _" [/ [) }
22& |& p: v6 t; T
23- }2 o& }3 [4 |2 |% w4 D
SqueezeNet1_1的网络结构如下:
4 d0 @5 e% A8 `4 j, Q2 [- _4 _& O, J, M; O9 O0 }6 O8 b
self.features = nn.Sequential(; M0 @/ H' |8 y/ e% k- F# f
nn.Conv2d(3, 64, kernel_size=3, stride=2),+ ^1 h& \# }! @" Z
nn.ReLU(inplace=True),
; d* x7 Z$ b- Y, h$ B, w, }8 ] nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),% d( k' ^9 P3 B! {
Fire(64, 16, 64, 64),
: K* L0 n. K# I8 J6 X5 Z7 a% K Fire(128, 16, 64, 64),3 a# E' H) x4 ]4 M0 U
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),/ a: R! f8 i! l& e
Fire(128, 32, 128, 128),, m" W3 g3 e% Z, P
Fire(256, 32, 128, 128),
# L5 |0 q" H y$ q, D nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),: M/ O+ g5 p% I/ y0 f3 f
Fire(256, 48, 192, 192),
1 Z( X4 Z* F' Q1 B! x+ M Fire(384, 48, 192, 192),8 U" M1 p2 r% o
Fire(384, 64, 256, 256),& \, z3 N* X4 L6 a& {0 K5 M
Fire(512, 64, 256, 256),+ s7 |" b' P) r- k6 {7 k
)
8 F9 _4 m( i( t/ x+ ffinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)$ L7 H, }$ J8 T( s
self.classifier = nn.Sequential(
o$ d8 Z% r7 ~ nn.Dropout(p=0.5),
; z# h: R7 Q! t' |9 b3 ] final_conv,
. ]4 j. Y( m' F8 u. Z8 S nn.ReLU(inplace=True),. d% z) \7 a# q& ^
nn.AdaptiveAvgPool2d((1, 1))
& M o0 n% x2 m- ^7 u). z) Z2 e' g: Q5 \% N- f3 b- H5 T
( u: c9 L- H4 M {1 _: i1
& h$ C% k: G. y0 ?' L2
s% k9 s$ r4 d7 V" `) A+ h( S3
- m1 `# g5 q# p# {$ x, C1 m4
" \* ?; Y: I3 n3 Q5# B* k {7 x- H+ o- j" h+ ]
6- B" Z( Z3 s9 `. y- x
7, O$ J' ]! t P3 p0 o$ U5 k4 c
8' r9 l" |2 i6 @# o( ]1 e
9
9 N, Y `& ^0 ]4 M' T102 W* E( P5 q o, I2 j$ i5 J
11$ L, v- [ ~! r- z- d; `
12! ?; ~* f+ v5 i! }; h# B5 j
134 d/ A' B$ @ P
14
" l: H1 W' y6 }( X9 U( V7 x1 y6 ]15
- j9 h% c5 r o F4 C16: c6 l2 M' c" g5 }0 U" I1 [
17
0 v+ ?7 r; t" l8 Q! D) d186 ^5 O$ |0 ? F5 L
19( ]1 f; m0 M8 v0 z' [9 P# g$ O
20
: l" Y: C6 \8 u7 K21) }: n# O: D6 r( N
22
/ O7 \, k, y6 f/ FSqueezeNet各层详细参数量及其输入输出如下表所示。6 W5 A5 Q* V4 f: d& ^. Q: q
/ n; U) t( P) v. m! c) ]
! G; b7 b6 [9 ]- c' P' |3 S
4.2.6 其他实现细节* M% i4 }% {! s( b3 @0 m* R5 p
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding. \+ m9 x# H- U: Z: f" Q) A3 t
squeeze和expand层中使用ReLU
+ A5 z) ~ ]# Q0 z7 a! I在fire9之后的layer中使用ratio为50%的Dropout3 N' ?) _1 o: R8 }, i* y9 |8 [6 F
参考NiN算法想法,SqueezeNet中不含全连接层
" b' h# V& Z4 R+ W1 m1 R训练时,前期学习率设置为0.04,然后线性减少! X3 a! V) u2 ^3 M; ~
4.2.7 总结! n2 v1 P& J. _4 L- x
本文最主要就是三点:/ ?; _% m0 m3 j. ~, W) p ~8 a
; K9 g0 p8 Q0 @用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果. S- L9 w0 @2 O0 Z: o+ v0 r
减少输入到3×3卷积的特征图的通道数,减少参数量
$ ^: @! W& q1 b+ I9 t6 h不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率" T3 o) A$ l' P) w1 v3 C6 c, X
————————————————8 _0 \, `0 c. M. i; [" S
版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ V0 `% R: |' C \
原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
% `- w5 {+ x% c- U8 B9 q( ~- t/ d% p5 y. ]' n" m
9 l# a* q0 F. [ S. h |
zan
|