- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563259 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174201
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
6 u5 [7 ?# [0 T( [. c
轻量级神经网络算法-SqueezeNet0 m' G; A2 p. T" b) J
4. 轻量级神经网络算法目录
6 O- c8 F9 z0 [1 t% _; ^& e轻量级神经网络算法
, |* k0 {* P* W, b4.1 各轻量级神经网络算法总结对比# t% w% ~# c0 \* z7 g* k
4.2 SqueezeNet" p; [ Q# z7 g2 ]; \4 s6 O
4.3 DenseNet( p1 c. w, N* h |( ~* B
4.4 Xception2 i/ i( m+ h: _
4.5 MobileNet v1
5 z, B4 m0 {/ z2 Q, A4.6 IGCV
) V' G2 I$ D/ z5 v ?4.7 NASNet
7 f) q' ^$ W: P) Z( v/ B- o; z4.8 CondenseNet
# [ [1 M1 u: |9 O# J4.9 PNASNet. R! ^+ Q& j4 e$ d" R, [( ?( i
4.10 SENet
, _, B/ i8 k! G6 ]) e4.11 ShuffleNet v1) r$ n& C/ f2 G2 U* {
4.12 MobileNet v2 F5 r0 h( ^# Z/ n6 F* ?5 G4 Q
4.13 AmoebaNet
( u2 F* O9 V* s/ _9 j4.14 IGCV2* ?$ ]6 w5 `) |. T. d, C. ]
4.15 IGCV3
( v1 T! z, }/ d. S: @$ \4.16 ShuffleNet v2( P; @" p4 j% S2 k( N+ Z; q! L
4.17 MnasNet4 y! V; J' z9 h2 ~3 O/ M. E* A/ m
4.18 MobileNet v3
" T. I+ b" ?% n2 k, w深度学习知识点总结
1 Q4 R. t8 p* Z% ^7 R5 G4 D2 R2 ^% `9 \; |+ S
专栏链接:5 r; q3 y& W; p/ L, t& Z7 p
https://blog.csdn.net/qq_39707285/article/details/124005405
% h( e6 f+ `# |& P" w4 ?* R. `本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。 c8 T7 I( a @1 W/ X
9 A. Y1 t2 R n& {: T本章目录
5 p0 B' K7 g4 z2 C! ^: N4. 轻量级神经网络算法目录- f4 S! Y" y' D0 z3 E2 t
4.2 SqueezeNet
! R' C/ Z# D3 D F2 O4.2.1 问题分析1 {/ M$ D: n" Y. S2 o* u/ m
4.2.2 SqueezeNet的三大策略4 v# B- N R* q# o* E, h
4.2.3 Fire模块
, j4 b" q2 G8 M, @: Z4.2.4 SqueezeNet整理结构( G6 k1 \' \- X# z
4.2.5 代码实现SqueezeNet9 ^2 ], Z! I, V7 Z$ [
4.2.6 其他实现细节
' e9 J- Y% A. j+ m" A4.2.7 总结* H" g& D! f+ X U* b( J
4.2 SqueezeNet
6 j& w( P& x S3 D, [; j4.2.1 问题分析
5 r* _/ c+ K0 F" l) z+ ~7 V4 D最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
" f- I5 h3 X( f, j+ ^1 o3 G& N l* [# L
在分布式训练期间,较小的CNN需要较少的跨服务器通信
& _- h/ t# T7 |在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入9 l4 H* G/ f6 } e4 E8 r( t
较小的CNN更适合部署在FPGA和其他内存有限的硬件上& C4 ?4 C5 C6 m( a
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
P8 K) a7 t& w7 y
5 t2 v1 e( c7 v0 [- f' B4.2.2 SqueezeNet的三大策略0 G3 D/ }) ^9 m6 z' {
策略1:用1x1卷积代替3x3卷积
; w* J' D/ h) i$ {' O% c" v1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
* Q+ m) d0 d+ N1 B) q6 a$ v+ e. Z! L$ k1 i
策略2:减少输入到3*3卷积核的通道数量9 B) G# X0 [# [7 a
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
% \0 k/ q3 L+ d6 ~4 Y6 }" c8 a
$ s$ A- T( I" z策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
6 }, @3 n' k* b/ u2 ?这里的激活图(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中。
5 B# |9 }2 b) e' x* \' L9 [4 L1 f
策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
3 g" w) ]6 h, M( H9 T9 n7 [- I! u; Q0 g6 F
4.2.3 Fire模块$ S( a7 J a2 b
为实现这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 x( m. N7 a; m
^4 c% M8 P, R: \- h
' j% ~" L) [' T: j
4.2.4 SqueezeNet整理结构
8 {0 `) H4 B# CSqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。9 b7 o8 g& ?" x+ q; C: I' L
- n) w$ e, s) {9 Q! I, t( H% G1 d% j; W* F9 _4 h- q0 R6 ^/ H: W
4.2.5 代码实现SqueezeNet6 o) o: |2 d) s4 v7 |6 @6 ^: V
Fire模块的代码如下:" ?! N2 Y" P8 K& x
' H& E$ a2 j4 B# J
class Fire(nn.Module):
0 h) q# b) U! l) X: ]3 B8 f% f4 i7 i- e( m( H8 D
def __init__(
7 m5 l7 T* K6 `/ v4 T+ [' O) i' L self,& t2 n/ d/ e) i" s9 ?/ j8 J* n
inplanes: int,! V( U0 N; P& g5 z
squeeze_planes: int,4 t. a3 s4 L' D7 d
expand1x1_planes: int,4 L% r: L4 R7 {8 n+ q" D8 r6 u
expand3x3_planes: int$ z3 @) ?; a* p; X2 l' a
) -> None:
: _( h2 \' K6 B: a ?; ?8 k' _ super(Fire, self).__init__()
# z, d: P3 U }( y: D! K self.inplanes = inplanes
# f+ Q( X4 J+ R* O- ^ self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
; S' d: |$ i: V: ^6 f4 U5 P* y, v self.squeeze_activation = nn.ReLU(inplace=True)# X/ b3 w" r3 p0 t3 p
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
+ x; A+ U2 |. v) g) K! ~( T kernel_size=1) a8 B" f' J' M. C& z# ~1 F1 u
self.expand1x1_activation = nn.ReLU(inplace=True)
6 ^, i3 ]- M. L4 a self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
9 \8 f- n. D* z; U7 Z: Y3 x kernel_size=3, padding=1)) L! P1 a# b0 r2 U- Z& [2 \
self.expand3x3_activation = nn.ReLU(inplace=True)
2 k8 I% R. I/ Z4 [
+ M8 i1 ~/ o5 @ q C2 H/ \# @ def forward(self, x: torch.Tensor) -> torch.Tensor:( W' o, @/ v7 |1 h' i
x = self.squeeze_activation(self.squeeze(x))
1 ^3 D. h+ h% v$ z, ?+ _ return torch.cat([
4 T/ K* M5 G4 s% `( x/ K, X self.expand1x1_activation(self.expand1x1(x)),; v- l5 |" }/ H
self.expand3x3_activation(self.expand3x3(x))( T: P* c8 w5 O Y, a0 j
], 1)7 A+ g R f: s$ E. @, T
/ u2 H# Y3 t1 I4 @
1% P( q& g4 I }1 ^1 [+ d( ?
2
: `% n+ s2 J1 r3 W3
1 j, n4 ?' w c% g4! o6 u0 b3 ^7 [$ I( g
5$ |" V5 X3 N( \3 W! X3 f1 _
6: `) M$ U3 _' ^, e1 e2 `
7
4 q: b$ F3 ?4 W1 ~% g$ h' k, S8# n0 l6 o) X7 M1 M, [0 ^, I9 b
9' ? o" O7 f3 [% ^; d, ~0 R
10 H& O7 N0 O3 T
11
4 j; J" S. J9 l0 K g) R* T123 }- k2 i- E% C
13
6 E# |9 k! O% b1 ]14
7 y% C% d7 t% j+ P9 L |& o15( N9 `! t; j( |% w/ n9 X" P* `4 f
16
9 g# A/ T3 i# _% D' V0 u4 Y, o17
3 j y, J( r+ S$ i7 ^& t0 ^0 N18
: n9 B0 P- e* h; A0 Z M" s3 }8 p19( p1 Q% r2 V% `) p% m9 m5 @0 E
20
5 e' p. }9 C6 R1 [212 C- b/ [0 C8 U. d+ f% q% y
22
O- d$ e6 C. K0 D6 B9 o/ n23
# E5 m4 o. r G24
! ]4 f6 i% L7 }& D3 X250 o$ g/ m6 v" w& V, q2 T2 x
26
- [8 O7 Z. A J7 `! R3 N vSqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。" J" \ o. L8 J, ]
! g7 j* ?7 K$ O4 I; E) ASqueezeNet1_0的网络结构如下:# y+ a( E; r+ D
" L) s. [# d( V% P2 q
self.features = nn.Sequential(
$ }* ~, D, c# k nn.Conv2d(3, 96, kernel_size=7, stride=2),
5 U, G; a2 Z7 e nn.ReLU(inplace=True),
/ B, k8 |. e [# ~1 e nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
. J' I& f5 D% s8 d; w Fire(96, 16, 64, 64),
6 R& v. W S/ o$ E, U$ J Fire(128, 16, 64, 64),+ e# O' n2 e6 \8 x; V
Fire(128, 32, 128, 128),
$ O8 G: Q. e s nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),) R0 C2 p8 }% O: v; J- t
Fire(256, 32, 128, 128),
$ i) A% L: |0 _" g Fire(256, 48, 192, 192),
0 r2 ^; `9 v* [. `" y Fire(384, 48, 192, 192),. S/ m$ s2 L4 |; R- c! A
Fire(384, 64, 256, 256),
2 I3 k( T/ `5 z! r* M nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
, r+ Z) z& X5 ] Fire(512, 64, 256, 256),( F1 q0 W! s6 t& u
). G3 {* G8 \& P/ Y
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)3 \+ P* y% n8 Q3 |. g
self.classifier = nn.Sequential(8 t. n4 @, H& Y
nn.Dropout(p=0.5),
: f0 P0 _+ T( f final_conv,
& M( a* a6 f: [ nn.ReLU(inplace=True),
: r# x. r5 e5 }6 T nn.AdaptiveAvgPool2d((1, 1))
0 ?4 |+ N& |4 p2 ?)
4 T5 J" W. |% F$ ^( l& [& Z8 `5 K; b1 z5 n3 U; U8 [9 v" y
/ b! d* l" h2 s6 X3 S, b- m
1% ]7 S8 i( |+ x6 y2 j
2 e( |) h- {1 x( ]4 \
3
9 r1 e1 r6 D9 ^: _6 `: F' R4
B1 K( |; x+ U, C59 v, B, o/ v0 Y2 Z
65 e" e! }% ^4 A& D% [
7
* z$ l6 {" N- c+ w- }7 V8- \; S) f: n* S" L, k; r
9: s9 ^9 C7 F+ {: `" Z8 Z4 X
10
( l; B5 e, w) B- T( @* J& k2 N11
I( ]2 l% c& C- N# u6 q e+ R4 w12
' [5 U4 N1 s4 L/ Z* A13* ~; J3 r2 }* t% w1 ^: j4 W
14
, \( e# k8 X, t! D8 `0 h+ I15# S5 f( _/ W+ e$ C, H
16
4 E* C# y- u i# e178 I4 p9 [5 |% b6 G: [
18 O4 g- p6 t& c! a: W" d" T
19, j$ A8 J& A. m; L
20# h; E2 T& A6 j5 d
21
2 S! K1 ]8 a1 A7 w: N22
+ f. a' B5 r% r3 v, e( N/ ]23
# v9 q3 }$ d! B" j& L; }: ZSqueezeNet1_1的网络结构如下:" Q. v: R! {. G/ `4 |. i
2 ]- G- o% P: b5 p# H( u$ I; u. ?
self.features = nn.Sequential(* ~* X6 L3 s$ L F* m
nn.Conv2d(3, 64, kernel_size=3, stride=2),8 V+ X( V1 s7 f( P+ ]
nn.ReLU(inplace=True),8 S& @* ^* i6 Z7 _, i
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
( P, D7 g$ ~2 \( M/ a$ x! f# V9 x) _ Fire(64, 16, 64, 64),
& O% v2 J: q T! W1 A# } Fire(128, 16, 64, 64),
' w- S1 N$ V$ O2 e& R7 U( V nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
7 A0 b, k$ @0 `) Q* R; ~, ~ Fire(128, 32, 128, 128),
# x9 g3 H4 L1 _- ~$ ^) p2 g Fire(256, 32, 128, 128),2 L. M, |7 M: @9 m& F* P* Y
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
% X, L7 Q- B4 G5 z' B, E Fire(256, 48, 192, 192),
$ B8 C8 f3 [5 n& k! E% O. i Fire(384, 48, 192, 192),
7 _/ _" l7 a6 v- g M Fire(384, 64, 256, 256),6 R a+ ~# U+ X5 S
Fire(512, 64, 256, 256),
! \) w% z' ]( ]+ P)
8 ~2 ?) V0 z, I& s! a5 gfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)1 e0 w: x$ R9 m! q5 _6 B
self.classifier = nn.Sequential(
; a- k" @! A1 |, z( N nn.Dropout(p=0.5),& s% J: |: q3 y. a* V# W
final_conv,
8 z0 ]% A. u! r& Y nn.ReLU(inplace=True),1 N! j# H1 M8 o$ b8 r l5 j
nn.AdaptiveAvgPool2d((1, 1))
7 b, R1 p5 J1 W+ e$ a& Q) d+ a/ n)4 ? D, |2 |+ U3 L* O* V
0 e' o4 K; O8 o2 p1' G: Q1 R" f0 r3 e' r& e e
2
4 v3 X1 A* Q( O7 d! @$ z- Q3
' h* n0 F# ?) _$ O3 a4& m6 u" J% z* q P% u
5
2 _) v6 C% Q2 `* O5 `6
' z* b! p! @ G: D" J. ]; ?. ^75 _* m& J9 L( l; e* H9 k
8
1 p9 \" m2 f& V1 C# q8 R) m I9
- \& [6 d! q J4 I( b/ n107 X: ^* T0 V9 H; Z4 W( f
11- f5 O/ u4 I6 v2 f W
12
# T$ n: L7 G' b. k- w1 o13
/ c5 Y! Q6 s2 ^) S14
* w z- k: {; w153 @2 `! R& M L* O2 i
168 r) @% ^5 V; |6 N1 O
17
8 X+ F* m7 c) r1 l1 ^18
( s: {4 R1 N1 A19
" R3 E/ z- b( y; n20
9 w/ c: N3 R2 z- G21
* z" O g5 F3 b# A. b3 l/ ~22( d8 ~- K5 R* z2 Y% Y) {2 b7 `
SqueezeNet各层详细参数量及其输入输出如下表所示。
; T% u# o7 o8 `
3 x' [8 l t, ?
# U# t# U( `8 R4 _# n# ^( x4.2.6 其他实现细节/ e- J; q2 |& @% {/ Z
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding+ ?9 E# h+ i# ]1 d5 s2 K, a$ f
squeeze和expand层中使用ReLU
1 d# v5 j/ w/ ~% h" b在fire9之后的layer中使用ratio为50%的Dropout
9 s: g# `+ t( q G+ P" m+ }参考NiN算法想法,SqueezeNet中不含全连接层
1 j- Q r4 c+ E6 \7 J3 |6 p" k训练时,前期学习率设置为0.04,然后线性减少
3 H6 M n7 Y8 n% ?( H- l4.2.7 总结
- Z( e# s# f; M; \& Q本文最主要就是三点:
8 F1 v) d: V, r) n y6 X
' x2 N8 g$ @3 n1 j% Y3 z用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
: k" o* p u0 H$ K减少输入到3×3卷积的特征图的通道数,减少参数量6 K3 A7 A& F0 ^ Y
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率7 w/ ~; x- n5 T" H. i: h& I6 [+ x
————————————————
! u1 b" C( `( p4 g3 s. t8 t版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 w) e3 i- X O5 m/ k) u8 L原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
7 |# X! w* `: y: F' _; F( T8 j2 z/ {
! N. W9 j8 r# }" E4 R/ z$ q
|
zan
|