- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569580 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176097
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
! X- ]0 v4 }1 t# \' s$ D轻量级神经网络算法-SqueezeNet7 x2 e: W- |9 l+ z# v8 |8 O
4. 轻量级神经网络算法目录
' s1 w& A* s# P轻量级神经网络算法# s' t, n9 [4 ~" v, A( w4 g/ y
4.1 各轻量级神经网络算法总结对比; R& o2 S$ o ~6 G
4.2 SqueezeNet
6 l1 ?8 j5 u( g4.3 DenseNet
% |* T1 ~6 h6 ]$ R8 ~4.4 Xception
% [0 l; |0 k# u4.5 MobileNet v1$ B9 {( |: e I+ W% N
4.6 IGCV- w% c$ f! A% C: I' }" ~4 D* `
4.7 NASNet
$ q9 b. i/ n, B- U2 @# ^, z g% h7 V4.8 CondenseNet) S" }- @' m+ ]
4.9 PNASNet# `# S: ^; T a. A
4.10 SENet" F ?6 V) C" }0 c/ G
4.11 ShuffleNet v1' D; ^7 A' \& B7 a' Y, E4 ]1 t- G
4.12 MobileNet v2
6 [% g9 _; {1 h) |' i4.13 AmoebaNet7 Q+ _* }0 t. B4 E
4.14 IGCV2
7 M9 C# a Q! m! o* \0 }$ `! A1 |4.15 IGCV3$ J7 v( G# c: u
4.16 ShuffleNet v2
7 h: C; \. t/ N$ E9 T% e4.17 MnasNet1 P9 ^3 A+ Z& z1 o" @
4.18 MobileNet v3. G, l, O. ~7 \) Z4 q v
深度学习知识点总结3 {4 M4 a7 V* |0 x; ?* M3 }1 o1 E
( R% S- N- n- X# a0 \. H* q4 w专栏链接:9 I/ W" i; C. q R% q; Q: n4 H
https://blog.csdn.net/qq_39707285/article/details/124005405
9 n8 N8 P8 o: s, d$ F1 M' G( N本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
0 N9 `0 d% d$ H6 m/ D7 x$ X+ r8 ]
( E( q& B8 E% i, Z; e本章目录
; k6 C, J( f) m+ y2 ^% Q4 B% R! w5 R4. 轻量级神经网络算法目录3 `$ J! o d' ]3 E
4.2 SqueezeNet
h L& ^, _6 a1 c4.2.1 问题分析" X# S7 y6 v& l/ e
4.2.2 SqueezeNet的三大策略4 N# V X* X: O. p) T$ ~# ` Q
4.2.3 Fire模块
, R6 A$ T# [! S% S! K4.2.4 SqueezeNet整理结构$ @7 O& i& l4 t6 E6 E0 p w0 @
4.2.5 代码实现SqueezeNet
6 l- M7 w+ o0 I# ` E4.2.6 其他实现细节
/ f# ~ ^) ?( d# S! p8 m$ c0 s4.2.7 总结' X( }7 R$ z) O: l7 Z) ^8 M5 x
4.2 SqueezeNet
* S# H7 g/ }( _$ G4.2.1 问题分析
$ U" x; O; \3 ~/ e; d最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:& W* l5 h; k2 a) J$ Y5 q/ f
+ w0 u. q2 k) i, |- n2 T! N+ s" w2 ]( D
在分布式训练期间,较小的CNN需要较少的跨服务器通信
: u4 \2 P1 w5 h$ S* ]) y0 f, f在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
: x- s& Q. [- |! m1 S, @5 v较小的CNN更适合部署在FPGA和其他内存有限的硬件上
) ~# `7 O" \$ d, O, ]为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。9 y7 m$ R9 h" ?4 f/ H9 k" _
0 |. h: t+ k5 [* y1 |) ~4.2.2 SqueezeNet的三大策略/ b/ b6 D0 N6 ]2 |, ^8 ]
策略1:用1x1卷积代替3x3卷积
! r, m( I8 |$ \# ?1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
. [9 [) b8 g6 \: L0 F- `3 I
! {/ h$ o" v( P0 H策略2:减少输入到3*3卷积核的通道数量" N y+ Q i$ Y0 E
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。$ g! N; J1 ~( i3 [! L0 e
+ l7 U/ m( M) U6 K/ E% K8 ~1 i5 s策略3:在网络后期再进行下采样,使卷积层具有较大的激活图5 t" P2 C7 O. m- h6 ?4 o3 c( w! I
这里的激活图(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中。
( ]/ M y9 o: n M2 S0 H0 k+ i' e3 E; c
策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。3 P% {6 H% @ o: _1 \
9 s7 @7 N3 x/ H! {4.2.3 Fire模块
4 j* E4 L9 s1 J0 d+ D7 a3 s# W为实现这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的想法。& r. H! D' s% G1 w5 U
6 ]/ l# C* J* u4 T h+ }
, l) {7 m+ X8 S# K' R% C0 F
4.2.4 SqueezeNet整理结构8 r) g _5 K4 f, L o8 \: @
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。/ X8 t8 ]7 T5 O- z
" Z( Q5 J9 ? r' z+ a3 d. A1 L# J) Z. `% `8 ]
4.2.5 代码实现SqueezeNet
( P& x/ k R* t- K, ^Fire模块的代码如下:
( w% |- o; U1 Z5 s! M% |
: j- s! t' n1 f+ D" Gclass Fire(nn.Module):2 d N6 z2 z+ F) Q
7 H' `% G0 F f* U/ p; G" s
def __init__(& a# Y" }4 M; {; d, ?3 ?4 y; F
self,5 B1 A7 ^5 u- j- G" p* B# Y
inplanes: int,5 l* a+ }3 f; Y0 q* H' G: `6 W
squeeze_planes: int,& R, h7 z% |# z: H ]
expand1x1_planes: int,
% w) k6 o2 K ` expand3x3_planes: int7 }. ^5 G. b" @# ?1 I4 q& N# @% _
) -> None:- n% `4 P% R9 D
super(Fire, self).__init__()% w# t8 ~8 t7 W/ F1 p1 e( n% d. |
self.inplanes = inplanes7 m1 S) |4 X/ q b6 p
self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)! r, R! y& {1 k2 _' t
self.squeeze_activation = nn.ReLU(inplace=True)' I8 u4 L8 h2 C4 ^; _
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
9 M. X" D6 ^# T# C# G x kernel_size=1)
7 k. ^) I1 Y& L; Q: g self.expand1x1_activation = nn.ReLU(inplace=True)
' {8 {+ ]6 d- L self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
6 ^3 s& v3 J. Z8 ] kernel_size=3, padding=1)/ ]* @ l* {2 z# x
self.expand3x3_activation = nn.ReLU(inplace=True)
/ P$ l+ a0 ?' k5 a- y; X4 @ Z
3 z( `2 }$ H* x def forward(self, x: torch.Tensor) -> torch.Tensor:; E9 O8 c2 C! Q
x = self.squeeze_activation(self.squeeze(x))& ]) a4 P2 w1 q4 C
return torch.cat([
* y1 h6 O5 s# e5 R0 G q& W- J self.expand1x1_activation(self.expand1x1(x)),
; w/ @9 a4 ]$ ^. R4 U self.expand3x3_activation(self.expand3x3(x))# R/ t. Y* L+ ^2 f" x& l# \! H
], 1)7 V$ z1 X6 Y# [7 ]8 @
h* P6 B- d6 r4 T% `1 `; U12 K* y( H+ P b
2 h1 v' `" D9 H- t8 Q6 A( l
3
3 a+ K8 o( b% L& W% v. o c4# ]* t g2 x. N4 U; Y
5* c! x( o0 u' Y- j
6
& A. M, N! X0 @1 r5 f77 V* t0 G0 G, B- Q- S
8
; I+ O |5 H }# P9" n2 s7 i, E1 N& {. ?; x
10
2 |; {9 w( C& \. v5 i' X- c Q11" W2 h/ y" j2 I# ~/ z+ j8 {
123 t, _0 e! C: L. X( Z( c
13
$ I- E. t9 ]- r14; X4 C$ j+ r, g9 [/ H& o R6 e
158 |& j# S. j+ r6 |
16
* L& R$ g3 @! K8 W17( m! D* w D8 b% y, z8 P1 z
18
( h( T7 ~; p+ Y4 A& b# Q# F19
# d8 U# K$ p D: s: y20% ]1 `' z5 s8 V5 I& h' w: @
21
3 _8 l2 P/ l; |7 I, z/ b5 F7 s22
1 O; r$ `' J F: }23. Q8 ~; c1 P( D/ i: r( k7 t
242 |, q& v+ W0 }8 c# B, O: O
253 P$ n2 B2 T* g, x5 E
266 }8 P7 m6 A4 U, y/ ~" q
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
6 A4 G0 t! R* ?! C* n7 Q9 O2 k* a/ a0 b" \
SqueezeNet1_0的网络结构如下:+ N# d8 q8 m3 }& ?- G& ~' w9 a
- O9 e/ ]* F+ k! p2 F# W
self.features = nn.Sequential(' D, b/ S P# n! L1 L, p6 s( M
nn.Conv2d(3, 96, kernel_size=7, stride=2),- F4 H, u& m7 U# S$ E7 m4 b. Y
nn.ReLU(inplace=True),
( T# g- j5 Z* w) K7 ~; a nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
$ D6 ~' w( d9 v Fire(96, 16, 64, 64),- x% y) }1 g Z
Fire(128, 16, 64, 64),
$ {% ^7 y& p$ E" B Fire(128, 32, 128, 128),
+ K7 k- \4 N" k& D' o6 n5 B nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
5 M3 D5 A0 r9 ?( S' m$ B& A" H Fire(256, 32, 128, 128),
L: g5 O% }- t+ E$ X% l: | Fire(256, 48, 192, 192),
, A1 s- D6 A+ v8 } Fire(384, 48, 192, 192),# z! o' v5 j. M% z3 ^' M, S; t3 H5 c
Fire(384, 64, 256, 256),- k* ~) O1 m* c$ H
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),7 s6 e+ M6 a2 x
Fire(512, 64, 256, 256),
2 q: n3 I, d& {3 m3 f)4 d7 y4 R2 }6 u8 j1 A* x+ T7 F
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
4 O! ]7 B6 g: x7 qself.classifier = nn.Sequential(
1 `+ g+ u/ L* }) { nn.Dropout(p=0.5),
8 Y4 x6 n8 m: E) N& y# y3 b final_conv,
6 u; |' ?$ N; j/ H% }( q nn.ReLU(inplace=True),
+ {" `6 R6 h8 w) i nn.AdaptiveAvgPool2d((1, 1))6 i8 ]7 s) W5 m; p/ f
)
1 w* `; e. t5 B1 s
D8 H, o/ E" U2 b3 A0 J8 s
6 k4 p T' C1 `1
% k# x+ F$ _% C; z2
- Z( H, A; ~# V; _3 v3
% v3 Z% t- r, Q4
0 ]' s/ x8 Z# B; A5 J5
. I+ S s9 D4 m: c1 c7 r% J$ C68 i6 a# T ~! _. k' S; s! \
79 w, q" b1 b8 B+ z4 I/ g
8 ]& y5 _3 y4 V
9* P; j* c% f& r& E; A' O2 Y) F
10; F1 e0 V. w6 t) p" A, q
11
; A8 e1 @- N$ u6 G1 k1 U% o5 U. f126 U6 l0 B% B" H
13: E) i+ }! ~1 I" f: ] D: z) N: Z
140 K9 U1 X7 j! Q4 F. N1 N
15' r9 {+ o4 D. j% k4 h5 ?
161 P( x2 h# d. L
179 g5 h+ \) k8 W- r$ ?
18 X/ }. v8 P6 j, \2 a& S7 g7 T
19
7 B7 j0 e6 o$ n: C20# P( h$ Y' J- f }: k; I' y
21
; ?1 r1 ?8 r5 k) U/ Q7 R! M' Q; ^22) n+ H8 \, a5 \; P6 v! V- _
23" u% x6 b8 \% m: ^0 T' n8 x8 I) N
SqueezeNet1_1的网络结构如下:
1 A( o3 [! {9 K' Z0 Y5 f. [) J4 G6 D! H! o& `) p$ D5 `
self.features = nn.Sequential(' \" |( q, g4 Y" c7 K- j f) D9 F
nn.Conv2d(3, 64, kernel_size=3, stride=2),
& X1 t v0 J8 \# K" `0 J nn.ReLU(inplace=True),
, y3 j+ W. L2 A. a% V+ H5 \ nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),$ V+ a+ H" J5 ?8 }, F: \6 R! n: v
Fire(64, 16, 64, 64),
0 j) s7 \& y0 b6 H% j) t9 x Fire(128, 16, 64, 64),7 J. O+ n( N5 q
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
, T/ A9 V5 G n. o" a Fire(128, 32, 128, 128)," {6 u' r b$ u0 T! L- S3 S7 x& ? u
Fire(256, 32, 128, 128),
9 w4 }- j7 H; H# ` nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
, H; T" ]" z( C; b Fire(256, 48, 192, 192),4 I4 M8 O3 t" T: P# }/ a: P( c U
Fire(384, 48, 192, 192),
8 ~( r7 A' z! }& C Fire(384, 64, 256, 256),5 X; v: d( u& l/ F2 F
Fire(512, 64, 256, 256),
# E$ Q) S0 D0 B) V, \)
6 n6 [3 Q7 v! \/ |4 Ffinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)) ?5 ^* w D% X) ^9 X, u2 E
self.classifier = nn.Sequential(
! s- t3 i& S1 Z. R nn.Dropout(p=0.5),1 j3 H! A) c- v" @, ^8 Q% f
final_conv,
3 j2 V9 z* C [* N nn.ReLU(inplace=True),
, ]: C2 A9 ]6 ]$ o* Q6 N. @ nn.AdaptiveAvgPool2d((1, 1))% \& x- V) |& e S, s
) J) y+ _ K I8 H& E. J
& ^/ x/ { a }1% F2 {, M* Z" W. [' ?
2
8 M7 E) v0 Z- r0 ~( n/ R8 N3
3 ?- @8 K* X( N. I* r4" K1 x2 }! v. b
5, b3 M4 N5 s: \0 y3 u
6
1 x* G# R3 {- k' Y' |5 z f Q7/ y2 `+ D) o1 g5 r$ ], E9 B
8
( }% z8 Y; P- S6 @( }5 v9
3 N' s' l1 ~( N; a7 p100 r) W T% O/ N- N& G
11
1 H1 {$ Z& K1 |+ X12
! f% M) m; M/ t13
A: \0 ]! c1 U( ^: [% x u4 E14; ?% e p* F/ K* j5 s8 R1 F" M
15
0 @8 f( E# X( a5 H3 j6 M& q! J* l1 w16! a6 t$ H9 u4 g; p6 J! i f: e
17
E* b3 J6 h5 w18
! V( e$ [* y! u" L( o2 N19
7 [& u+ H* u! g0 p6 y' S, {$ d20* S3 N2 `, V1 x. z0 Y$ U
21! ]% G8 F9 p/ p6 E- Z2 W
22% y3 t5 ]9 G" H' h
SqueezeNet各层详细参数量及其输入输出如下表所示。2 Z. s9 E3 ~5 g5 `
0 ?( \8 }5 [ E; P- G" n6 ?& ^
$ O8 K6 _# J r; Q+ x4.2.6 其他实现细节
( c6 \: h9 D2 c1 A5 r6 j; Q* W) B1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
) s% e' f0 K2 G' r( gsqueeze和expand层中使用ReLU" }, n& m5 d7 t5 v9 e0 O* v
在fire9之后的layer中使用ratio为50%的Dropout
# L6 Q2 k+ ?/ s' ], ]6 H" a参考NiN算法想法,SqueezeNet中不含全连接层
3 j8 }3 b/ @; {5 s训练时,前期学习率设置为0.04,然后线性减少
5 W9 I% y I4 D2 n% k4.2.7 总结) l5 g' B) y1 \9 Y# l* k" t
本文最主要就是三点:
2 c% U) | B% |) S; g0 W8 a8 O/ e
- Q1 \+ H. F) [+ l用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
6 u/ V l, d J5 _* B% m减少输入到3×3卷积的特征图的通道数,减少参数量! f2 h- J9 n7 H
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率
2 g+ M' u9 j; w G9 j; m V! d————————————————
. \" V5 L) | B P版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% X0 S( X& T; |6 U# j1 S0 ?
原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100) K2 G7 o/ Y/ o0 i$ l; y* J. ]3 p
) M1 x; m4 t4 Z0 w5 u+ I) j, m E; N C1 V" Z: w/ v
|
zan
|