- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569615 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176107
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
7 F ]- E3 S% E7 { D1 p4 z d
轻量级神经网络算法-SqueezeNet
0 u. t! [; n9 |4. 轻量级神经网络算法目录
" E- ~- J; y& |" {# N* `" d/ I, t轻量级神经网络算法
, P S# R% P; N* U+ b3 }4.1 各轻量级神经网络算法总结对比2 t6 g1 \4 B, _& D9 t
4.2 SqueezeNet: k* L. U( P c3 r8 h
4.3 DenseNet# K8 Z" I! [/ Z3 ~4 z
4.4 Xception
8 C3 [6 `8 J: P( X4.5 MobileNet v1
% q4 ]- I2 f; T2 F1 @7 z. O4.6 IGCV
8 v* }# H( X+ f4.7 NASNet. b# `8 Z. r, E$ T
4.8 CondenseNet: V5 b* Q' j0 z' P% V4 o
4.9 PNASNet
( ~2 D/ C" H* E, G+ D3 H! y& @' V M: \4.10 SENet7 o; s' J" u- Q% ~
4.11 ShuffleNet v1
& _0 R- Y" q1 b4.12 MobileNet v24 F) Z. `7 m4 K" Z. Q0 m4 t
4.13 AmoebaNet
8 |3 Q0 A# [% z' s: K V) i* {4.14 IGCV20 K' e& o, p. c! o
4.15 IGCV3
, V0 x( u8 v8 b& {, n0 G& b @: w) m# e4.16 ShuffleNet v2
8 t e% Y A: u7 n2 h4.17 MnasNet) Q: }1 o+ z9 A1 M( q
4.18 MobileNet v3! L" s- p' z$ y Z2 Y6 }3 ?
深度学习知识点总结, T. L0 Q8 t3 {
- o+ _& P2 | ?0 W专栏链接:
$ D7 c7 c3 j) M" Z6 G ^https://blog.csdn.net/qq_39707285/article/details/124005405 L2 _9 |- J. \' @" c5 p m# F
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
9 [, v" v, Y# E" g( W; O$ l0 o' L
& k: Y, s0 \0 K6 z" U本章目录
. r! Y8 P5 h+ _) U. D4. 轻量级神经网络算法目录
! a5 R5 Z6 ]; O% V4.2 SqueezeNet, w: ]/ \! l" Y% Y) @6 a
4.2.1 问题分析
" d4 S0 U7 A" |0 I& c4.2.2 SqueezeNet的三大策略- a) g3 k' @& m, l8 Z
4.2.3 Fire模块
/ z5 O. {* g+ ^" ]4.2.4 SqueezeNet整理结构1 J: ^ y8 i2 B, M+ {
4.2.5 代码实现SqueezeNet
2 L; U. x, W/ h @- W! \) O4.2.6 其他实现细节
5 E# I2 x( t, D. n4.2.7 总结
* n% ^. V" a9 G. x4.2 SqueezeNet
5 b" m- C' A' J8 J4.2.1 问题分析, ]# ?- W% q+ O/ c9 z
最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:: |' ~! ~# o; j, E2 B
4 s5 `" t: W- C: j1 c4 K6 p
在分布式训练期间,较小的CNN需要较少的跨服务器通信) Y/ v$ t4 l& j9 s" c p
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入# S% w+ d& v" S: e
较小的CNN更适合部署在FPGA和其他内存有限的硬件上) e' X8 K3 U- U/ C$ W3 m2 F4 }
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
) ~, E0 x; m8 y; r6 z7 _+ Z! a# I' {9 n% T6 Z! p$ O
4.2.2 SqueezeNet的三大策略: e1 ~( N8 j: S8 V6 V
策略1:用1x1卷积代替3x3卷积: C7 P( p2 { J8 W8 G: h" }/ ?( d
1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。4 \0 K/ x" _6 M5 X/ L# e
9 {" |; Q |3 g. ?. E- A
策略2:减少输入到3*3卷积核的通道数量! M. J) u* n |* V% d6 E6 }2 J
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
% ^6 C" ?. r$ M4 \% g h" y. p* X4 ~+ G% v% `3 N. ^, [
策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
; n4 `$ w, f; |8 j: v这里的激活图(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中。
( D9 _% e- n& x2 d5 [) \& y' E+ q8 Z
" K. X9 l. p, Q, V! Z, G5 W策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
' M2 W$ ], i: b! Z0 _$ x% u; ^8 T5 t. V7 N4 Q6 }
4.2.3 Fire模块
, U5 Y$ f' H! ~为实现这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的想法。
+ e) F; ^6 C: J% t8 D4 }2 @ {) h$ i# t! z( C& r. ?
$ ^+ M. ~0 N* h( d2 v5 `: c+ O% W4.2.4 SqueezeNet整理结构* [8 P* B W2 {- X5 n9 ^6 O3 N
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。9 {. X0 q1 I4 _0 ]4 G" `2 w- W
! }! r* Q5 R+ M q+ j0 c3 n
) b' ~& l1 W- v4 H+ m
4.2.5 代码实现SqueezeNet1 R' H* H+ ^. S" [9 j! B" u
Fire模块的代码如下:
7 J9 o0 U" r0 B6 }! L+ M. \, B1 b# D! n) }. N7 N- P# M
class Fire(nn.Module):
9 p* A! _" F4 l' c% x; ?
3 v4 Z( |' i+ c* _0 i def __init__(
z# u# |; N: ^$ Q# y: {' ~( u self,9 d/ G- j8 r% \# q
inplanes: int,) X- l1 u: ]5 H5 Y/ ^
squeeze_planes: int,
; M S8 [0 _& R S+ u. M expand1x1_planes: int," `5 |# J5 l* A$ j2 m/ T
expand3x3_planes: int8 |- ]5 s" A) }$ v& j6 d g
) -> None:5 R* V2 a6 }, Q1 H$ O
super(Fire, self).__init__()
7 `3 T9 k- [! B$ J* E* m1 Y self.inplanes = inplanes( U5 m3 M% I1 h) F+ G( Q6 |$ J8 G
self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
# Z& Z( p' Q) ]# M self.squeeze_activation = nn.ReLU(inplace=True) R1 a3 v+ [: `# ^; e1 U" W1 }
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
) X. h1 j* Z( J4 M kernel_size=1): K8 m' L! V- P8 A/ D) ^ U \# }
self.expand1x1_activation = nn.ReLU(inplace=True)
; d E( r; D2 J: h self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
3 e6 h# `/ |2 H; w* v- U H3 f kernel_size=3, padding=1)8 S& ^% w1 w2 t; ]; I) X* S3 w
self.expand3x3_activation = nn.ReLU(inplace=True)
) X# a; l& K5 O: v! T# r; {2 s9 Z; G8 z) U! _8 L% ~2 u i0 t
def forward(self, x: torch.Tensor) -> torch.Tensor:+ x4 D. l" Y6 c3 B3 g
x = self.squeeze_activation(self.squeeze(x))
! i- f2 I X7 ^ return torch.cat([
* o' S1 x2 W+ f9 p3 _, K self.expand1x1_activation(self.expand1x1(x)),
" l: C0 b) E( F) S7 S. k @; e self.expand3x3_activation(self.expand3x3(x))
/ o3 K1 n. z6 C6 k3 l/ t5 h ], 1)
1 f. l# r i5 i/ H E! I% ]9 _% ]* j& M- B0 J4 E1 R
1' u6 [( T) w: E0 P
2
. _' I) F) Y$ \1 ]- W3
_5 m6 T: E8 x& p. m% r' |4% x0 ^/ Z. w& N+ r% h/ t0 n
5
4 z# P. X8 y7 M6
" Z6 }! W- R0 A& m" ]4 }+ L* g7: U# ?. L1 |: o4 Z
8
2 \0 E6 T( g: Q1 P) f' o( w9
% d6 @5 |' O, \9 [ W3 q10
" |: r/ O5 o' W2 q) x119 x3 `% ]" j( P# U& k
123 o% S k+ B2 c/ ^
13
9 J1 A b( p% V; g0 O9 @4 d& l& ?( w14
- P. y- j( ]: n5 M! p( v15
* X8 N: J$ A3 B5 a) c3 [3 L6 x16
) ~$ b- ^1 _5 p; a( |17
: m# A$ F- T: f7 [$ Z0 H- S9 M18
. M0 N' w9 w; A, `5 z& C5 L196 R! O$ g2 u, N% l+ j- K7 `
20& G- N! ]0 \: B
21
+ B9 o% b; G- ^) Y/ ]* @7 Z/ d22
3 o% X+ z& j$ Q7 O* U( y Y9 A3 V, n232 i/ o7 D5 L$ H" t a4 l! \
24' k, s' W6 s7 }/ W |0 r
25& K" R" }. y( f" ~$ P2 L6 u7 {
26 N' Z( i& g$ L2 V
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
9 r' u% f% t. ~. c! \" y
! J2 A! l% b4 x P9 B: @) \SqueezeNet1_0的网络结构如下:% O0 J- F; I, n
& W/ B" }2 Q3 o5 |$ F
self.features = nn.Sequential(
# a7 m# H7 G" p- m2 j" R4 _2 g6 U nn.Conv2d(3, 96, kernel_size=7, stride=2),
4 y1 Q1 i) z" y6 N' T3 r9 _ nn.ReLU(inplace=True),0 _' c) z1 n! z- J: P9 V
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),2 @# q! h0 r: _6 S- I1 e
Fire(96, 16, 64, 64),
( k- [( `* x3 x( T) Z8 P1 ^7 _ Fire(128, 16, 64, 64),8 ~, T& O+ ~; V, d2 ~1 x
Fire(128, 32, 128, 128),
- R6 v* k3 c7 Q' f; B" u! F$ S nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),! z( G' }' K. V ]3 z% K
Fire(256, 32, 128, 128),
% V# r3 d9 k( \ Fire(256, 48, 192, 192),
! N/ l' g( N' Y2 U! L9 W* P Fire(384, 48, 192, 192),
8 G/ Y/ q+ J2 x) V+ [- K# ^, S Fire(384, 64, 256, 256),
: ~! {6 e/ s7 Y6 J% T nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
! D+ v7 _* s: s- m$ Q" h Fire(512, 64, 256, 256),, X# ^0 J! j4 @
)
% r" p* x( f/ d9 cfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)- l- o, {$ `9 W' O+ o; n5 @
self.classifier = nn.Sequential( N# R. x# L$ e7 G g A/ i# ]
nn.Dropout(p=0.5),+ t+ X/ b5 o t2 S5 t2 l
final_conv,
# [" T p6 q/ Y: R9 M1 p nn.ReLU(inplace=True),' u0 h6 f# n4 L8 A$ ]
nn.AdaptiveAvgPool2d((1, 1))
0 v; v9 T( A! b5 v, \)
t- b0 n( ]7 j( Q4 q$ Y1 P6 j9 o, N" F- [' V; [
a- L2 P- O! @) Y5 T* W% \
1
4 i+ F9 y' `7 P, X5 x* S2
. v9 ]' m5 Y7 f6 B1 I8 I0 `7 ]: y3
' _) B% V( m z. Y% j4* Y$ l" y" P. r% f. L [
5
: f' K/ }# i# f0 n6
# S! L: w r8 i( {7
0 t7 k$ l8 G+ x" \1 g3 s0 T7 K. ~8* N, ^/ y" r! \6 L# O9 P5 O' @! E
9
3 x' I- r( G; f' j: o, D10
Q/ Y: |. t: Y$ O11
( P% R. @0 _" G. v( D8 p4 u3 E12$ s. J! u2 ] `( s0 l" H
13
% e5 l: X2 n' y1 @' s2 F14
' i6 Q1 Y. Z3 I/ N15$ f- e. d1 {; ~$ j7 H3 b/ Y
16- W9 W6 D4 m& f$ l$ u1 v7 U* F$ e9 P4 w
17
, z" o [) Q1 d$ v186 k& ?7 X- X: `; B! U: [) T
197 w$ s# ]6 m x
20
, ` k) g$ u: X; W! k5 E4 @! L+ k21
8 S, j+ _" _0 e, Q22
8 i8 G- b2 n7 f5 o7 l. W4 u. M' f235 T& T4 z' t' s' H2 w5 o, I
SqueezeNet1_1的网络结构如下:0 J! Q' V: T) Z( M' r" F: O
/ I4 T% ]. i i E0 C" O% g _( Nself.features = nn.Sequential(
/ h+ T# t3 A' K* V, d) E nn.Conv2d(3, 64, kernel_size=3, stride=2),7 D% W2 Z8 D+ i* M
nn.ReLU(inplace=True),8 R, }8 O# h4 j$ q
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
6 L) R* f8 ^3 e& y Fire(64, 16, 64, 64),
4 S% w: W: q$ \" l: c! z Fire(128, 16, 64, 64),
7 A7 l+ B3 w" w l, ]- A4 w nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),# }1 N$ l% [% |/ o
Fire(128, 32, 128, 128),8 m( j3 o' d6 E x5 W
Fire(256, 32, 128, 128),9 y' R U+ T h' y# `
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
1 M* k: l6 o: T& P& t. ^% m Fire(256, 48, 192, 192),5 v2 I5 q5 N- z+ X; M z
Fire(384, 48, 192, 192),( d2 M1 @6 l1 V7 s$ K
Fire(384, 64, 256, 256),5 x6 C0 o( E3 u( ]: e. Q% R* K
Fire(512, 64, 256, 256),
4 y! n N6 G/ P)% O/ C! v( n4 v ^. _3 H7 ~5 @
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
* U. {- U4 F" H* {) {; G% g! ?- bself.classifier = nn.Sequential(
8 r& G* n) u; I; I; c7 X; [ nn.Dropout(p=0.5),
- B/ ]- P, Q( M7 G. n- b final_conv,3 m2 J$ z, {" ], S
nn.ReLU(inplace=True),! Q7 H2 j9 _2 q" M
nn.AdaptiveAvgPool2d((1, 1))
8 _+ L( b+ l. K)& j% P; w$ f( I5 i7 p
& Z# n8 M8 R# k) `- `8 k1 d1
U6 [) z' G. s; X2 Q1 E! J: F+ f& N2 C7 [
3
$ A! k! v( B0 [+ K% h3 f45 s! _- W# ]" V1 ^1 ?
5
1 e' R, _0 S! \& D) D$ G, Q6; e; x) f5 ^3 F3 a! D4 o
7' I0 Q" M+ h9 y' {
84 Y0 A* P8 d6 V3 z+ D* s
95 b; D$ U9 ~4 M! G5 g' V9 W3 T2 e
10
[8 j {, {1 n' z6 {9 d" ^$ j11
9 K* N7 Y P9 _/ {; S126 _! F6 v5 m( \$ a$ g4 X$ z
13
* h$ A/ W+ H3 ?! b. [. Y9 t( D; H14
0 n* \& s& C. a0 _" ~155 Q, e' b K$ f! T5 l& i* D
16
6 W- G' K% K' e A) `+ p17
2 o7 F* B0 l# X( J0 i# q18
* N l# Y A" u19
: ?1 m- o. p) T4 V2 a7 c209 L1 q" n% |2 f, G# U7 M
21; [# ^- g w/ J
22
' ^3 U, }) m4 n G4 P/ S! b! I" BSqueezeNet各层详细参数量及其输入输出如下表所示。
& W2 Y) M5 p. R; s: _% o! x1 R: _% t; B2 [# k: E
S) X8 a/ k, u& \8 K0 E
4.2.6 其他实现细节
: W: |/ [; Y' j% s8 ?: O1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
; R/ c# Y$ ~9 i6 i& ]& w9 F/ Esqueeze和expand层中使用ReLU- L9 N& Q- w0 Y- A; A
在fire9之后的layer中使用ratio为50%的Dropout1 n7 Z& F. ` C3 _8 e4 N
参考NiN算法想法,SqueezeNet中不含全连接层! h& C. x8 l7 ?
训练时,前期学习率设置为0.04,然后线性减少
' Y4 c4 s" Q4 U" t4.2.7 总结5 _9 H* f3 C; Q8 a, B; O& N) E, E
本文最主要就是三点:2 [ f) l. Z8 X; @- P& C
, Q' M; f& o$ b7 I用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
& z* k+ }. B2 h9 Q' Y3 [0 b减少输入到3×3卷积的特征图的通道数,减少参数量9 x' G5 i+ h& M) R$ w
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率2 u0 u" F/ R* r! Z2 X$ Q2 _! Y
————————————————( H1 C+ |+ F H3 f% C
版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 K; t3 s5 ?3 g) a, W5 A9 a6 f6 i原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
3 |( M7 f; d% L A' `, \' O* N1 J
6 v! n5 o6 R M- @* e
|
zan
|