- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564675 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174625
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
8 Z4 o8 k5 l4 l轻量级神经网络算法-SqueezeNet- ~6 g; x) k2 [. e* D8 b0 j( K
4. 轻量级神经网络算法目录0 ?% O9 _# N6 y* r4 e9 J) [
轻量级神经网络算法( H7 Y! w* \+ M8 G5 |" ^& c
4.1 各轻量级神经网络算法总结对比$ G4 m. u: h5 z
4.2 SqueezeNet1 J- f8 p0 @5 E' [
4.3 DenseNet7 O3 C/ N( q+ u0 A7 d! P
4.4 Xception& \2 d! q( G3 a% F$ B
4.5 MobileNet v1
7 @5 ]: g6 _( F- Z$ t- @4.6 IGCV5 c) r8 p3 a* g- Y
4.7 NASNet4 }3 g% x! K `1 U8 q' t3 H
4.8 CondenseNet2 c" m% O* M' v6 C+ D. D
4.9 PNASNet3 U: D i* i1 j# k$ k/ E c4 F
4.10 SENet) r" e4 m3 Y |2 w2 E6 K
4.11 ShuffleNet v17 z! Z0 e) Y% s6 ]5 d/ |2 d8 @
4.12 MobileNet v21 C& d' Z% k1 L. }' I
4.13 AmoebaNet" `" B' x. S0 C/ n! r
4.14 IGCV2 t) [! h, O# @( x
4.15 IGCV3* x# u3 j+ A- G5 u2 q
4.16 ShuffleNet v2
9 ?9 t0 N4 u! L4 B, m! i4.17 MnasNet
# s4 M: |% s6 G- F4.18 MobileNet v3
; F- c' U$ l+ a# r# P深度学习知识点总结
) m5 K! U6 f; a: a$ M
. @5 a4 I6 V+ J) u, C专栏链接:3 f x9 X- R3 x. j
https://blog.csdn.net/qq_39707285/article/details/124005405
. e) y# P1 c- q本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
+ u8 q5 S+ a0 A( m# Y% I, _5 [; w# o* p- {9 ^. D
本章目录
( K- R, \$ l5 U& F+ m+ z' H. ^4. 轻量级神经网络算法目录: b- }2 w9 ?5 Q% n; e1 c! L, @
4.2 SqueezeNet3 H4 e; K+ o: t% Q0 d
4.2.1 问题分析+ V( b. }- n' }2 m( I
4.2.2 SqueezeNet的三大策略: x; H" d2 u* n# u) ~. G$ _7 e
4.2.3 Fire模块
. n+ u' ~; w: k0 b4.2.4 SqueezeNet整理结构
8 k: H+ j; @/ s; L v4.2.5 代码实现SqueezeNet$ K _$ i- X8 |6 r4 I. `
4.2.6 其他实现细节4 [( o# ^) s/ w) A* i5 y
4.2.7 总结
% l; }2 G2 f% e& k4 k4 z, y/ e4.2 SqueezeNet0 j$ @3 a( {, x9 x, s, }6 \7 \
4.2.1 问题分析) L \* m9 |. d; D* _
最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:; f2 y) p+ f; _7 K
L- ~8 @0 |0 @+ r' c* H0 e! R在分布式训练期间,较小的CNN需要较少的跨服务器通信8 j! b# M5 b* L% r: n% }/ _) f
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
0 W, e) J/ F0 W7 ~- S' w较小的CNN更适合部署在FPGA和其他内存有限的硬件上( Z1 o5 W) K5 p0 @/ J; x& d
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
# { ^6 @( r" {1 t, E6 Z3 Z. I4 j6 A
4.2.2 SqueezeNet的三大策略
" M* q y! `% D$ q) z" q; l! Y- m策略1:用1x1卷积代替3x3卷积
3 C \$ T" [ v5 g2 |8 i0 O1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。+ v& W* S' h. k
5 d1 D% B R, v. ]% V5 R' {7 _- P m策略2:减少输入到3*3卷积核的通道数量
3 s7 ]) f- S6 Y) w1 m- Y对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。* c% e) W$ T) d \( g/ M
6 F9 O* _& G6 E: X* i# D* @策略3:在网络后期再进行下采样,使卷积层具有较大的激活图# K o9 P3 }) a X$ \
这里的激活图(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中。
( O1 @" S7 d x/ q2 X- x+ Q/ ^; G1 {) A/ e
策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
0 W6 r0 m; F) P3 l* U* M( T6 ]! @- b ]" U( O) m1 F
4.2.3 Fire模块
( Q/ V/ _6 t& } U. g: x. u为实现这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的想法。
" ~, |9 U+ Z Y: ~1 x& d+ t
" o8 {$ b+ I7 r9 r0 _1 T( A6 R( e/ [1 N/ ]2 B0 r8 r
4.2.4 SqueezeNet整理结构
7 k. M- F; }% Z+ g7 I; TSqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
6 e8 p) A7 m9 o4 V( e2 M; L' m# f* S1 S' n3 h
6 ^7 J# v) e7 m% Q/ d7 Z4.2.5 代码实现SqueezeNet6 X) r `3 }0 @9 b! m( N
Fire模块的代码如下:
; x9 W: m, w5 R t% e
6 r0 M# s3 v9 f* eclass Fire(nn.Module):: H, ~/ | G% u) l$ b( L/ M
( W( s' E) V; s" g( h
def __init__(* n: B' {, `: @# n! W
self," y$ d* w' L5 |* Q
inplanes: int, q% g+ s8 a9 k0 r
squeeze_planes: int,
+ c m$ u$ \( i expand1x1_planes: int,
1 D1 e- n4 h8 r. n* n2 C expand3x3_planes: int
8 Z+ j+ a* ?0 \, |* L/ V1 N, Y9 C ) -> None:
% [4 M( G% C" k3 h, h2 ^ super(Fire, self).__init__(). ^. {$ D0 D4 ^+ g4 w+ ]1 u; E! c
self.inplanes = inplanes
- u! E/ G, m% R+ K+ w" _7 z self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
- O: b" U$ `* z8 D self.squeeze_activation = nn.ReLU(inplace=True)
A7 o0 B X5 Y# K, U, b7 a/ ] self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
1 h+ W, k1 f3 C4 L kernel_size=1)( Z+ k% T, Z5 T% }- n7 @. `" _
self.expand1x1_activation = nn.ReLU(inplace=True)
/ G' h# c4 S# {/ K0 D+ _# e self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
4 e0 e0 Q5 ^7 M( F7 k kernel_size=3, padding=1)
, C: |0 I y1 ~9 H F self.expand3x3_activation = nn.ReLU(inplace=True)
% f/ y; O( ~( ^# z; ?+ n: Y+ L/ ^( ~5 X9 c* V
def forward(self, x: torch.Tensor) -> torch.Tensor:# e& s( {; K; b- k. R/ u) S
x = self.squeeze_activation(self.squeeze(x))
( j% j8 i- X* b6 u% \ return torch.cat([7 G+ h- {$ O. f O7 _
self.expand1x1_activation(self.expand1x1(x)),
- e# Y3 C% U" z; ~7 J2 Q# |* H self.expand3x3_activation(self.expand3x3(x))) }2 p2 y9 f! \
], 1)
2 h6 f9 r5 V( P5 j* M7 Q; w3 T# \0 [( W3 ?* y; m0 g
1
/ E. v2 Z, {. i' q( B1 B2
- a* {* G6 }- U9 @3& i7 G/ a" w8 w2 j) _
4
! \* B! n0 p( V1 _5
7 S- [ w5 L- w' _3 D* I6
* O4 R5 ]- H: M7: x F0 o5 N3 B& U; @: p
8
9 R" B2 r3 T& k- e8 K. e; d/ o9: y- d6 {, G$ A
10
% X" n& c5 u$ a11
; l/ @/ @7 B n12# s( ]' i- M; D0 n1 t/ n
13 t5 ~$ O/ c, ]' u
14$ g/ z+ K4 L8 }4 k* i1 M' E
15
; o8 q9 [. T# W16. A) O! Y0 k; h2 Y
17
) ]: `7 j: s" K7 G, S; \18
: }8 x% e6 z( g5 t; o* `9 d, z19
4 h' T9 I. l! ]0 u7 g, O' q" b1 Q20
7 t* S/ \& m5 t* W. a- B7 T214 Y3 H) l8 ^% P% N
22
" b$ D: a1 Z$ s4 [5 E6 z23
5 U8 a$ D& B- q240 O9 Z1 q. H9 D, Z6 p( V
25, q0 S( q, r7 |1 b4 d$ N8 C
26* [! t+ R# L4 y
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
9 B5 a5 }8 k2 l3 @3 X' F/ I( [) Y, f; ?' N- |: M( y
SqueezeNet1_0的网络结构如下:
( N' _) ]2 H3 a1 _! [. B
& ], [/ w( C& a" f. A4 @0 s/ {( y* a$ Vself.features = nn.Sequential(+ v( C E _1 F6 U9 N: h; R
nn.Conv2d(3, 96, kernel_size=7, stride=2),7 k8 j+ h9 x5 z, k9 f2 a. g
nn.ReLU(inplace=True),
+ V6 S4 y) M% v8 g/ q nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),2 C3 f3 _9 y" W
Fire(96, 16, 64, 64),6 W% y7 v% c. Y0 C V, h
Fire(128, 16, 64, 64),
( u- C e N, o9 O: H, g5 S Fire(128, 32, 128, 128),: a& M+ S9 \- \
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
4 K) K% t' _, F- I: @. N7 R2 v Fire(256, 32, 128, 128),5 E- c% r* o) a5 e: g! S/ O
Fire(256, 48, 192, 192),
* C0 H) @% ]3 r# s7 n( _- D Fire(384, 48, 192, 192),
3 j2 S/ X" [; ]+ }! j Fire(384, 64, 256, 256),* p1 j' P& H! |! j# p
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),, B H$ g- d: R+ r2 X% [3 o
Fire(512, 64, 256, 256),7 a' c4 a4 C& W2 M! x' P
)
% K3 V7 V% n- W0 o3 @final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
" b- `$ M! N) |9 _% ], N M$ I# lself.classifier = nn.Sequential(
2 v8 b, m5 s& t9 i nn.Dropout(p=0.5),
& L& N1 v2 S$ k1 m" c) { final_conv,7 a- c: l& v/ N+ K; o
nn.ReLU(inplace=True),1 r5 x8 H" p: {7 j- O0 d* s
nn.AdaptiveAvgPool2d((1, 1)). Q* k) e, d0 t) }
)
# a- z( y V" `1 N! R
$ B$ {) R+ Z. d1 ~0 D" o
5 H' Y- {- I# Q4 y2 p10 R7 @. P% U R/ e. ~5 F. L
2: e7 z+ F( i; L
3' q; O- T" }1 e/ T
41 R8 F; [9 t$ C3 `, g3 r
5
; r1 u# E# q" Z9 x4 n2 {; n& P6
" G8 h* }" H2 o/ u' v7
0 g8 J, E! \/ W* ]% m! J% A- b8; ?" R/ Z# b, j( i" q2 b
91 m4 l1 K: i& c: ?
10$ x% U0 _9 R: `! d
119 C, o: E* \6 w- n( S' i
12
! P8 G& j( X6 J$ |. ]+ R: b5 {13' a" Z4 s4 D: ]/ D Z/ x( ~9 N+ }
14
4 [6 l5 A% v$ [5 R, n1 K+ Q" @7 E15
; S& [" \) k- Z; c9 P' F5 U" P16
; L0 q" e7 [& W1 e% f8 Z17
! |* E+ B$ z" z1 i8 K* k18
' @2 M& y9 ~: C19
6 n. u; j+ p4 D20
6 Q3 ]* Y2 ]& R21
* e/ S% R5 x4 ^5 P! X22& q1 R* @1 I: n9 [$ w' x! I
23
7 H3 N2 R9 u! g( B4 `SqueezeNet1_1的网络结构如下:
6 O0 r) U6 r+ ^; M
9 }* C+ ^, U" U1 K* ?7 P [self.features = nn.Sequential(. q; j4 D7 b4 F. o$ x8 Y0 Y; X% N. ?
nn.Conv2d(3, 64, kernel_size=3, stride=2),, e6 ^# _7 m, ?: Z) X8 O: l
nn.ReLU(inplace=True),# D* X7 J0 i: T& n6 _
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),3 W D8 z& T* a. s j
Fire(64, 16, 64, 64),* F, l8 l- j/ a, U) W( N2 T
Fire(128, 16, 64, 64),6 S0 }- A" ]. |* X K. D
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
+ n4 P/ d8 ~' p4 \ Fire(128, 32, 128, 128),
2 T* N, o3 t$ `' v/ J7 H; C' T/ @ Fire(256, 32, 128, 128), J6 i$ h- ~* |% y* ~- ?2 w
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
$ y* L5 Y% E: ?- E Fire(256, 48, 192, 192),; l. e4 e3 @; T. U- m, K8 G
Fire(384, 48, 192, 192),* i; `8 r) ^0 \2 D. D A0 `
Fire(384, 64, 256, 256),
7 a- ~5 _9 ~5 \6 j4 i Fire(512, 64, 256, 256),
$ W7 J! d# Q: J. f)# ?% x! Z- r I0 j. V; p
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
/ v% y- u c6 k+ Tself.classifier = nn.Sequential(% C* X+ ^" O1 _6 O
nn.Dropout(p=0.5),
# A( F5 f" z" B4 n ^9 A final_conv,: b7 \, z" d) \9 @
nn.ReLU(inplace=True),9 X; j0 J/ v+ t' i
nn.AdaptiveAvgPool2d((1, 1))
! B0 y2 c5 H7 K2 D3 t1 t0 ~4 o)
; o+ S% Q7 m* n
0 ^' Y+ S# M5 n/ m4 g8 ?1
7 w+ `2 ]; x6 c. }8 ?2
0 w- o) G% S' K# s) n37 f% S- K0 u' x8 E" g
40 }) _& q* n4 j+ a
5! _9 U4 ^# u7 X- o: p; Q
62 A$ f& D! P! _' t# L" ^6 W$ H
7
' j8 ? N& T% u' P# p8
$ q6 R$ ?- J- c; O# h* G9
* {7 m" A7 }8 p! M- _10
7 e6 q+ k: c9 K; p% b# u0 ?11
4 ~7 \ }9 F0 ^% z! w% G' w12
' p# B/ b8 b) b/ z2 O13
1 _" S6 I! p. j0 ], c14
# B: g" b, q7 W2 R: j( P15& e' _' H& S" K* M& ]
16
/ J8 p$ I) ]: G$ V/ G; x17
( h+ f8 ^# J k. `$ W+ E18
+ V) f5 c1 ~) ]. V3 O* U19/ K5 d1 y: D9 g% ]+ }2 ~9 e( Q
20
4 f! q1 [% w1 ?+ P4 m1 I; U' r- U215 w( |5 K( t1 Y* y
22
" W! l! w0 V+ | `SqueezeNet各层详细参数量及其输入输出如下表所示。
3 D# G" G/ [) M" N
! n# {( Q. c$ }4 s
) o$ V3 t' ]) y4 E3 |2 D9 F& U4.2.6 其他实现细节
/ y- F v5 {( P1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding) T$ c7 O/ j3 {0 T
squeeze和expand层中使用ReLU; O4 c! q9 t3 j
在fire9之后的layer中使用ratio为50%的Dropout
! ?- s8 e! t$ I. e3 l7 `0 s参考NiN算法想法,SqueezeNet中不含全连接层( h g$ W* T( ~7 a1 i
训练时,前期学习率设置为0.04,然后线性减少 A* O8 [% \* ?# |& e
4.2.7 总结! l U5 L5 ?" Y3 i1 a* {, |% j% W
本文最主要就是三点:
; ^! u4 U* U( ?/ Y1 c. j! c g5 v# y# E; k
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果% c- u! V9 x1 e8 M
减少输入到3×3卷积的特征图的通道数,减少参数量: Z1 @/ ]' k3 t
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率3 N& h; H# J* q6 c0 r% E' f
————————————————5 o9 g; A! P: i9 `1 W. ~
版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 V Q h% F& {, q
原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100, x: `7 f) f% a6 w( W
, p9 @3 K7 \0 N5 q T2 s
0 |' P f5 j: ` |
zan
|