- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563302 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174213
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
" M8 I) l+ H% k( G4 {/ s轻量级神经网络算法-SqueezeNet
! Q8 s" H5 q6 P/ e; K4. 轻量级神经网络算法目录
* m! l9 C' X: N0 H. C0 x. Y轻量级神经网络算法
- d3 H5 |9 [; p6 D* e- Z' e4.1 各轻量级神经网络算法总结对比
- c& V4 J' w' A2 J3 C. F( l4.2 SqueezeNet
- T7 K0 ^8 B) V0 p9 c4.3 DenseNet
9 |) `3 C4 }6 T/ v' T6 j. _4.4 Xception1 k/ O% c( Y# {) l
4.5 MobileNet v1
# P0 Y# J/ q0 D/ h: b4.6 IGCV1 F' l% n* L9 ~: J6 j6 W$ c! s( g
4.7 NASNet, V6 D2 t+ _1 d% w8 {; z
4.8 CondenseNet
" S7 k; d, l$ C3 ^, U3 [# P9 q9 @4.9 PNASNet2 n8 ]: O; F) c2 N; o) O" Q" L) B
4.10 SENet0 ~3 V3 d( y$ G4 W+ `
4.11 ShuffleNet v1
7 m( W; L3 K9 x* h. c9 v5 E4.12 MobileNet v2" l+ ]" k/ O% |. @
4.13 AmoebaNet$ K3 ^+ V! z6 n9 ]
4.14 IGCV2
' T4 g" J, Y$ P7 j8 g- O' f: y1 E4.15 IGCV3. c/ G# e3 b! a
4.16 ShuffleNet v2
- o4 z& N$ P5 B" v, O! B7 A# }( `4.17 MnasNet& d, v# P$ w" I, v( a& C
4.18 MobileNet v3 Q: M# _: {- @' P/ q- A
深度学习知识点总结
- k) z9 G; m0 i" E! \$ C# V/ v1 ?4 V, [9 H% u
专栏链接:; s# W* \6 h7 M- L- ^$ [
https://blog.csdn.net/qq_39707285/article/details/124005405
6 L8 ~3 L' ]8 x本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
7 f; x. b$ e6 s& P3 A% y# t# ^7 ?- f+ L
本章目录
. q" N' f- W" i4. 轻量级神经网络算法目录 _7 G: m% ] o( l
4.2 SqueezeNet
7 [% G; e5 a2 k% W& h4.2.1 问题分析
7 {9 J( y* s {! J4.2.2 SqueezeNet的三大策略
, {& @& |- G# o4 M* l5 Z4.2.3 Fire模块' t# e9 ?% H* @. k& d k
4.2.4 SqueezeNet整理结构
! C ~! }: g( A3 I( |* h4 M- q4.2.5 代码实现SqueezeNet
4 ^7 X3 c, _- L' g4 [% T) k- u4.2.6 其他实现细节" V5 b! g$ i) z7 e. m
4.2.7 总结8 O; ~, Z" P& D2 _" y2 J
4.2 SqueezeNet
7 T$ W' T- }: |7 C. N4.2.1 问题分析
. g: F' V V9 Y, I' \最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:; E( `8 P) P0 i; r* t
4 f5 ]6 i2 k9 U8 I0 C" N* A+ T在分布式训练期间,较小的CNN需要较少的跨服务器通信6 ?3 D: [+ @8 p! ?: k$ u4 f& r$ D+ t
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
* b! h- M) V( u9 p! n较小的CNN更适合部署在FPGA和其他内存有限的硬件上7 t7 z! m& Y5 ]( J& s7 U; j" e- J
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。4 Z+ C' j& M1 g) L& M. O
" M& d0 S! _# q& f4.2.2 SqueezeNet的三大策略
8 N* C6 l- N5 \: R策略1:用1x1卷积代替3x3卷积
: N9 k/ m2 ]: S* Z1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。4 L% W* T# c. ?6 w1 m. ^, \6 s
/ Z, I+ B- _5 B' t' c策略2:减少输入到3*3卷积核的通道数量
- P/ p$ O) _/ Y+ z5 \' ~) j$ y2 ^对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。8 ^; \4 ?! r; l& r* k
2 W: }/ L$ C0 w4 r1 o7 v策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
% ~0 x& n$ V- }/ g" [这里的激活图(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中。
( m0 ]' C$ \3 Y' t! u- i
4 m3 a& d. y! T f策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
) |# Y3 ~; t3 {8 [2 V
: ~: a. w1 t3 ^/ Z9 j4 |0 l6 t4.2.3 Fire模块2 s7 @% T a$ r. 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的想法。' B5 j/ ?% @/ F9 o' J1 L
) O/ [) O. ?1 i
" |! W0 V/ Z1 F+ U# \2 |/ V4.2.4 SqueezeNet整理结构2 C* l) j. U# ~3 \0 m: _/ V
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
. z) y5 ~$ {/ U+ Q- R' L* X4 w# D0 I ~- e1 Z/ A& n0 g
) q( y2 ^3 F9 S% }5 a8 Q4.2.5 代码实现SqueezeNet
, t! P& ~/ e' N6 G% l) NFire模块的代码如下:) E! I" I/ k" c$ v0 F L4 |
3 h6 l# s$ I5 [# @6 \class Fire(nn.Module):
# d5 ~9 C' |: D+ S
; ~8 Y4 q2 N0 c def __init__(
|& C5 M \" J4 w8 t! a self,
) o" n g7 _; M/ j6 i5 w inplanes: int,
- X) }' F4 h7 p; t; X* K. ? squeeze_planes: int,( Y; t3 m) s" c4 f: v( k* P
expand1x1_planes: int,
* j+ H6 h; y9 Z, H! s+ \ expand3x3_planes: int
/ N k$ C) p$ }" g7 V ) -> None:
; l7 F# B: k: w/ u super(Fire, self).__init__()
; x2 A8 | X& H) k: A3 Z- n self.inplanes = inplanes
& M; B- V, t8 s6 l/ j0 K self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)$ F4 n) R% x- [( s! V6 M
self.squeeze_activation = nn.ReLU(inplace=True)' @' ^& U( f% y. P' Z$ Z0 y6 @
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,7 H% o" ?' {: c* f5 h8 Q
kernel_size=1)
: X% v! _. u4 e @* g9 X1 { self.expand1x1_activation = nn.ReLU(inplace=True)
& Q1 V4 y m, R3 G, j: z$ l self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
6 C/ ^5 @/ y9 f kernel_size=3, padding=1)
/ b9 i' Y/ w9 j" t/ S; C3 \! i" D0 n self.expand3x3_activation = nn.ReLU(inplace=True)
) l; `$ a4 i+ H' K
; [( W! l* G2 ?1 _ def forward(self, x: torch.Tensor) -> torch.Tensor: `: c6 e8 E d- I/ k: r
x = self.squeeze_activation(self.squeeze(x))
) o$ c8 B3 ?5 q' [! i& l return torch.cat([
# d6 ^- o+ c, q: h2 G3 ?/ K x/ p self.expand1x1_activation(self.expand1x1(x)),5 e$ j* K7 ^0 V4 s% N A
self.expand3x3_activation(self.expand3x3(x))* z5 |0 R* S0 z
], 1)
* d# D* Q+ N- t+ ]! A7 R
- V' ~3 H0 A& P18 o6 |$ G4 l0 A G
2
9 V: ?6 \1 D$ Y+ r" M' j: f; L$ C3
2 W- w4 |/ S/ T r& u4) T; r+ t1 w7 \. S
5
0 B ?; T$ j& Q: t+ Z' |6
" ~0 b0 D" X0 `6 q7
9 p9 g# D6 K: Z" b; q8
6 f c3 }9 ]# _4 s3 T5 @! y# h# [91 H8 n2 v: K4 v! s6 R" w& {8 z% m0 V
10
; d; o- }+ g$ q% `1 ?11
* Y- N w; j3 A2 K1 t12+ v; W# l/ F3 w) E
13- t( A; k% |% X: S: h
14* R6 Q9 s, s7 n1 w n
15$ A5 M" L* v& N- \) b
160 ], ^" S$ l0 t8 p
17, y) t+ l$ r+ |/ c# h' h$ _. Y
18
' o7 u7 L7 V' }% A$ J6 o$ p19: p: X0 V) L: w- {: N
20
+ }# k, A( U( P; i6 x215 A, {' Y( X7 z4 u. a5 L( M
22
3 ]; V, t% y: T# J4 y23. j$ i, R1 I+ [3 V+ f2 F
24$ s |& ~ A' f- s
25) n# W# V4 s# v5 W( a
26
4 r6 @' R0 y KSqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
4 W; ^5 G- C- i: N9 J/ b8 J0 X' ?) I
SqueezeNet1_0的网络结构如下:
: g; k3 k6 H: _0 u' T* _) a; o
2 F" w6 d& D7 ~! D; Eself.features = nn.Sequential(; L& V, h; v0 ?' a0 X/ k
nn.Conv2d(3, 96, kernel_size=7, stride=2),
# z7 V) O0 c& G2 T+ X nn.ReLU(inplace=True),
9 y0 R b4 j8 [4 F nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
, R* r* F1 ?. ^ Fire(96, 16, 64, 64),1 u3 w7 Z( v4 W1 x
Fire(128, 16, 64, 64),
+ f9 U0 P" V7 }9 P Fire(128, 32, 128, 128),5 Q: E& c1 C! B1 O3 [
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
! Z U7 u! u' C: x4 X8 h Fire(256, 32, 128, 128),% n, F: c! n3 z8 ]4 F, \4 ?
Fire(256, 48, 192, 192),
3 L ?0 [& d' y$ E. y/ P Fire(384, 48, 192, 192),8 G; c& S, |- U! J- ]& }
Fire(384, 64, 256, 256),1 C( a+ O$ o4 H
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),' i ?7 N, K& O2 G% t5 [
Fire(512, 64, 256, 256)," u/ v4 H0 I+ u' f& i7 a) Z5 h& e- e9 `7 G
)
1 Z* r9 G. \. A5 t0 Ifinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
. d ]* j/ z' E) Eself.classifier = nn.Sequential(
Z9 x( ?2 @4 j. V' q5 O# }2 [ nn.Dropout(p=0.5),
! j, _! g- o6 ?: f final_conv,( x% Y: q2 \8 z& f- C
nn.ReLU(inplace=True),
4 ~; B$ N- _" N9 [+ ^ nn.AdaptiveAvgPool2d((1, 1))
7 S1 P) s" ]; T' d3 z5 z. y3 K)* S( o0 i; C, M o( }: U
9 V7 _' @( K* o. K& x' R3 I. v
( J0 Z$ {" @9 j W3 b1( R$ J7 L# f- U
2
9 e) H" a: o; H+ ~: [' |3: k# o1 d& w8 O4 q4 T2 U$ X! `
41 |% V- I) O4 o% \8 n8 U
5
- y9 d% E0 a! E% O" g6( P; F2 d. R% A% u" e1 f |" _2 x
70 N- A( y; ]$ u1 f& Q$ B7 s
8- u( h5 l$ R4 O( J8 x- p: E( ^
9
% V* x7 s T2 J6 w( e; g10% M& q/ D6 j' m, g2 F$ y q: i
11. f/ a9 t% q, N9 \9 L
12, i" Z1 C0 U1 V. Q' r
13$ C) E: F/ v0 W5 z2 x
14+ O( m$ h6 z- z4 W" n
15
; p9 S" A# h0 f+ r, j7 |162 P8 l m6 ?+ M( h- l* [$ r
172 ?# G* p1 p: e( k- |
18( S3 W, y' x1 o5 k
19
; ?0 _# g/ q0 y; c& N8 G+ \$ [20- ^9 n' i( |/ _1 `! M6 O/ ?0 Y1 m
21
6 `& s* M: N4 W! h22
% x+ S. O( F5 x. O( M% \ J9 y23
8 r: _) q# k8 U0 k4 R# S1 ?SqueezeNet1_1的网络结构如下:
/ s- A) i: O& d4 P5 g# L( v2 i9 N% K$ S' X
self.features = nn.Sequential(
) G& j3 d2 |; \* S/ r nn.Conv2d(3, 64, kernel_size=3, stride=2),
0 M& @/ z& R" m7 P) u5 ~; Z nn.ReLU(inplace=True),
9 S0 x& E# o' d% [3 p% ^ nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
I5 O1 a" l$ r( M Fire(64, 16, 64, 64),5 F" U3 |1 E; L
Fire(128, 16, 64, 64),
" m- }0 G2 ?4 z- { nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),7 T. o$ w+ I4 s2 P0 K9 V& u$ s% `
Fire(128, 32, 128, 128),
/ B, t1 Y- E9 f; w9 t' Y2 | Fire(256, 32, 128, 128),
2 ~$ z7 Z+ D+ ~( a7 ~: G nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
2 ^; N+ b- `- x: ]) P' Y Fire(256, 48, 192, 192),8 Y# O% O B& F" M8 H
Fire(384, 48, 192, 192),
$ z6 F+ e# F- w. A& l9 ] Fire(384, 64, 256, 256),% `6 P# G3 _& J, d
Fire(512, 64, 256, 256),6 R3 F3 } o4 g; j0 B |# A8 E
)2 S& d4 T$ y% k
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)& M5 M! { Z" z( D; i& C5 |, L, B
self.classifier = nn.Sequential(" N9 b v" \: @2 c. g
nn.Dropout(p=0.5),8 X( W* z" p1 D$ n' {( V8 ~
final_conv,4 h) @7 [8 V2 s0 }
nn.ReLU(inplace=True),
/ ?7 @3 W' y% s6 C) k& C- S3 n9 u nn.AdaptiveAvgPool2d((1, 1))
( |. z6 G" G) U% G, U8 G4 E)8 l2 m4 d t3 J! T9 Z5 E( R5 A9 O) a
$ D* H+ [4 e' T3 e/ j9 \) P1
6 s: f: O3 q) c* A/ H, O+ s% Q: ?+ F2" s8 ]7 w' ?+ X1 ], c
3
4 |7 l3 p3 M% M$ t; g* k8 C8 M4# q/ C9 R8 N; U- D, O! `
5
X& U0 m8 e& ~* i1 R6
) C* ? ^: R+ H2 w+ s% `+ J: G7
4 w- y" o! y4 h% O8
m }1 o' o; n+ e9
+ J8 s5 [ z) ~& o9 y) z( q) z" P109 t: p% `/ z0 A8 g* H1 g' @9 q
11
0 T% B+ n3 M3 p4 i0 s" c! Z12% P* g3 h( G- d5 t" W! z) |& F
13
: }% W1 C3 H4 f5 C+ q2 |14. s# k9 b5 K; Y: Z, p$ O
15
2 D# F* W4 a5 i$ C2 V16: w+ j$ x- c' S6 V
178 v6 g9 F8 j: Z L: K: X0 ]7 J
185 a( D+ Z5 L8 {: J" _6 q
197 J2 {! w P0 w' H% ?& Z Y! Q: C
20
* I$ }% ~6 X# _; h% h21
# `+ P4 y4 N9 o' z22) N5 ~) K! t0 J/ |
SqueezeNet各层详细参数量及其输入输出如下表所示。/ p; A) W( @) P" ?; F
& ?7 B6 G2 D8 g% w3 {& o4 P
% `! Q- r8 q) s" j& T$ \6 Z4.2.6 其他实现细节/ M. s% A g0 M9 o
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
' S1 F( r! K7 K& z5 d9 h ksqueeze和expand层中使用ReLU! |6 z J! V7 S$ f- a- Y
在fire9之后的layer中使用ratio为50%的Dropout
! C* j" A/ U4 \7 M4 R参考NiN算法想法,SqueezeNet中不含全连接层0 _( ^0 v- p# E- X& G- a) M6 f
训练时,前期学习率设置为0.04,然后线性减少( `7 H2 n2 v, V/ _
4.2.7 总结/ L/ _/ l2 v) s5 P* r( ?
本文最主要就是三点:
# I/ E) `) {/ r, a
( B0 S% @6 g9 \' J1 B用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果: ?" M: i; a8 j# R: D# O( k5 e
减少输入到3×3卷积的特征图的通道数,减少参数量
+ A* }) s$ M" j' k }% f不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率
6 e0 U5 M) ~( ^& `————————————————
% K. ?, n5 y7 I版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
) \7 y8 |2 M& c4 B% G原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
- L2 t! [5 i% s4 I) L- A% W: O, p$ R) R* ^
$ p) k& V9 V9 y# e6 r |
zan
|