- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565626 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174911
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
/ { P' M$ g* f
轻量级神经网络算法-SqueezeNet; a6 K( ?, F8 R+ V5 [* ~' k2 L
4. 轻量级神经网络算法目录" G( m, h) m: G, v3 \
轻量级神经网络算法
% s1 c1 y% p s: _( g4.1 各轻量级神经网络算法总结对比
0 @. S; R8 L* R8 U o: Z8 |4.2 SqueezeNet
. U, e9 b; g! `& E3 u- [4.3 DenseNet* J( S0 V/ U1 [# M
4.4 Xception
% ~* v# @( o2 r# a; e j4.5 MobileNet v1% I- a5 W1 e7 K R; v1 v
4.6 IGCV8 C: y: n4 j6 u; j" B, [: j8 `
4.7 NASNet* q' ^9 g7 X0 M3 I$ m* A
4.8 CondenseNet' G1 ~2 O& S3 \ j8 b, I
4.9 PNASNet5 {. i( A& Q9 W& ?
4.10 SENet0 u3 A ]. f0 I. S9 k6 g- X! Z5 V5 e
4.11 ShuffleNet v1% g y/ ~2 r$ E+ _9 _
4.12 MobileNet v2; \4 l' ?1 c/ g; ^
4.13 AmoebaNet/ r% ?' R) F% n5 o" r2 Y b: k' \
4.14 IGCV2, `$ w ?; O3 B# P6 z: O5 j
4.15 IGCV3, x; Y6 q% d) b8 g
4.16 ShuffleNet v2
# W: C7 `; D* j7 f4.17 MnasNet
7 d4 R5 N7 L1 m" Y5 ~4.18 MobileNet v3
+ {/ n3 n* |8 q2 A& t" a深度学习知识点总结- h5 n4 m% w$ P) x3 w8 R
0 D! w# s( k; b! e4 Y$ I
专栏链接: W. Y) N: F0 b' u* S, A1 @
https://blog.csdn.net/qq_39707285/article/details/124005405
5 a& c* t; N( q, }/ P4 C# {) G+ D本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。* }, [0 m9 I. u5 S
* v3 ^" _7 z6 j$ t1 w: q6 c
本章目录
( q9 V; \/ E: @+ f$ b4. 轻量级神经网络算法目录
2 V" m, `$ w! R' r4.2 SqueezeNet
' N2 ]8 k/ G5 |3 P$ A/ W, | P& k4.2.1 问题分析" C3 V. R" q) V* }) z: _5 e! S
4.2.2 SqueezeNet的三大策略1 h7 ~0 ?; ~( H. B' D* a
4.2.3 Fire模块
* p* y1 C( U( z2 [2 Z4.2.4 SqueezeNet整理结构7 V: y) m+ y2 D5 `6 b
4.2.5 代码实现SqueezeNet: Q: @% ~, M& V
4.2.6 其他实现细节. I* \. B4 m* q4 q- z
4.2.7 总结) _ A8 H+ R* D8 p$ ?' t' O
4.2 SqueezeNet( `. ~% w3 s O+ Z% c# s
4.2.1 问题分析
( i" e1 D. j1 B7 L! {( f+ x最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
3 l: R; _) H0 `% k% p! M: u1 Z/ b K; e9 N1 E0 O! ?1 h5 ~6 E
在分布式训练期间,较小的CNN需要较少的跨服务器通信
0 o4 `4 L4 P% }/ `. R在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
0 K" m9 ]9 ~! |4 }较小的CNN更适合部署在FPGA和其他内存有限的硬件上
2 z+ c8 b. j7 B; J' `, U3 n为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。; `0 D c' G' f7 U
% k* ^/ O+ }1 O# T6 g
4.2.2 SqueezeNet的三大策略6 V3 _5 P! i$ I5 B0 j% x0 P. I
策略1:用1x1卷积代替3x3卷积9 X1 A7 b6 C# E
1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
: w$ L5 z0 W5 V7 ]
/ c' x+ o& V7 K9 P" t4 @6 \策略2:减少输入到3*3卷积核的通道数量% i3 r) X4 @0 T, W8 B
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
* D! e3 l: W& F7 T% A8 F
1 H/ A- P/ |" G5 Z9 n3 Q6 {/ p' P& _8 L策略3:在网络后期再进行下采样,使卷积层具有较大的激活图- R5 L$ C# F4 H+ g# b: N
这里的激活图(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中。9 Z4 F) n! n e1 x8 J6 }
; t) \, ~1 N Y3 p. V4 H" S/ f策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。- t& ^* }+ z: d/ c" \1 d
7 P% @- J" y1 C2 Q* L5 D: C0 g
4.2.3 Fire模块) q8 W1 @0 I1 b' ?/ t1 a
为实现这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的想法。* ~% {/ G8 a9 h% h, u+ M& ~
' M; }! X. z6 p) s. E& E4 l% l. J& _
# K1 d3 ?$ F, O+ K$ l9 F8 y% M& L4.2.4 SqueezeNet整理结构
3 F% E( o- U5 F M# q/ [SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
" B# o* L; V+ F& n) K
, O* I% }. F D; N4 j; _2 e- J, R- e6 u- d4 }
4.2.5 代码实现SqueezeNet
: D" V) \" T2 ?+ ] N+ dFire模块的代码如下:8 S& a2 A* }$ U
8 e0 M% d$ k1 X; S6 W9 bclass Fire(nn.Module):5 x( h* p, B: r8 B
/ O* H7 I( q$ Z0 ?; o* e
def __init__(
! d, m" K8 C& w4 B' ~; k) V self,
6 x# T$ a1 t( l0 p# @ inplanes: int,& m! p9 P) r" R" b+ a
squeeze_planes: int,
1 b0 Q1 H9 `" \$ x expand1x1_planes: int,) {' a4 Z( p6 Q1 z# c; c" o' w
expand3x3_planes: int
+ b2 `# Y" F) U7 v$ ^ ) -> None:1 r5 u. @) w: C3 |
super(Fire, self).__init__()
" d; |% ^- ]* F n' Y4 u self.inplanes = inplanes& a9 A* H" P# ]
self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
+ ]/ Z. J8 d* z7 V self.squeeze_activation = nn.ReLU(inplace=True)# l# @, y+ a3 ]' V# D }
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,7 o( n4 ~( b3 k; R5 s$ z& W
kernel_size=1)+ v' e0 u& @6 B: c3 F ]; @
self.expand1x1_activation = nn.ReLU(inplace=True)) {1 f: D" X* f8 w! S
self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
f! |* ]) I7 k; d. J/ y. W kernel_size=3, padding=1). D6 d) q' K$ Q% `+ D
self.expand3x3_activation = nn.ReLU(inplace=True)4 R7 s- y! ~5 R2 {% Y
/ v m! Y, v4 F% U' \0 U
def forward(self, x: torch.Tensor) -> torch.Tensor:1 f; O" p7 [$ W8 A8 a) H
x = self.squeeze_activation(self.squeeze(x))
; K# N) t: t; d' X' ? return torch.cat([
+ ]0 J B. G! X7 N# o* {4 {8 T self.expand1x1_activation(self.expand1x1(x)),
) N$ _! a$ P* @$ u, @7 i7 _& W self.expand3x3_activation(self.expand3x3(x))' \0 t: I/ p: C2 @) C( x- t i
], 1)
# N4 R, D) J, Y+ \7 l' g; B8 ?/ l9 D7 y8 m |8 r q
1
% C# V! \( P; T/ P( B9 Q2
1 X9 ?" O% j v7 E$ W: d. J3
3 ]9 D, e0 }/ m% d: M1 Q* c- \4' x5 w8 j( P9 t# k$ N4 Z
59 `( d. i9 E- s0 T5 T
6
! q% l$ N1 L5 j$ z) I7) ]/ A0 i# n- f5 [
89 B$ P- I( w2 q& ?8 Z/ v
9
+ z+ \4 y) |: Y) ^109 n- [+ U' |! q D' [. [# e
113 B* d9 i2 C9 a+ W! m
12
! k1 l6 i8 @" Q13
" [) G% w1 @( l" F0 M- k140 G/ V$ `7 h* l. H( f& s
158 Q0 m8 ?$ j8 X9 c7 w
16
4 Z+ C1 y) P5 F17
1 X; E- v3 f h C' R18
0 Z4 S5 j4 c3 z- C& N19. _( H h+ N4 r) m% r
20
" F' p+ {. V8 U21
8 T% q. Z/ f/ L# S0 \22# C) D/ ~( ]8 M. M0 v
23' p; \8 ^2 Q( u' @( f
24
: \/ k4 D9 f% }" l7 F! c: S256 W4 p" X j s
26
$ k+ @$ R; [# TSqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。# a j/ c2 i4 g% f) `
. | \2 `+ S: ^' |, ~) A: h0 f
SqueezeNet1_0的网络结构如下:
& \: [# ~0 R& n8 S
1 q/ G1 y; K0 ^- n: Tself.features = nn.Sequential(! |" r g* N5 d# C& @, d" \7 v
nn.Conv2d(3, 96, kernel_size=7, stride=2),
" c& ~' s" T" n nn.ReLU(inplace=True),
( ]( E4 L/ \' U2 R nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),, B l$ N$ ?/ e4 ^
Fire(96, 16, 64, 64),
* F1 o2 F* C" B. t2 p7 g# p Fire(128, 16, 64, 64),
: r8 q: \0 c1 w1 s Fire(128, 32, 128, 128),9 M$ ^( \+ B. S
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),5 `7 D( l4 u, K7 ]2 l" X: }$ ]
Fire(256, 32, 128, 128),
! k( B% E) v c1 l$ P Fire(256, 48, 192, 192),2 w0 I1 I- j6 F. p8 G. v7 g' i% n
Fire(384, 48, 192, 192),
. N' a- U6 d8 J6 Z! m Fire(384, 64, 256, 256),
- `5 r. a$ e( { nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
# y4 ]* P- f+ [2 t( R3 x, \" [9 H Fire(512, 64, 256, 256),$ `/ p$ f/ c7 @( O7 J J7 E5 p
)
: ` G0 g- x- e- V Mfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
$ }- Y" h, M; I! w1 ~self.classifier = nn.Sequential(+ t5 _& ]: k$ V1 x
nn.Dropout(p=0.5),* O1 _4 L+ k4 O I/ m( ]* r
final_conv,
7 v6 M# K7 s) g nn.ReLU(inplace=True),6 M( T$ M) ~, r/ y; B; a# ^$ @
nn.AdaptiveAvgPool2d((1, 1))
! A& j. ~- Q" M7 ]( M4 L)
3 m1 g# Q, Z7 }9 Q o+ ^4 {
2 h9 w3 R% z1 h7 }. W" P8 v" N2 Z* [: c( I4 h- T$ G
1
2 R E( i2 A) a1 B' b2+ v+ K! w8 f+ i$ k: W4 k/ y
33 ]# w: g# c- h* @0 V9 }
4
2 A1 U7 a/ A P* A8 V52 D0 ~) E9 o& t7 X: ~& d
6
: {9 u. g1 K% t# d. ^7
3 [0 I; j: y9 f) m80 ^, P& y. Z. h. N
9
5 M% D0 X, v$ g, m: ~8 X10
/ G' K& V- O7 l# d11
' p: h. [! u5 P K12' l3 ^! s( t$ M2 m/ S
13. ^9 v ], {3 X6 z( X$ `
14
7 h2 n/ X6 t0 n0 n) q8 ]7 x15
) N$ F1 }* ^1 _8 p6 D+ H) Y- o' p16
+ j L7 V9 {( ? I' l4 ^0 r+ m$ U5 A17
! w5 z* `. }2 z! g' ^/ v184 Y+ F& ]' X' ? | o& P
19, Y" L6 x9 {. n7 G+ `& A1 y
205 H+ W. L6 l3 n: T
21
3 ]2 e7 ^& c0 L( ^3 v- ^+ A* i: A- |+ J22
8 C' n0 x7 a) v, Y. X23! B6 F, B" l: v3 n6 f7 t
SqueezeNet1_1的网络结构如下:
0 Y% {! A9 Q& {& j% P$ ~3 ]5 |+ A0 g" \ j) q0 T1 Q
self.features = nn.Sequential() X7 v. Y$ P+ Q* ?& k- K- J
nn.Conv2d(3, 64, kernel_size=3, stride=2),4 @3 b3 I+ K( T4 I! R
nn.ReLU(inplace=True),
8 U3 q- N- B6 B8 r) U nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
8 {# m! m) g. \' i. b2 |* b Fire(64, 16, 64, 64),5 F) G) E: t* }# X( H; t
Fire(128, 16, 64, 64),
0 c1 e) d8 m3 ?! T0 C" E nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
* T- ~( k0 X8 S+ a; F+ x) W Fire(128, 32, 128, 128),
1 j( d, e) l4 a& y- [ Fire(256, 32, 128, 128),% V0 i+ y) S- ~) h. Y' A) |; P
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
5 _+ s9 k( ^& }; ^( W) l- z1 g Fire(256, 48, 192, 192),1 p5 x @% ^, X0 j, f5 X
Fire(384, 48, 192, 192),
( u I; j- j9 u+ d Fire(384, 64, 256, 256),1 l8 J( X3 l& _/ p9 C5 v1 v; L- `& P1 P
Fire(512, 64, 256, 256)," q) y9 l9 Q9 b9 o: B" j6 H8 |
), X3 y0 m$ N+ D7 P$ b+ k7 {
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)( ?6 R/ ^& Q2 D. ]9 V
self.classifier = nn.Sequential(
6 K' F' h1 T/ ]( W nn.Dropout(p=0.5),' H9 m6 u% [; k9 G8 H8 f
final_conv,, R* r$ p+ Q4 r' L
nn.ReLU(inplace=True),
( |0 d* z) x9 U5 n$ t' L nn.AdaptiveAvgPool2d((1, 1))) H7 t8 I1 X Y B2 K1 \3 A# V) W
)
( p6 {, V8 `- D% m2 b# Y, K; X7 G4 ~9 X. x1 m) m' o/ n
1
. K- N4 U7 H3 P8 F$ U5 B% ]# e29 y$ p2 V ~4 x
3
4 Q8 y0 _4 X# p" p0 o( o7 [) d4% ?, e U8 Q7 Z; f& \0 V/ u6 N
5/ |! S; k6 F) i+ `$ c
6
u+ T) s. ~% `7
4 ?9 c1 q! P/ W3 m8
. p6 t3 p1 _# w' S9! |/ h7 H$ U1 ]3 V
10
% V. z8 R0 c u2 e, R% x8 z11
0 E& r( U) K& _: t% u12' e4 h, I* d0 H8 j. @* O) F
13% N/ P$ F$ ~! H; v
14- o7 ?, v0 F; x0 I* d
15
# {3 X0 d& |- K8 Q9 b! o; j16
+ D @, l8 f, w! ~+ {171 P$ j0 U; ~6 m- H7 F1 z( d
18
' ]! u- J( E0 ^( }$ v2 ]19
8 s, R& s4 t) @- ?20: o+ P7 i+ `& B- O8 t& H
216 s% }" E4 f3 m. ^; f
22
/ S. N: I( A1 c7 ]5 j+ cSqueezeNet各层详细参数量及其输入输出如下表所示。5 [% c6 Z k7 m/ G: q1 a
1 ^3 b4 H5 u" q* j- S/ X+ g$ \* s @- G; @( j2 P& L. u8 ~
4.2.6 其他实现细节
" l* E0 b* B. u% a L1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
* {. e) s! a0 G& O rsqueeze和expand层中使用ReLU0 d. i# ]* r, A6 ?
在fire9之后的layer中使用ratio为50%的Dropout5 E% }+ f# O4 e5 D
参考NiN算法想法,SqueezeNet中不含全连接层& `, B9 p/ V: s" T# P6 G
训练时,前期学习率设置为0.04,然后线性减少4 H2 n! `% ]0 x
4.2.7 总结
) u9 O$ @1 n5 z本文最主要就是三点:
% s% h. T* C$ Q" l
2 y; m8 J8 P" b0 P2 W. z. ?用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果8 |, h8 J2 M. Z/ N
减少输入到3×3卷积的特征图的通道数,减少参数量
/ p7 T" `, I8 c' E) B/ ^1 g不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率* N: q9 b0 Y& H& [( ?+ ?
————————————————8 ~3 v# e0 ^5 y+ ~
版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; e& S; R# U6 N: W3 _, c. O4 L
原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100% L; Q A! A" h z7 E
e9 {1 Y( h- H& p. T
8 h Z5 G5 x, a& ?1 M: S
|
zan
|