- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 557861 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172731
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
/ Y+ J" n! R: C0 N# n! d9 u
轻量级神经网络算法-SqueezeNet
# Q9 b& `/ R6 ?& v" T4. 轻量级神经网络算法目录/ {, ?0 O+ J7 h) M; t1 q5 x
轻量级神经网络算法
- Q$ c' O4 o3 o- R* M4.1 各轻量级神经网络算法总结对比
6 Z2 O( U. {2 z( k8 n- g8 b4.2 SqueezeNet
& t: Z) _1 S8 ?- {# {8 K4 R4.3 DenseNet7 W) s- |; F, f+ p i; m" F+ ^& v
4.4 Xception4 r' y! i' E0 k) S9 a9 \) \/ s) b; T8 j
4.5 MobileNet v1
6 z2 K0 y5 c+ O; v$ ?4.6 IGCV8 `( g; D+ i3 h& V, g* ^
4.7 NASNet
! O$ P2 h" a/ P D$ I3 t4.8 CondenseNet1 ` `7 g4 M3 b; |6 k3 x, f: x
4.9 PNASNet2 T5 {" _9 M+ k
4.10 SENet
$ y- C9 q/ U4 a& F' _" j. P4.11 ShuffleNet v1- L0 M4 i2 X- Z9 _! t
4.12 MobileNet v2+ E/ @, S/ U8 A, {
4.13 AmoebaNet) _ C0 g- O7 D! W9 z' f6 A$ ~
4.14 IGCV2
+ O- w' i- A7 l8 N. d+ s" ~0 `4.15 IGCV3
7 W9 B( A* K; |5 i2 {/ ?! Z4.16 ShuffleNet v23 ^! r2 i% X, M n4 \# K/ V
4.17 MnasNet
/ p4 e& Q. ?* Z+ s4.18 MobileNet v3% T; q# f' M' K% \) S( q' K8 U
深度学习知识点总结6 {( f9 v- i8 {# |; [
7 ]/ J3 Q' B3 |# F: E2 u. n3 ^
专栏链接:
/ b! S X! k3 i2 jhttps://blog.csdn.net/qq_39707285/article/details/124005405$ B( Q8 n- |8 T6 V* ?8 m% K5 j8 c: S
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。9 q# \6 r. q+ `3 N: K/ N
% K8 q3 C, _' G) l% `
本章目录( {. G) S J M
4. 轻量级神经网络算法目录
" N" c: N3 i% a, |) q3 i) f4.2 SqueezeNet: m; Q, T E+ U* `
4.2.1 问题分析9 R) e8 E2 v& H) N
4.2.2 SqueezeNet的三大策略% J) E, _, i: S. O9 {
4.2.3 Fire模块! o$ Q. x" V: d( s
4.2.4 SqueezeNet整理结构
( T' D5 q$ {$ B$ Y/ h+ H/ {3 m- G# u4.2.5 代码实现SqueezeNet; p" O% g) Z& T0 p
4.2.6 其他实现细节* Y3 {/ ` S) a
4.2.7 总结5 P! l3 T3 D; {( B, @: B- b! c
4.2 SqueezeNet: q6 Q8 d/ S- X/ f2 c/ G! x/ R" Z
4.2.1 问题分析+ R. r3 Z1 O D$ s3 r- d
最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
$ m9 }( n+ s2 h& b6 W3 V+ @3 ^
( R2 ?6 V: r; X, O! Q! ^在分布式训练期间,较小的CNN需要较少的跨服务器通信
: m% b, E6 [8 ^9 u+ {* `* X在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
" v5 [; o0 J4 c8 |0 y$ p较小的CNN更适合部署在FPGA和其他内存有限的硬件上
- ~4 \# }: `. ^" q+ a( H为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
7 R' o: ^/ ?6 d4 Z7 l9 P# J; W @0 @- {& f2 x0 C) W
4.2.2 SqueezeNet的三大策略7 z4 Q3 S) [2 W& ]/ R" ]
策略1:用1x1卷积代替3x3卷积, Y( ?. |. D, x4 C* P* x
1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。) w! Z3 P* Z. N/ U9 `9 O- W
+ }& M' C: E3 L* |, q
策略2:减少输入到3*3卷积核的通道数量7 Y+ {( I( w' ]* J8 c0 L" N
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。. t! n% W" E2 A1 a1 P+ J- b5 q; W
5 b7 l' {$ r" s/ t; j. c7 c2 ~策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
" S6 Y& t# x% H! H: i1 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中。+ j* O: @4 ]0 ?- O* K4 T: R, W% V
5 K& U4 J1 \6 l, ]3 Y% g+ t策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。, V3 B3 K& C% q9 L
: M1 ]- `# Q% D1 a) h2 S6 o
4.2.3 Fire模块
- j% M* K& x5 q9 V为实现这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的想法。
7 [/ w" p6 u- S4 P+ a9 g0 V9 j; S
1 o1 i/ r6 c4 @. W! z2 j% k1 p t
5 z( I( h. T% o4 i- l7 _- q$ x4.2.4 SqueezeNet整理结构# A& V, Y; l. Y1 J
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
% m8 p, Y6 r9 | `5 i. `
& k/ Q/ l8 ~& G
/ B, {' P9 O+ |4 f3 l2 }4.2.5 代码实现SqueezeNet
6 H2 b( E6 w/ y! R, CFire模块的代码如下:% b) s* a! X3 g7 P9 b. F8 ?
1 g9 K4 h' ~9 A" n$ ~6 Eclass Fire(nn.Module):: d; a: v+ d0 K; V
1 [4 }2 O S: k
def __init__( b' [. C% q, ?( c' a' Q C* o V
self,
( Q3 J R/ y6 b( T+ [& Y1 f inplanes: int,6 y4 W4 n, U6 n: [
squeeze_planes: int,
# b) v9 F8 V" f( g6 C6 m expand1x1_planes: int," G" z$ d" e$ J! A
expand3x3_planes: int
5 K. M! n0 I' i: b* G" B0 p6 `, u ) -> None:3 T1 ^- l' W- l3 u4 N/ Z) F" V$ g
super(Fire, self).__init__()4 W% L; M) ?- U$ D
self.inplanes = inplanes
4 ^- D, t. U' k0 B0 V6 R' z7 S1 U self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
2 F# u7 }( ^$ Y# u9 A; ]% K: X7 c self.squeeze_activation = nn.ReLU(inplace=True)$ ]- E6 |* `% J* \0 c# g9 F' l
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
$ E# @" ?- J% t& [ kernel_size=1)
: D" p7 Q0 Q0 E0 W' n Z4 @ self.expand1x1_activation = nn.ReLU(inplace=True). K) A7 u5 g# q/ n: b: N9 {
self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
& B; T [$ k* z$ `3 U kernel_size=3, padding=1)6 ?" u% Z' F: L" q5 y: V# b
self.expand3x3_activation = nn.ReLU(inplace=True): L- T! I+ r) `% i9 o
9 [% F+ `3 B3 v, D2 R- c/ T& `" l def forward(self, x: torch.Tensor) -> torch.Tensor:
! x$ T& B# X8 b8 X% }2 y! U' V x = self.squeeze_activation(self.squeeze(x))8 i( i+ L0 R, T3 w1 ~. z0 F
return torch.cat([$ h3 E# K/ i# E- j% u
self.expand1x1_activation(self.expand1x1(x)),
- A2 T/ r$ v+ \& h1 c6 ^ self.expand3x3_activation(self.expand3x3(x))4 B2 G Z3 [& S% m' q
], 1)
/ F3 J! Y6 {1 J' l; r# z" ]
# ~2 H) h8 N' H* A13 p! B: ] f) P, D, h
2 x( r5 [) [4 F9 @$ z+ t, `
3
8 G. |( N6 U8 T' X5 w `3 |! j7 S1 X4
+ M: f1 A! U7 B7 c- j/ Z5
+ ?2 ^2 |% i0 r% K* U8 `6
6 Y- F; v" {, i, ]7 q% Y7: K0 H5 l G0 F- b c
80 H4 l8 Z1 O5 v% c
9: ]3 ?) R. E+ b+ C2 u9 A1 f
10
4 X3 l, P2 \2 i+ R9 u11; w V. U; P& Z
12
+ A( E: {# i" d% V9 J+ ?$ d0 z) ?% T13
9 x# E7 s; S/ P6 p4 g+ P" s14
9 k! `4 Y" l( Z# n V15
! K- S/ ]" l# w; Y3 |: r163 J4 D1 g8 u' f1 b: u5 c; [6 X- y
17& ~: J2 _1 V; T
183 o7 Y3 A" K* E1 Q5 O
19
9 {5 ~+ I% X, T8 N3 p7 k8 b209 f) x g4 K! O, b' ~. Y. t
21
, \ J- y7 Y& k7 x# B8 D: M7 F22 K0 b8 o/ n; n" `
23/ d0 T' i S5 W6 V4 a; x( B0 l0 _
246 _6 \ T1 \6 }! k; R6 @. ^" c( K$ F( ?
25
, v" R+ Z2 W; N. X- y26
) \! ]( K! _+ O g6 oSqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
+ A" M G9 D7 {, {! }) n' s3 [: a9 |8 _. K: ?( U( M
SqueezeNet1_0的网络结构如下:" Z2 l" l. J( @, |6 _% z1 f3 V
: {8 h6 g `2 s, _% a/ {5 V$ E
self.features = nn.Sequential(" F! w1 _1 \6 K% n
nn.Conv2d(3, 96, kernel_size=7, stride=2),+ x% S6 r4 J" [% Z
nn.ReLU(inplace=True),
l' r0 o9 O+ w D nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),0 l7 ^+ o) @6 j. r6 U+ X! Y S& y
Fire(96, 16, 64, 64),, g5 P- J, t5 O* D- t
Fire(128, 16, 64, 64),
) t' \, l" T V Fire(128, 32, 128, 128),
7 |7 N7 ~+ c; _- f8 x nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
, C: `- |" s9 f. }4 T- e% w) \ Fire(256, 32, 128, 128),
7 v# L! p7 X1 N2 ^ U$ K1 T Fire(256, 48, 192, 192),! w }4 Q4 O; x+ j" s: F" b" x
Fire(384, 48, 192, 192),
) c2 Y( O( R$ Q. T; R: B: i" p Fire(384, 64, 256, 256),
+ Y' c1 d, d) v( v, m nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
' L) ], l7 w0 k* J1 k% ` Fire(512, 64, 256, 256),0 V y, u8 X; }9 s
)) d) B5 L( f1 L, C4 ]
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)+ _+ }7 \- m: f
self.classifier = nn.Sequential(
G. ^/ s6 O8 p- d' S8 \2 U6 C }* P nn.Dropout(p=0.5),% h6 s; V7 f9 u2 }3 F2 o1 p
final_conv,
|: h0 C+ L0 L5 t }6 L; c nn.ReLU(inplace=True),3 \. \1 |8 @) z ]! l) y4 E
nn.AdaptiveAvgPool2d((1, 1))
; f+ }7 u2 a/ o7 }6 n# u" y& @)" a6 ]! v! ~: D$ W; M) b
0 o8 q8 t, Y6 D
- y! P. t' L3 Y# ~6 }1! ]. N0 j4 B) h9 U
20 b4 @8 t4 x$ `8 M
3 e& _' r* v3 ^6 q" g0 i8 y; m
4( e4 r3 \- F, _' Y6 ~
5# M8 ^9 G6 c2 v' Z# |+ r
6: W2 w# x# r% j: a& C
7- r9 @0 Z8 q- G! ~: k0 g# N8 h
89 z1 N& P. ?+ B. a& G' [
9
}8 k4 b& H, g8 v1 C10
) R a. K6 u8 w$ v11
- p7 |: l6 U _12
) G! e9 ]! R( j136 {2 {- `3 V9 j. b- u
14
! _* m1 J# o0 D15+ Q% |- e4 ?3 n& g* e& v
16& Z! t# X8 {$ z5 z) F# F P
17
' ]# G; ^7 f$ \% p" ?& I18
8 A0 ?! ] w& s: o4 |6 E" e" f19
3 A* \4 E; [. }+ X20
2 Z4 S* Y0 o/ M( V( O8 o21
/ a7 y4 ^ T6 |2 W" V22% Z! W3 L$ s6 i9 E9 }5 ^
23( ]7 G( S3 C. [
SqueezeNet1_1的网络结构如下:
# Y! J+ v9 F# i0 G" j. L
4 h; R7 m6 K; l. V' G& R1 z0 Sself.features = nn.Sequential($ [# D4 A" H, Y8 Q$ z! ?0 B1 k9 U" ]
nn.Conv2d(3, 64, kernel_size=3, stride=2),
# g( m: N7 K7 d nn.ReLU(inplace=True),
- o7 g" c4 Y" b: U- d$ _ nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
. u2 U+ U2 l/ Q8 y Fire(64, 16, 64, 64),
$ g: G0 l% f5 M( A& v Fire(128, 16, 64, 64),. P) r: x5 Q5 f- K' z: o6 @
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),8 [* y6 R0 {* X2 h5 ]
Fire(128, 32, 128, 128),
. M& [0 `6 c/ b2 | Fire(256, 32, 128, 128),
; S' K+ d$ e9 Y% _$ y) k" O- l; } nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),3 U$ D5 @, p) A( W1 n
Fire(256, 48, 192, 192),
- C/ M' I: e v$ Q/ | Fire(384, 48, 192, 192),/ f4 C6 a, I; `" H: t4 y# y% F
Fire(384, 64, 256, 256),
- \; M$ {4 C; ? q Fire(512, 64, 256, 256),
, z. \# Z' U9 \- f& w2 y)/ |4 @# D# {4 h: n
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)* K0 W Q2 A" U
self.classifier = nn.Sequential(2 m' ~( b4 o6 h& l4 N+ u+ _
nn.Dropout(p=0.5)," h6 \" A- [6 ~. g
final_conv,
2 V! b V: d" J' Q- b nn.ReLU(inplace=True),
, [5 k! e4 k3 {' O, ~# x nn.AdaptiveAvgPool2d((1, 1))/ q4 y0 F( ]8 a" X& K+ Q
)
. P' Y' _: w) ]5 H0 ]9 o; x5 t+ C t, x( f8 t
1+ s' O6 j9 D( e/ ?5 f( A# Z* [% ]% W
2/ o& b2 W8 _ w9 I/ X0 \) R1 a3 L
3
9 N6 E! F: J+ D6 j0 W% W4
% o: s3 M) Y3 S5
' [* @6 J) B. p4 Q* l! Y, p6( }: k) D9 U! O0 o6 L! k
71 R$ @/ {# _. |7 _$ s/ {% S% a
8
/ o! h) O/ t8 i" b7 N' J9
0 X2 n3 c% M. d106 I8 P8 m) }% }( C7 ]
115 g' K3 `% ^% Q. W' |
12
2 U* F/ e7 a0 i$ D13( X" J$ E+ ?: J2 p
14
( K- N, J1 P8 v9 t N15/ ~/ _/ @" E. k0 J
16
& k+ p) j1 }7 s9 ~. B, n17
, M7 a' y( @! K) q( @/ O+ r18
( f# D4 h' z- q4 N0 V) H) Z7 O194 }* l T G& k5 k
20
: @" d4 o% Y& \, l& ?' k$ n7 O1 [- n6 A21
% F: A; j% L, Y" Q. r4 z22
. w! |- M# Y: a5 N" wSqueezeNet各层详细参数量及其输入输出如下表所示。# @# Z) |% B% w( G7 z& a
, F. q- u" l( Q4 _ g) L: [! l9 V
$ l. F4 |% q) N; w4.2.6 其他实现细节( z' i+ y& E! \% s" ^5 N
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
; E% ]9 n, {% o4 ]+ S2 Ysqueeze和expand层中使用ReLU
; H! t8 v, A8 z# l) o在fire9之后的layer中使用ratio为50%的Dropout0 Y1 j8 C7 V8 K; G
参考NiN算法想法,SqueezeNet中不含全连接层
3 [( ]& O8 j7 D2 ]( p. t$ d训练时,前期学习率设置为0.04,然后线性减少
) o( h6 {" J# c2 }5 f& n4.2.7 总结
1 `9 G1 A+ `8 l2 k6 A# w本文最主要就是三点:* X, J: K9 {9 S* ~& V$ J
" @! H, s% A$ c& ^
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
# D; z1 w% F) {" f减少输入到3×3卷积的特征图的通道数,减少参数量
) t$ L; B/ X8 F不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率6 t, a& Y6 p! F7 w& s% e
————————————————' F" O, I; ^+ Z- ?$ o
版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 b3 A: U$ ]5 u8 A
原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
0 b8 S8 b( h' h' g& l# f/ C3 Z
$ \2 v8 N3 o8 L1 J: u: u# \* k- p, F9 t$ t- N" B' H
|
zan
|