- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564697 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174632
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
! U6 s+ P+ q/ R0 U- r- o
轻量级神经网络算法-SqueezeNet: J( H/ y( \! e1 C# B' s: U1 d: ?7 T( {
4. 轻量级神经网络算法目录
5 t# ]( k6 y E5 K/ k; h$ W轻量级神经网络算法
- L. C6 a1 u. W, A! b; t4.1 各轻量级神经网络算法总结对比
7 J5 G" q& \* i1 J4.2 SqueezeNet% S% ?' @1 [; s5 ^, Y t+ W0 s
4.3 DenseNet
7 I3 D5 p9 V- H' x4.4 Xception( l# ^, Y: A; Y. |& _
4.5 MobileNet v1
; h" c+ h1 r, B- B# C$ ?; ]4.6 IGCV2 W$ R, y% o! q4 m. V) N
4.7 NASNet
{7 F, ~/ e7 S0 r* u4.8 CondenseNet
5 @1 {" N6 p9 S- d' P* B' P' F4.9 PNASNet m3 c/ h5 [+ c& M+ ?1 \# b1 I
4.10 SENet* n" |. W Q; F6 w) W
4.11 ShuffleNet v1
9 c- Z4 G% I0 B0 U4.12 MobileNet v2$ u9 g8 R) d* D$ F: X! Y+ P9 |
4.13 AmoebaNet ~7 C. ^0 ~, P8 }1 g2 W) c- _
4.14 IGCV2; ~( M5 T7 E7 s$ [
4.15 IGCV3
( L2 J- V; g3 D. q' f& E$ X4.16 ShuffleNet v23 j G3 i& h0 d' f+ Z
4.17 MnasNet" V' }; s( |& O. M. `/ K* e- r
4.18 MobileNet v3- I7 k& E' {; x. S6 I# W+ ]
深度学习知识点总结" W3 M5 \- }: A. V; v0 u5 s
. v5 C( q. b7 ~$ j* \6 @/ d6 h$ o. |专栏链接:' q' m8 a+ ^$ O3 Y* K6 d% L: e+ p
https://blog.csdn.net/qq_39707285/article/details/1240054057 t' l* R% E y
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。% ]# n V% Q: s0 b+ ~' O( F
3 u( P+ p* O# T4 Y
本章目录% f' Y" H" B8 W2 U
4. 轻量级神经网络算法目录
6 Q+ m" r; k, `/ ?4.2 SqueezeNet; Z/ N0 L# w3 v
4.2.1 问题分析8 q1 K+ ?9 q3 ~! H
4.2.2 SqueezeNet的三大策略8 a7 w( Z! Q% H3 H. [& |
4.2.3 Fire模块8 `; y" o- F c; b# F8 p1 l
4.2.4 SqueezeNet整理结构
2 W8 c; ^* M1 {/ o5 m4.2.5 代码实现SqueezeNet
- ?" j: h" e4 o. [; e" _- H' d4.2.6 其他实现细节
1 p5 ]" G: j6 e4.2.7 总结 a* W* T; K, h4 @( H
4.2 SqueezeNet
6 ]* s) G! R0 x9 y6 K6 `4.2.1 问题分析
2 B3 X. V" h7 [$ \4 |; B! J最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:1 u5 C# U9 Z9 s! y5 I5 B1 ^3 }2 @0 w
8 C0 V8 N, c( I. `* y# r
在分布式训练期间,较小的CNN需要较少的跨服务器通信
4 ?; A3 `: d# v4 I5 K. d, \7 K0 n在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入# p q0 z6 Y7 }9 M8 \& }8 C
较小的CNN更适合部署在FPGA和其他内存有限的硬件上/ \+ \$ f1 n, Z8 [/ E0 d/ Z
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
0 a( x$ ?7 k1 Q' j" [: r. A0 o
4.2.2 SqueezeNet的三大策略
7 L' z" H/ J' X2 Q3 R策略1:用1x1卷积代替3x3卷积8 ~9 a) }" o2 M
1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。+ S1 R2 }% z V: D! @1 y
$ r" M3 t& s+ ^% Y' \2 j策略2:减少输入到3*3卷积核的通道数量$ d& v% K$ M: E) P! V. _- r
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
' H7 a% |) ^3 C8 N& t- \; D' T. y4 |" O/ }2 b4 t, O* v
策略3:在网络后期再进行下采样,使卷积层具有较大的激活图8 G) Z& ~$ J. |8 W$ x4 B
这里的激活图(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中。
Q5 S4 Z6 z# c* h" F) V, R
+ B# G: _& X$ q0 x' M x( g9 @策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。# Z9 b; b. t. F% I' `
! A5 A1 t4 I# q- w5 G4.2.3 Fire模块
4 G+ ^8 j- J, X为实现这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的想法。0 f# t9 U! [' e) U' _ B
4 B. ~* _2 x0 z# V* E b8 N/ B
/ z6 g3 ~+ M/ x( ?4.2.4 SqueezeNet整理结构
1 j" {% r) D7 ~3 ySqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
8 ^, R8 ^# K" b& I. K9 N9 L! i5 e7 F9 G* t* Q( b5 Q
- Y3 w6 l% L% W: g; w1 k1 l
4.2.5 代码实现SqueezeNet
% R& W" h B' WFire模块的代码如下:: v* q- N* O8 M2 o$ U- y, G
) m. W: f6 y* p h9 t# {, F% qclass Fire(nn.Module):" k; f& p5 I' b( H, y: O' Z3 m& y
1 e9 P9 F' |, \6 `8 D def __init__(
+ y: K6 F6 r! q0 Q, ?5 l: C+ V self,* ]; d9 o) w ]2 F' M+ n; ]& E$ F
inplanes: int,
5 S2 L S" Z. r* T squeeze_planes: int,# Z! }8 t1 G6 L6 t* ]* e+ K# |
expand1x1_planes: int," @% Y% U9 ~: Q: T7 R1 }
expand3x3_planes: int
; D8 ~$ Z. V$ n( H- P) Z ) -> None:
2 b- w1 A. _* ~% r super(Fire, self).__init__()( x* M. }' w9 ]' L5 O7 {: `. Z
self.inplanes = inplanes
. P4 b/ z- d1 h- H$ s, M+ }8 D9 r" ~. K self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1). S9 X. e+ l4 N3 @! B. f
self.squeeze_activation = nn.ReLU(inplace=True)
0 Z& ]- Y: b# b) N% y A self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
# R7 r- O3 L' _- B kernel_size=1) ^6 H" ~& z( V8 H- w# u7 a
self.expand1x1_activation = nn.ReLU(inplace=True): a& w/ n/ ?. A
self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,3 s' M) |0 p ~6 t$ @2 O; J, ]
kernel_size=3, padding=1)
. |5 A9 I5 P; ]! n8 y self.expand3x3_activation = nn.ReLU(inplace=True)5 S8 x+ s& S) q& s5 [$ _& @
: ?: w2 L% Y3 J2 `* w8 K+ O
def forward(self, x: torch.Tensor) -> torch.Tensor:+ @. I6 N6 z' @" [
x = self.squeeze_activation(self.squeeze(x))6 G8 l* |$ i4 x) }* s
return torch.cat([: M1 k1 c5 ]0 s5 E8 |
self.expand1x1_activation(self.expand1x1(x)),
+ M6 v5 A+ a- W& l8 [, h% V5 k self.expand3x3_activation(self.expand3x3(x))" Q# f/ q+ l& b
], 1)% n) B+ R# ?2 @, z; D0 @* G
/ R9 K7 I- u9 R6 T/ p
17 h; ]. z; I4 i! V' f. x
2
' f. M& ~; a5 x3
' N& h d; ~) r# w: m, y0 y4 Y! H4
" a- ]( T0 o5 n* x56 R$ h: p' r2 H* [% ~
6
& _6 u* T8 S' q3 M2 k& E72 _+ R. F7 L3 r
8$ d: [8 ?$ D7 |0 X
9
/ {% i9 y; P* w% W; Z109 M3 R- ]1 r r. C* ?2 a2 `
118 ^3 e, Z. J D4 [" v/ p
125 M, e8 }2 P% q8 J& m: I5 Q
13
" R0 {9 y8 P1 z. Q1 e4 S14
* N$ l8 W6 r& Y6 L8 `15/ ^0 V8 W% b" s( Z V5 H+ H
16- h9 A8 m) [ f/ K' i
17
3 L+ L: H) X3 Y4 V, @0 ~: u% i180 Z: a! {/ D8 k" X1 G
19
3 l. F' M. t- b0 o A+ \, n20
4 `' m a* P; z. v K21, h$ I( [ |) t- J
22
( d& T& ~% w, Z2 r; g W5 @: N232 Z, H. i1 c9 M/ t* Z
24
) w6 j1 ~% [1 C# `: p3 U25
, G& n" N7 T3 u- M26& Y3 I# j% K- \# |0 o3 V
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
* r @4 V( c" F, c7 g# s, p5 K: x4 p% d& P4 w/ l
SqueezeNet1_0的网络结构如下:
! A. r, D9 B4 H- G# b8 K$ N
4 o. k* I; @0 _3 N0 _self.features = nn.Sequential(
8 R! I9 w# Q6 p! f1 J5 q nn.Conv2d(3, 96, kernel_size=7, stride=2),
0 s5 T# v( ~' O! x' l \* G0 v nn.ReLU(inplace=True),
2 @! i Z6 V4 h! Y b }) B9 p) y nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),; C8 t# r" i% G2 k: a" u' o
Fire(96, 16, 64, 64),% i5 C1 t5 B) v5 n' e9 A' x
Fire(128, 16, 64, 64),4 q$ b4 P- l6 e+ ^- R+ u( Z
Fire(128, 32, 128, 128),
& x' j# n s3 i3 g nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
; T* D8 ~! t, s, P- {3 Q! r6 {: S Fire(256, 32, 128, 128),: g& ~/ z; V, X+ G
Fire(256, 48, 192, 192),
" A) z/ D/ A6 M& A5 O* d Fire(384, 48, 192, 192),
! d; _5 _/ l# [3 w Fire(384, 64, 256, 256),
1 R1 x8 V+ o! e, E( q nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),3 U) v' w3 Z" ?' `! R* |" o9 M$ i
Fire(512, 64, 256, 256),
. r! S. t; ]& C; }; Y& A: [)0 H" U9 [; U' }9 _
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
; W) f- Q( N+ \4 p) J" V1 C8 Wself.classifier = nn.Sequential(
. J8 z) P) I2 M nn.Dropout(p=0.5),
+ p. ? u4 K3 j0 K# r2 Y final_conv,
1 \6 a! b0 l: A nn.ReLU(inplace=True),7 _9 q6 D9 X: D# H, Z3 g
nn.AdaptiveAvgPool2d((1, 1))
; L2 E! R( @% Q+ w3 z' `)* ]& y& @0 w1 Q J( a
& W" E" d \5 G( Q" S; o, i3 o. f% u8 V! I& \: g- O
1
9 [* O' }4 z$ u6 [: }$ f8 ~) ^21 v/ f7 q# ^, a6 V" Z4 k
3
& H5 j- ~* a/ R: I4
! E1 K* `2 f5 g; C, Z$ }5
. h) }, n4 H7 G. |6
" W6 t3 \* z" ]* G( |7 H7
. c) d* t# G' n8
2 r/ _6 J, v0 p( s9
* K* m7 i J; m+ b1 |9 V0 e10
/ D# W5 y% r7 [ P* G) X( H11# D2 |- W% a' s% W1 A; @
12$ g% P1 n! H: }% a
13
& V) a- M F2 n14$ R$ |; B4 y8 P
15. d! X4 ?) \! M+ s( g! L( R. ^6 P
16
* u& s9 `4 V/ @3 g. w5 M17( r3 s T# F& j* v
18; l; z+ r' L/ n8 l/ m7 r, c2 I7 Q
19
/ g# @& B( R0 v+ n' K20
5 @3 \9 y7 Z$ C+ J4 j214 }+ O0 n) u( i6 G; p
22/ z: M+ D! a4 s2 g" Q2 ^' ^: q
23
& m5 v: p0 w& D( ~SqueezeNet1_1的网络结构如下:
0 k: R5 \) C' ~2 [0 w* ?: F5 D4 h$ Y7 h$ j" ]( G
self.features = nn.Sequential(
# T. J6 u |; _/ E' _! [ nn.Conv2d(3, 64, kernel_size=3, stride=2),
+ j& e0 h8 ^7 A' ~9 { nn.ReLU(inplace=True),
+ E% ] P+ ]: p, |. ]( j' a nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),; K: I( x3 U5 x0 j; ~+ ?: S5 a
Fire(64, 16, 64, 64),+ |; b6 C3 T; M# a
Fire(128, 16, 64, 64),
( y; n- M) ^/ v) d- } nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),( j) e) E* d7 x1 D2 q
Fire(128, 32, 128, 128),
1 m' E, t* Q# f% l' s9 u Fire(256, 32, 128, 128),
8 w$ R2 \7 R- }# X8 Z nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),! V5 y# s& j: ~7 Q# X" T' R
Fire(256, 48, 192, 192),
K- r ~" i. s Fire(384, 48, 192, 192),
; _7 w1 u. @3 x4 ^4 [ Fire(384, 64, 256, 256),# F, `" D W v, _: [% k H3 p6 G
Fire(512, 64, 256, 256),$ G) L( F4 l/ U# c* n( T
)8 E% M2 u. y8 b/ m3 ]. s' \
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
0 [* }7 A) O7 Jself.classifier = nn.Sequential(
) V2 |6 E% e5 k2 j7 Q: ?3 U nn.Dropout(p=0.5),
& | W; ]. V# r3 A" H2 i+ b final_conv,. {' M4 `: P7 b( L* A( {
nn.ReLU(inplace=True),( p4 i/ H F( e& l# l" d% \6 \
nn.AdaptiveAvgPool2d((1, 1))1 @2 F/ V/ f% J7 x/ M' E3 I. x
): n7 h/ ?+ j- m( r+ g }4 h3 _
% ?6 D0 u8 @( q& h
12 G. h4 v: C9 a3 U8 D; `! x
2: ]4 _ P3 P' d! V
3" _& f. Z9 q7 c w4 g/ Z5 b
4
! [. c" l4 C0 }) b( E9 B5# C& ~; r. _# |5 T6 e
6
% u+ s; E5 h/ j+ X7/ v8 e2 A1 E' Y) V2 L* h6 j
8
) Z8 X" [3 m1 C+ n9
' Z& `, m4 k) {& z( _104 A2 _8 d4 V2 s# d
118 Z* J ~! r* s
12
4 _) l3 Y/ L9 e, H( G( \13
( ~) _7 D9 ~8 V) R0 L14
e$ a- |1 x! B) x" K9 R. x( I# T$ I! Z15 ^9 Y# C+ z! B6 Z% ]
16' h1 d M5 q" r$ E6 I' b
17
; a. z% `. s' I9 P5 ]' {5 c18/ M# V0 y% b' v& |: j2 J, O
19
6 q& s$ X# b4 e% a: H20
* y4 m* q# h# Q. `2 c0 H21
4 R. W5 i, n' z+ G227 o: W* c( ^) G8 V0 ?0 N3 h
SqueezeNet各层详细参数量及其输入输出如下表所示。
, H; {6 }" p" f+ ?( v9 A# ~: E5 l% f, j
* R% ~5 L+ w9 D
4.2.6 其他实现细节" W5 R" Y4 N1 f8 R( b5 l
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
4 r6 G( W, y J+ r% `squeeze和expand层中使用ReLU& \; ~# O0 g$ R T' ~6 X% S0 B2 V
在fire9之后的layer中使用ratio为50%的Dropout
' B1 X. }: ~, l6 X8 ^5 O参考NiN算法想法,SqueezeNet中不含全连接层
- u' \: Q- c, H8 j训练时,前期学习率设置为0.04,然后线性减少 l8 v( @% w1 D9 @$ `8 |
4.2.7 总结
, c) q! `6 t( ? x* c0 H/ o本文最主要就是三点:
: i# t1 {: p# G! C% B& a$ x4 I, F+ |
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
* Y- Z! H& w$ j0 I, i: \2 X& o减少输入到3×3卷积的特征图的通道数,减少参数量
% G- o5 ]/ n5 ~不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率
/ x! x& V5 |7 y! p3 Y1 u5 @————————————————
& E/ r9 }9 |" C: W, N+ B# m+ f版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ W$ d/ e! ]8 Z' `( T0 x0 H
原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
/ x( I# c# C; k) [+ x+ W! U, u! m0 }& }6 X9 D5 c
4 y1 \' {/ x- X, B) i |
zan
|