- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569639 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176115
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
: q$ m9 ~3 X6 B F4 c/ ]轻量级神经网络算法-SqueezeNet
+ x% w" n- K$ |5 b. X. L8 U" [4. 轻量级神经网络算法目录
+ n* x* I n7 V+ B7 U/ ]& z6 ]轻量级神经网络算法. {) o" c% A1 V# L b& ]
4.1 各轻量级神经网络算法总结对比
# Q7 C v) N7 e0 f4.2 SqueezeNet
. i4 Y7 `" I3 D3 R8 r& ?- ^4.3 DenseNet
7 |" z- y) K. n4.4 Xception
0 Y8 W* U! J7 c5 q1 g! F; |4.5 MobileNet v1& J6 p3 l5 i, D& {" I5 d7 l) p
4.6 IGCV
1 H: w/ n( r3 K: R4.7 NASNet8 j. y4 P1 z# G! s2 z
4.8 CondenseNet
0 U* @) S0 Y5 T* x0 ~( b4 c0 X# \4.9 PNASNet8 V( H. W) f8 u4 w5 w7 F1 ^+ A
4.10 SENet$ d% S! a5 p+ F8 b. m# K" h5 `
4.11 ShuffleNet v1
( |, x" }" b) W" V0 X' }9 [% T) ]4.12 MobileNet v2
4 S% W9 ?- g8 a) Q: \3 r4.13 AmoebaNet/ l! x5 i- @) R
4.14 IGCV2
4 n. p6 D% [: {- K; O! B+ i4.15 IGCV3
. |! ^/ o+ _0 o R4.16 ShuffleNet v2/ k7 A1 L+ E }. @7 H/ A
4.17 MnasNet
2 s, P6 D5 v+ Z' z4 y4.18 MobileNet v36 l& v5 _/ P* [& ]- \4 c
深度学习知识点总结
! o% w6 P' A( f" \. p' v3 P. K
7 D" |: l( H2 z$ C( g& y专栏链接:
, s J( a/ D! D" Bhttps://blog.csdn.net/qq_39707285/article/details/1240054051 f/ K% ?" k3 q
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。) d- _4 i: P3 e8 N: T8 t
, S4 ^. a ~ K本章目录4 _- ]7 Y) c/ \
4. 轻量级神经网络算法目录
# c* A9 m8 Z! v8 z4.2 SqueezeNet
# Y2 o# J: D6 i4 w# [( a4.2.1 问题分析
+ @2 m" L# \6 ~5 W4.2.2 SqueezeNet的三大策略
; o; f3 t- {0 F9 {' c( [& \" G) S4.2.3 Fire模块
2 j3 c @5 E2 C6 |; x( n5 p4.2.4 SqueezeNet整理结构
0 O" W. ~) N# t7 T- z# a4.2.5 代码实现SqueezeNet& U/ U# P2 \* _0 S' X$ q. k
4.2.6 其他实现细节. G% X2 T, M* M4 O; S$ w8 a% e; E# T
4.2.7 总结
* e. |9 i s( C" O5 [- o4.2 SqueezeNet
+ M& c" `+ P! @7 T( w u4.2.1 问题分析6 x- L" B4 W8 \* d9 f p) W
最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:* _( p' Z; e1 K5 }
\' q' n- U' Z) k5 x5 M1 ^
在分布式训练期间,较小的CNN需要较少的跨服务器通信
5 ~0 E& A* y) q: _在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入+ g/ e( l) k! e- |
较小的CNN更适合部署在FPGA和其他内存有限的硬件上" `" s$ ~6 H; [. K! V6 s
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。/ c6 G6 z) Z1 D u7 L
, B# j6 i1 l( t6 {- {& P
4.2.2 SqueezeNet的三大策略
9 Y# z! c) e& _; i5 l0 X% J7 Y9 X& I* q策略1:用1x1卷积代替3x3卷积
6 r. F8 [% l: P# R( C1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
4 S- [1 C( \: W" X& P* \! V8 r* _. m* U! [( k; h- u
策略2:减少输入到3*3卷积核的通道数量
5 Y2 R( L- N8 [* O5 p: x/ }+ K3 O w对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
: x+ }, V* u. ^. p; `' V2 P
; P; D V) R% \4 o8 h# E策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
7 x. s: j+ @4 `1 L+ R. O6 q这里的激活图(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中。& d. `% }5 u; q2 u2 \5 ]
% d* R0 ]' | n& Q策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
+ N8 H* f u6 Q W; K1 X+ l2 d1 I/ g, J( _) i; ?: R/ }
4.2.3 Fire模块) l7 _1 R: v/ y9 P" g8 \- P
为实现这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的想法。
- o+ ]1 h' \3 w1 G0 V: m, M9 j
! J; l5 X' l# n; e- a& }. z. s- L* {8 ?* ^* H' p4 b
4.2.4 SqueezeNet整理结构+ K2 `# S; S# B( o- A/ q
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。6 G) M: s- U* [$ o9 F
' B; j1 t H( i/ m1 p
: y' P Z6 C3 y8 _0 ^4.2.5 代码实现SqueezeNet
; l$ [5 a# m+ n9 q: X( @Fire模块的代码如下:9 H7 c) i( V2 w4 @+ j! ^
' B! }, W' u" T4 }( ^8 `6 Yclass Fire(nn.Module):
x* W' x8 L% K! Y* W- L: L4 e/ [, `: Z$ g9 I+ Y3 ?" j
def __init__(- g1 F6 ]$ R5 S, ~* P" }: V5 V
self,
: v- V( ^) V9 s inplanes: int,
% e0 p, K0 x* I/ ^' o: x squeeze_planes: int,
5 g2 x0 {2 t" v3 Z% t: T+ t! ~% L expand1x1_planes: int,
( D+ D0 |; c8 r. l: A+ p. j expand3x3_planes: int
7 ]! f1 l& a/ f3 A ) -> None:7 A( W, k6 l5 | `- j2 h
super(Fire, self).__init__()4 F" O8 u* _/ e- B3 ]8 r# x
self.inplanes = inplanes4 C6 C2 l( E0 @
self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1): q a" W4 y- i( O
self.squeeze_activation = nn.ReLU(inplace=True)+ g6 r4 B0 j1 G8 ^& Q4 i/ F
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,5 f3 | ]3 C i; Y" a( U+ i
kernel_size=1)4 U. A2 \ ^+ U- {& n, f- g
self.expand1x1_activation = nn.ReLU(inplace=True)
' i5 i* X- e, Y" Q/ V$ N6 x self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
/ W) r; c9 m) ^# W5 A kernel_size=3, padding=1)
' I* V& _7 i! ^ self.expand3x3_activation = nn.ReLU(inplace=True)
2 s! L6 |: `, S0 b& l- q, m$ ]1 p3 }
) Z- M5 W) o& s" h) S, ] def forward(self, x: torch.Tensor) -> torch.Tensor:3 L7 Q5 k) m+ S: F
x = self.squeeze_activation(self.squeeze(x))
1 U/ x( |9 I" q- ] C8 b return torch.cat([
- u: X% A K2 c$ S* P self.expand1x1_activation(self.expand1x1(x)),# c1 B' J {# W6 g! [1 N9 e9 z
self.expand3x3_activation(self.expand3x3(x))
, m/ K1 I( M9 d. r- \& ]1 m ], 1)
( L& J+ H* s% }% {$ H f) v' h+ Q+ m- J( j
1! I0 h* h, u* U# F5 S
2
/ Q. Z. a/ w- ~/ S# ]' v: ?3
8 j. z/ R7 q x4+ B W% @& `) {' }6 X
5
& O a/ R% l9 h- p1 N' D( M3 B6/ q- j- i* i$ A6 G0 l+ A
7
% X& I. v! \ w' d: f9 P- H8
* r% D7 R$ J6 W" ~. P9
& c, m' f- j. y/ c" g4 K/ A/ L- M3 K10
' |2 _$ B/ M4 q11; t; O1 N6 f+ `% [* p1 E8 x9 {
12* s. i B% M8 E7 q
13* N4 Y# [& P4 D0 C
14, I' S0 M6 M9 f- _5 H
15- r' X9 {1 i1 n0 T2 F3 p
16
: r* u0 \) G, V" R% M0 s0 C+ i17
. S. M4 A+ j2 z c4 q0 |- Y180 { q" y) R) e. i* c/ F2 p
193 d3 W2 b) w8 E6 [: R* C5 f
20
( J" d5 J8 l2 t. H g' n21" z% n9 W+ Q* E
22" R Y- `) q& O1 n
23
6 a+ `0 R# y, E e+ j* N24
. B* w% t. ^* H3 j! j" k7 m. t/ m9 l25
0 F- u9 ^5 a, p# f6 r4 j# A26
, g+ W5 v0 j! S8 {0 i" I9 rSqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。$ G6 @5 ^# W# c4 q
' @2 m& g6 K' R8 q. {' c6 u$ PSqueezeNet1_0的网络结构如下:( v7 l6 L3 a* i3 k2 |" N \
5 M( h' l/ e; ?$ j/ t
self.features = nn.Sequential(# u# @4 l7 [% c" g$ M7 Y$ J
nn.Conv2d(3, 96, kernel_size=7, stride=2),% L9 k. K3 c$ x. S" f; A
nn.ReLU(inplace=True),# c+ i* O& w. k3 V4 @
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),4 e& O% m0 x& X w' C
Fire(96, 16, 64, 64),2 Z+ Y% F; z' ~/ Z7 B
Fire(128, 16, 64, 64),
/ B; T/ R+ @7 D Z Fire(128, 32, 128, 128),, r- |5 [, p8 N- c8 w
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
3 ^, B- b R! q! F) t% J; g# f Fire(256, 32, 128, 128),
' p4 e: d/ _1 U9 U. G+ W+ O8 P; v. s Fire(256, 48, 192, 192),2 z9 I$ T# H u) l" P" T
Fire(384, 48, 192, 192),
& r. g1 r% G, i' b- H Fire(384, 64, 256, 256),4 ^0 J; ]7 }/ I
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),, X; Q) Z8 n8 _6 C4 C
Fire(512, 64, 256, 256),9 A) I: }% w1 \/ K$ M9 b
)5 b$ l0 F7 g, q; h8 o' G7 L
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
" `9 @3 f$ n. ]! [self.classifier = nn.Sequential(- ?. o* x \1 W8 V: A; ^
nn.Dropout(p=0.5),% v. C9 U2 e# V6 @
final_conv,- z3 G4 U3 W: z
nn.ReLU(inplace=True),6 ?8 V5 `# p( x4 I! v
nn.AdaptiveAvgPool2d((1, 1))
/ J1 Q0 ^7 q* x- j)3 A. [+ ^2 P( I
, c3 U- x: Z ^5 B: m' a% t
- {8 ~6 q4 G: l+ L" Z1 s1* w Y" G4 I# Y0 ^0 o) v; Z4 s
2/ ]7 _2 n: P9 u7 r
3
; I" T4 j4 V- p2 G' K7 D' C46 O" G4 z$ ?8 c- O
55 j0 S/ h% e" i+ K
6+ c* `/ A) ?% S L. Q l2 F
7
2 T. L# m+ N% H V$ }8
! i4 m1 x7 ^; z( f9
4 n. K: w8 d* V0 O10 Z( B3 L: i/ x$ @: G
111 J6 O) j" L0 P# y
12
7 s/ M- ?. w0 _13
& R! N N- R3 q7 f146 H. r% I) b3 Y. \
15
5 d* X# C& O+ g1 R( u16
' S/ l; J2 _* J17
" }# Y$ ` u# P/ D9 F+ k186 ]+ ^. G9 c9 B, y% P
19
6 C1 F- z' v* J( l' S3 o! p; n6 x, ?20% L- `3 T- w8 q y
21+ L4 Y: S: I6 Q# v7 P
220 d" t: _/ O/ W; T5 S. e* K) @
23
1 ? |/ g z! @: G2 ~SqueezeNet1_1的网络结构如下:4 j2 d; B+ t+ n, t2 Z" m
% @; H/ }3 t/ r; B4 rself.features = nn.Sequential(% n: `* t4 j5 \0 @
nn.Conv2d(3, 64, kernel_size=3, stride=2),
/ z. L3 \% K1 Q2 R/ Z% o8 E nn.ReLU(inplace=True),
* S U* \6 D! Y! R9 }! o nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
, C: n5 X* f+ E1 x% x Z* {; I: o" _ Fire(64, 16, 64, 64),8 I C6 D2 J* B! I1 n' g! g: C' v' X
Fire(128, 16, 64, 64),* T; S5 r; c+ j/ ^% o+ g
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
- L- l( a4 |( l8 q Fire(128, 32, 128, 128),( a5 b/ [; Z$ L$ Q, b- _
Fire(256, 32, 128, 128),
+ E0 \$ ^+ o$ i3 @ nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),$ v% w/ X, ~8 Q# ^3 n
Fire(256, 48, 192, 192),/ z1 i/ K6 F! S' r- G9 Y
Fire(384, 48, 192, 192),; ]6 L* h. F2 w2 k0 Z! B$ t
Fire(384, 64, 256, 256),
# Z* Z2 j+ o: K# m2 o Fire(512, 64, 256, 256), p4 n, y( @* x( s
)
( n" }3 P+ z- _final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
' ^4 K2 d8 M/ \self.classifier = nn.Sequential(" Q: N+ R3 d" j. \& l& U
nn.Dropout(p=0.5),7 [- |: S/ S6 _+ w
final_conv,/ w. t4 g$ W* e% N
nn.ReLU(inplace=True),! O0 P: k# U7 N+ Q2 H* f# I
nn.AdaptiveAvgPool2d((1, 1))
' z$ u. n) h2 b' q1 ?/ P# q" m)
o" z. ]% r( N% V# s- S/ t3 K- c9 D- J. [$ @
1
+ Z0 _% g* v- j- x$ ~9 r8 q2
$ l9 ?4 ^3 d) M% w) w" D3
4 o3 y6 b8 t5 d3 ?5 w3 c3 u4
+ K! w$ |* E" _0 M) Q/ R4 o- s5
- Y6 x: D$ |6 n3 \; i6
2 s* |& ?- i1 ~7 d! j' C( m7
1 }. |: i6 _! C' V5 [4 g8; Q/ s9 ~' l8 s# V5 I; @
9
Q* |+ }% p7 g: r& s7 q! j0 S10' N/ \- B4 K) G- ~5 o
11
1 B/ v" }4 j% \12* U2 `4 I3 `' h9 V8 ]# x0 b3 n
134 H. E7 o: N: E" d9 Z% l; h
14
5 f7 G+ A0 g1 J* Z2 b15# @0 h4 [* R2 @: _4 Z! V
16) l9 O* u: I) w1 {5 S6 p8 @) U
17; p+ H8 Y6 H/ M( P! V
18
8 w9 D; `4 B( o9 W19( Z) ?; |7 [+ R
20
+ M% |! A% }# i F$ S218 T3 e" C4 X( c+ c8 z
22
9 i, w/ D" _) K; s$ z. Y5 NSqueezeNet各层详细参数量及其输入输出如下表所示。6 k9 B# R" T/ b, z( n6 E, k
( Q9 J% C" A/ G% P$ n3 f! I, `
* f/ e8 Y# n+ E6 S! {# M4.2.6 其他实现细节
* m+ O- t$ ]/ D( O2 o2 i- Y1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
, K, Q' u0 Z0 J q3 q$ ]squeeze和expand层中使用ReLU
5 R& S0 y) z$ l+ H在fire9之后的layer中使用ratio为50%的Dropout/ D3 n9 e# w( s! C. I; L3 E
参考NiN算法想法,SqueezeNet中不含全连接层; ?7 G6 c% O: I2 [- W
训练时,前期学习率设置为0.04,然后线性减少; m! \/ H0 T8 j3 H, K) @
4.2.7 总结
& `% R8 e7 x" H* o, E$ Z7 v- S: o本文最主要就是三点:
2 r7 z6 T7 n1 n8 M
3 l, h% L* U6 M/ ^用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果2 r4 ?4 Y w# @$ q) T
减少输入到3×3卷积的特征图的通道数,减少参数量1 ]* U; r# q( g3 B3 V2 Y, K( f
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率
' l* L# B9 e5 W. r0 L————————————————
: A- c9 m- j3 |版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
4 E) F( l! [8 k5 T原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
% i5 z; D; w6 x; Q+ ~
/ F5 {; g! b. E: L) i. w7 @# y" E6 a% Y, o7 N( t
|
zan
|