- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565164 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174772
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
2 h' v4 F) [' l5 C1 Z轻量级神经网络算法-SqueezeNet
; K& I4 H4 q8 [$ h; V% l- E. J4. 轻量级神经网络算法目录; S+ H" e% @+ \; w6 t- E7 |1 e
轻量级神经网络算法3 H6 ^" u' F5 k4 @
4.1 各轻量级神经网络算法总结对比/ t$ r! L$ {: L9 m9 p4 m9 ?& R
4.2 SqueezeNet' s' ^, Z9 U8 M3 Y( |) T" |6 i
4.3 DenseNet
& `" _, s2 u0 S. K a0 t3 W+ H4.4 Xception
( y8 ^% T8 c% T4.5 MobileNet v1
: j2 N" @* _2 C. M7 U8 G a' d# B4.6 IGCV
- v# }1 V5 {& `1 r, w! i/ k4.7 NASNet
/ j0 Y( ?/ S2 w. ]5 z4.8 CondenseNet
* C# V% ^8 A. c) U4.9 PNASNet5 @ v7 n8 l# W7 p. B0 M
4.10 SENet
1 u0 B4 l. I* U! T4.11 ShuffleNet v1
) R- b* R& d8 H4.12 MobileNet v2, M. W0 a$ D+ O- x) D) b8 Q; I2 [
4.13 AmoebaNet' h/ S C) z! Z; f' o* b
4.14 IGCV2
- Z; k% f' z5 ^; G6 Q, \! S' @& n4.15 IGCV3
3 q; T# y& s3 M. t/ J, i/ ?4.16 ShuffleNet v2
- G3 k; G3 Q/ `) y `7 T4.17 MnasNet
! f. M' I1 L! O! ~4.18 MobileNet v3
! M4 y, `" W+ T深度学习知识点总结: ^( Y @/ J! C4 P
x; m; u8 _/ W3 P- F; K( r& o
专栏链接:' R$ R) D$ ~. m$ {' i1 s
https://blog.csdn.net/qq_39707285/article/details/124005405
! [. O0 z( A @本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。5 J, B0 o6 C+ U% Y" e. z
p( z: i# i1 s. W( i' A N4 T本章目录6 ?% q/ Z7 A& @4 C6 h
4. 轻量级神经网络算法目录1 Y) m- I2 H% s
4.2 SqueezeNet k0 W, ^: p: ]8 Z
4.2.1 问题分析6 i7 s- g$ v1 i5 I6 q8 s
4.2.2 SqueezeNet的三大策略" k; g: O2 E7 o1 O i
4.2.3 Fire模块
; G% D/ f$ q$ m. z4.2.4 SqueezeNet整理结构$ H, H8 R! \3 d- ?
4.2.5 代码实现SqueezeNet
+ Q) O9 C: ]$ s1 Z4.2.6 其他实现细节 h& v F7 Q8 k8 m5 y" a
4.2.7 总结
; i# w% I% o$ k0 e4.2 SqueezeNet( J$ o: R# Z r4 }
4.2.1 问题分析
5 e0 P3 f" L" Y& T: P% x" Q6 k) V4 _6 T最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:. B6 P) I/ x3 |. F8 |- L
+ [4 E9 V. Z& f! ?6 d在分布式训练期间,较小的CNN需要较少的跨服务器通信' P( k$ P' }5 [! ?. b
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入; h1 b: C8 x" s( G( E
较小的CNN更适合部署在FPGA和其他内存有限的硬件上, }- u5 w' V7 K9 s: E
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
2 I! I* b4 ~4 \9 S3 t- f/ u5 p& u. F1 b1 p+ R' M' B) e/ {& I7 q
4.2.2 SqueezeNet的三大策略
- R# ]: h9 g5 P8 r- B4 n; \策略1:用1x1卷积代替3x3卷积6 G# a0 |0 n# {# ]& G8 p
1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。% ?& x1 x' i: T- y
% k1 V0 [. h2 k7 u4 w/ T6 K
策略2:减少输入到3*3卷积核的通道数量
5 }' C, x( z! @- z6 d" A对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。$ n: p, b0 {; q- G; W. |
! Y* K3 y$ ]9 J4 U; b策略3:在网络后期再进行下采样,使卷积层具有较大的激活图4 Z% c R+ w9 C, F
这里的激活图(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中。
% Q& g u4 U: Z2 k( C
5 F+ J+ T4 L5 L4 X- g$ x策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
0 d! M: L2 r& n% S3 |# h/ _4 I
# Y8 g) Q ~' {0 }4.2.3 Fire模块! f" |% Z' d1 H$ Q
为实现这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的想法。& {4 U$ \1 p2 }
- }2 a; P4 K+ e( C4 t7 s5 N5 e$ b9 H4 y# B
4.2.4 SqueezeNet整理结构. X2 s2 Q& o+ N/ A4 I g) ^! Z
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。7 q0 P6 \. X3 e% e6 `1 N. u/ G4 ^% z
( r3 {0 f' j- g6 U
7 B8 ?) Y; m, k$ g! G+ X4 c
4.2.5 代码实现SqueezeNet
) S8 N, U! i* M* \9 N/ ^1 GFire模块的代码如下:
/ z- t" I* S, A7 N" t, `1 ?5 ~$ A* v) v4 L2 u
class Fire(nn.Module):
0 g3 [! P5 i/ o. n" m7 J& W+ C
k S4 ^$ r$ m. U def __init__(/ u+ u( C% V, P+ E
self,
3 U. p& r m& o$ ]& @# p. r2 u3 s inplanes: int,- F4 N! i+ P- u0 N4 f y7 Y/ E
squeeze_planes: int,
- G) r$ Z; e3 y0 d expand1x1_planes: int,
9 X+ l" P4 ^" n9 p4 O- r expand3x3_planes: int- ]( Q$ A" @ `3 W' e5 D
) -> None: k# r* ], q7 r% d. S2 I: Q% Y
super(Fire, self).__init__()7 R2 x* e4 W1 p4 h0 D: u. h. u9 E
self.inplanes = inplanes
0 _, j2 _8 o6 w' N self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
/ O+ }) w, t5 Y4 T self.squeeze_activation = nn.ReLU(inplace=True)
6 h' j1 j; c4 @% K8 W- Z- c self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,- {$ R# {4 q( T; s
kernel_size=1)9 T' b6 w* K W& Y9 n
self.expand1x1_activation = nn.ReLU(inplace=True)9 k7 U- z7 j. d# j# s& k) m
self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
4 I9 j+ M* j3 h: r3 g+ ] kernel_size=3, padding=1)/ u0 b/ e& v$ g: ^& A
self.expand3x3_activation = nn.ReLU(inplace=True)& d" L0 A9 L& T2 p3 s6 d) g
% c* [( F% J7 c1 w4 g' |7 C$ n def forward(self, x: torch.Tensor) -> torch.Tensor:& C! L' p# A6 A2 d% {6 W4 O& z3 Y
x = self.squeeze_activation(self.squeeze(x))
$ q) p# p5 A. \4 ^) m2 ^ return torch.cat([
1 _8 V2 X6 X, h! T' Z self.expand1x1_activation(self.expand1x1(x)),
! \3 {( O4 R% P9 {6 w9 F; C) i* r self.expand3x3_activation(self.expand3x3(x))% W3 V, U" Y" L
], 1)
; N$ |) |- p+ k* ?! ]4 I- ?+ X& t5 v" q! V
1
- U1 {! r, J0 a- z; \28 c( S# _9 J% i) d, s7 R4 i6 x
3
. ?3 A6 ]6 Q# X4
6 }6 t- Z! b. Z$ E, Q1 i+ E5
, K8 N4 U* `, F6/ w3 b9 K. c/ P( U+ @7 ^, f, {
7+ ~0 G( U* O+ N D: b. a( B
8
1 {8 }) ^- ^5 s+ l; f; {- N9
( l3 @0 \' C: L* m* t7 A10
+ v8 C: W' A* }7 w) j; W11
( ~& Q+ A9 Z' B, ^5 r12& ?$ h# c' [' p2 @. E7 q0 J) }& _
13
$ m! P! n1 R6 f; [- t- M& J: d, k4 E14
( G+ N; x8 b$ m; ~- N; D15
, ^; T- M0 k# a16
$ A1 d' j0 H, Q) G% f4 u; u1 R17
! _4 D# a+ k; L4 v% X, `18& N! U( y" }. [
19$ h0 l1 C7 M. J/ ~8 x5 D( t
20
% n% T6 g% q8 v21' b4 T- a$ P9 Y
227 p; U3 W$ Y9 L- g7 y9 P
23+ L1 f5 {1 K! m# W$ v9 B4 ?$ p# S
243 x2 [; u) k# R
258 P) i7 g6 y: b" F7 d) f
26
6 }* y# S& N2 ?$ i+ USqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
& _$ n0 ]. l5 I* y
$ V, a; ^) S* O* q, v1 xSqueezeNet1_0的网络结构如下:, L1 H- \9 a) S# `% S: k1 u5 f6 _
4 Y* c R7 v3 B' h
self.features = nn.Sequential(
. }5 @) v2 s8 [& P7 J nn.Conv2d(3, 96, kernel_size=7, stride=2),
: B" ?' P1 k2 W1 S7 Z# z; U' {& Y nn.ReLU(inplace=True),
9 D3 v# a8 i5 {1 f nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),# e7 U% ?; H5 [# d9 U+ _
Fire(96, 16, 64, 64),3 f6 z, v$ z5 O0 S7 k3 i4 O
Fire(128, 16, 64, 64),' d5 B- u* s4 P: G
Fire(128, 32, 128, 128),8 @/ ^0 A# `: Z+ K9 [
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
2 R _; ]! R! E Fire(256, 32, 128, 128),/ J- e0 r& y: }- B0 h+ ]
Fire(256, 48, 192, 192),, J) V/ e# c. ^: e5 o
Fire(384, 48, 192, 192),) n$ N$ E1 h+ K) ~% D
Fire(384, 64, 256, 256),
( z" h- U7 g& o8 { nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),: V) D/ @* H- n3 n) L8 g, q
Fire(512, 64, 256, 256),
; {$ x! h' o* S- f)
3 X( G- d. b, h: @( Kfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)& ]4 |4 r1 f+ @$ z& [8 X
self.classifier = nn.Sequential(- h- n/ i2 w6 z9 t
nn.Dropout(p=0.5),
2 Z4 a9 S0 _2 ?9 d! A# S% u' S final_conv,
, R8 Q, ]& n' u+ ` nn.ReLU(inplace=True),/ l& I1 i3 l* i
nn.AdaptiveAvgPool2d((1, 1))8 {4 E' y+ v* }+ T( U
)1 U5 e3 J! C+ o1 e# h
6 k; A1 D- ~/ ~( v4 I) V/ d
( @; ^# j2 {7 O7 G3 [1 G( P6 ]" s
12 M% \- A( t4 C2 F( V! ^
26 ?& ^# }; r% a0 e6 e; x0 x
3
' W8 u2 S* f0 K* I4 x4: h6 ?' T, H' \' ~* z# a
5
' [6 Z5 M! ^& F4 t6' N2 G+ D0 g2 b+ L$ Z3 I
7, d( |% Z' x5 P( p
8
# k/ K5 v1 G. k' s! c9
) |2 x" }1 Z' {2 l3 P8 l+ b; S4 Z103 |9 h: M: E c# A
116 T) U0 I! @2 S7 H
12
( e) Y) g! a% Y/ B6 o13
. Q' S: @4 _$ R" X147 g, `2 R9 z1 X ]1 y z6 s, O
15
: {9 u7 l: x8 S1 D3 K/ {16
6 d" b, `/ {7 Y: i17
. I+ ~1 }& M1 P a182 e& R( c$ F0 j# Y9 s; e
19; k8 p$ X! P' {3 ?
20
) q: k0 k( O1 ^. u6 P21
4 Y- `. c/ S4 x5 C) \" d22
9 ~0 [1 A: G8 J+ d' C4 l" o23: V* |3 L' ^ |0 a( L4 a+ }2 [
SqueezeNet1_1的网络结构如下:
" f+ I* Q/ U" Y Z# S/ A' |
6 G# J# u, t* ?self.features = nn.Sequential(/ U( V- K: G3 U
nn.Conv2d(3, 64, kernel_size=3, stride=2),
4 [! f( R: j O4 Q b F0 b nn.ReLU(inplace=True),% ~9 M" ~: c* g) D
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),' s, x' r! p& g! x/ J( y! P8 U
Fire(64, 16, 64, 64),
6 t$ V9 L+ R; R5 @/ m/ o! {& o Fire(128, 16, 64, 64),
2 g- v9 }$ p. U' k% j nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),/ N, p1 ?" }6 Y% g6 a0 @
Fire(128, 32, 128, 128),( G6 `3 E& y5 |6 I6 f
Fire(256, 32, 128, 128),
7 n5 M* q f, y8 @& _ nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),5 P9 N& l+ ^/ p. e" s+ [& d9 e
Fire(256, 48, 192, 192),
: ?% @! Q+ T* ]4 @, X Fire(384, 48, 192, 192),
1 G% `0 ?2 ^+ V! p6 w; |9 H Fire(384, 64, 256, 256),
0 G/ I: }/ v8 \ O Fire(512, 64, 256, 256),
8 |& t. x0 ~6 X4 x) R( {1 ])
8 p3 s1 o4 w0 m" B1 t0 e# tfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
% x$ x) s. d+ Y1 i3 `self.classifier = nn.Sequential(7 U7 b3 z$ h) f5 f
nn.Dropout(p=0.5),
$ m* L. F. f7 X: e final_conv,
" k" z" [# M& n nn.ReLU(inplace=True),7 s; p+ K1 w' x2 |/ p6 j3 h, i
nn.AdaptiveAvgPool2d((1, 1))
* {; q- ?5 y! p+ @0 t# t+ R5 q) @). l% I; r4 }$ l2 d$ S$ I, s! Z
- n, w; Q! p# o# {5 S4 ]
1
$ A& f& i4 g& }) n+ R. @2
6 \; |& M F$ J5 V6 O, K" s3
; h& u, m/ ]# G+ G; L4+ I; n3 z7 u/ @. L
5
7 T0 ], K4 d3 E8 L5 P/ g64 d/ @+ O9 u! U3 K2 _
7$ \' l/ a; S n/ L2 E) [
8: R1 H! V" [- N8 [' W' C. s0 s _
9
7 v/ j+ N4 O9 }106 V5 a& N7 I! P9 T& U9 H4 ~
11
2 I4 h, G8 C, d2 N12 }7 {: @* Q0 }
13
. U: x7 s, P; Z9 I7 _# z146 ~& i; j( I. S9 J$ s) r' w7 K
15/ S* c$ q3 e" O' i8 [9 {* ~
16( k% z0 D' ~% ~6 n9 P- A: ~
174 ~8 `; Q& N& }+ Q& G8 R8 T
18/ K* |4 z( B; K0 c- Y8 x
19; N4 Y- X, {4 w1 Y$ ^' C
20
/ [# |* ^) C5 i* R, a) r D1 ^" @21
! q9 R5 @) F% t3 K22
" X+ S; f7 q5 B* ~SqueezeNet各层详细参数量及其输入输出如下表所示。3 H% K! w" J" X& |$ f; _4 M' T3 r
Y) n) W& {( K o) r4 D
; M, u+ ~5 d/ ^3 }, R/ u
4.2.6 其他实现细节0 G( Y& o/ V* T+ }/ k; O
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
, E5 [6 @, u9 J. K7 m# {, {8 f) Gsqueeze和expand层中使用ReLU
1 K+ M; ?2 h; z% M- ^8 ]6 y( ]在fire9之后的layer中使用ratio为50%的Dropout
" x0 f: _" f; l+ E/ M- m& H参考NiN算法想法,SqueezeNet中不含全连接层
/ c6 O' q, q) J) C训练时,前期学习率设置为0.04,然后线性减少
6 ^8 k7 @6 Z3 ?" }8 w4.2.7 总结9 G) ]. t' J! L- j; e: \3 o G
本文最主要就是三点:2 F0 W7 ~! d7 [0 k6 q
! h; F# Q' ?2 |+ J3 p6 j3 _8 x8 q
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
% P2 \, O" |) V& U减少输入到3×3卷积的特征图的通道数,减少参数量
7 S4 M4 ~* v& S, d- N4 w2 T6 M+ `不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率0 S( P9 l6 z u% r
————————————————
# E" T: M( X0 _! q( q. Z版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( y* I% A% S' I$ X b T6 f8 s原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100) ?; I, x' L- \8 H0 d, A& b& ?
. V7 ?& ? N- _5 @* q- D+ ]
3 b, f k0 f' Q/ T: ]! K: w5 c6 [4 ?0 K |
zan
|