- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565635 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174913
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
; E2 D' |/ {- ~9 y轻量级神经网络算法-SqueezeNet1 T4 G& ~0 K' H
4. 轻量级神经网络算法目录 d, X, H& z- |" y- K* e0 c. t
轻量级神经网络算法
/ i! ~4 S; z G6 e7 B4.1 各轻量级神经网络算法总结对比3 ^% l" g: [/ ]
4.2 SqueezeNet
* P- L: u1 r ]( G4.3 DenseNet! I5 Q! b G. A. S# B4 y/ ?2 h0 O
4.4 Xception
) K. m5 `) c5 j* W9 Q4.5 MobileNet v12 o+ |" m9 k2 k" y' l: W# F
4.6 IGCV
3 K- J( K* r& K; ^( x" |) L4 F4.7 NASNet+ w0 I2 C: G! Y m' w$ T8 K
4.8 CondenseNet
3 x6 \- Q. S( R7 s& [: D4.9 PNASNet7 m! L4 Y: `/ o7 J8 C3 G
4.10 SENet
" \# \1 M f( q4.11 ShuffleNet v1
! {+ M% [: l8 y7 c4.12 MobileNet v2
; j6 s0 ]+ u" o% m- }4.13 AmoebaNet
- S9 Z. G+ E) L1 |) o4.14 IGCV2
2 U) Q' R9 z+ M' |. I4.15 IGCV3
0 {' L, m& f6 U) V4.16 ShuffleNet v2) V, G& j [. n- N( _" D- C
4.17 MnasNet6 N$ o6 a' @# d7 y8 @
4.18 MobileNet v37 T# y p2 I, c/ G1 q
深度学习知识点总结; R( @: o7 g, {5 l# ~ ^5 W
1 o% C4 @' L1 c专栏链接:
4 v) P0 S- w; A$ M3 J! i2 ~' nhttps://blog.csdn.net/qq_39707285/article/details/124005405
" P) X# v h8 t0 m* g8 V2 \9 f本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
' n* i$ c; Z, [2 }9 b- l3 d- t! d
# y+ v" K3 ?" P4 a7 D8 Z% P本章目录; D# Z1 Z, i7 t2 |8 J1 o
4. 轻量级神经网络算法目录8 L$ p5 V- k/ K0 F! m X, _
4.2 SqueezeNet* D' m; u; a2 U
4.2.1 问题分析9 _5 M" J# v8 v4 V: v
4.2.2 SqueezeNet的三大策略
& G: N5 o0 }/ D: V+ x* m6 \1 P# Y4.2.3 Fire模块% X7 ^2 n5 a4 A0 [- K
4.2.4 SqueezeNet整理结构 W' u7 k# Y; b I7 h2 E) u
4.2.5 代码实现SqueezeNet; k! Z6 p3 B! d% r0 P
4.2.6 其他实现细节9 Q9 O9 c! E* i
4.2.7 总结! ~! t3 C% Q3 s% ^8 x `$ e
4.2 SqueezeNet
, ?+ ?4 n3 l6 i. p4.2.1 问题分析: s* Y2 `; b, _: [- l" F- i I, o/ g
最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
+ J5 ?/ L$ O5 t' f& u! h4 D
2 N2 E& U3 q+ D2 t8 l, O [* ]在分布式训练期间,较小的CNN需要较少的跨服务器通信
6 ^$ H+ U6 Y2 I6 N9 {0 n在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
# g' I3 k2 J, s9 Y5 _2 Q8 S较小的CNN更适合部署在FPGA和其他内存有限的硬件上# F: B* Q% @$ A9 h" c" ] f
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
" R) S# o" `% r9 Q! Z A3 m& R
. D7 I) m, ]% n y* f4 _, o4.2.2 SqueezeNet的三大策略
3 B t3 I- w. R( e, m策略1:用1x1卷积代替3x3卷积
. q L; Y2 k a/ l) |1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。# v" I9 {0 A, V+ J
' S$ x- u$ }, Y策略2:减少输入到3*3卷积核的通道数量5 g9 _. q+ j8 v& m
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。3 u* U ^) `) w5 ?7 M
7 `, n5 M6 V6 d! Z+ r策略3:在网络后期再进行下采样,使卷积层具有较大的激活图3 U6 E2 u& a1 N/ B, L, Y6 b
这里的激活图(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中。8 y* T. t7 w. N+ n
: ~& E& F% F+ G& w/ H, }策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。, U" p+ m" @! H; C) i
. r" Y. c& T9 A/ G2 P6 ~4.2.3 Fire模块* E- i" D) w7 H% ]" g
为实现这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的想法。% ~6 P4 O! E6 Q% u8 |8 ~: B
, b+ h ~$ B k; q' P$ p6 {2 `1 g3 A( q1 o X
4.2.4 SqueezeNet整理结构8 `7 L3 a; \- k: F' y( e
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。; j- @0 g8 m# ] B6 c: B( O
0 R( l- x9 x% x
' W' K h) v0 _3 F+ @
4.2.5 代码实现SqueezeNet1 L! a- V' l x0 K" g$ }: t2 u; l
Fire模块的代码如下:1 a) {; {9 Z( Q( q. l4 r
. l* m- [5 i6 [: r& Pclass Fire(nn.Module):
/ q# Q7 A, C: \( ~3 r: n
: `0 d% _) e- R/ @& c( i0 @: E def __init__($ u" b' U8 @, k" S
self,
( Z c4 h. R7 S! w5 t/ y& u( K inplanes: int,
/ p8 d8 r) y# C$ u: A squeeze_planes: int,9 G- g+ h/ v B" _7 L7 {& Q
expand1x1_planes: int,
2 W( G( \1 L5 M! p5 |; G' H/ F/ v expand3x3_planes: int6 a, A& r E) e" F* D" h. n
) -> None:' ]. J/ ~0 U; \) S+ W
super(Fire, self).__init__()
3 E! q9 r& B; h; j, c) ~1 \* O self.inplanes = inplanes
- a* ?8 _- v. M4 @; R: b self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)0 y, L3 l. l0 D1 K
self.squeeze_activation = nn.ReLU(inplace=True)! U0 q* ^4 c3 `8 x
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,# c9 ?7 h4 e! j& J: l$ X
kernel_size=1)( F% W8 ]8 W7 J/ j5 z
self.expand1x1_activation = nn.ReLU(inplace=True)
' U8 A6 f8 E' @ O, z self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
4 t9 }: [5 [8 v7 S9 |) x6 N kernel_size=3, padding=1)
' B! s# i; B+ }& ` self.expand3x3_activation = nn.ReLU(inplace=True)
8 J6 Z+ U: P! J. S$ a# M! s$ t: p6 n e% X
def forward(self, x: torch.Tensor) -> torch.Tensor:" X& c* I5 {1 P C
x = self.squeeze_activation(self.squeeze(x))
7 a$ n% F4 j: \: @7 q/ t9 j6 H return torch.cat([9 Z0 Q, |) s. u# v: d
self.expand1x1_activation(self.expand1x1(x)),, } h8 L" G7 {/ G6 B) j2 K- @
self.expand3x3_activation(self.expand3x3(x)): h5 c7 s) `& o' k
], 1)
" }! H' m0 i& O/ R
& w' ?5 x- U! w% b, H% ^1
7 Y$ ~; w3 F8 e, j! L24 P- Y) G' b S7 H3 V9 f
3
' x/ a) P: J3 d# [; G5 a3 ?% S( T4
; M1 [& t, ?3 C$ N- S# p5! c- h j+ t" c- I0 {) F7 W2 B
6
7 ^0 d7 F. |" P9 M7
O! T/ w/ f g. q84 a8 N+ e: }0 i* M! U+ [
9
: W& U4 c( Y$ p& {1 T- t4 f# `10) E/ M" A) ~( f' H/ E/ J2 ^5 Z
11+ d9 ~: n/ [( o2 c
12
$ ] M$ Y( V3 t& e13
& }- v, O/ ^. s r14
; N# M, ]' t2 g% p$ e; t15
8 m) k* p# {% y7 _+ b) y; A16
& V9 W9 l: s7 c6 h3 @179 t* U1 g$ ?0 E" I& n' v
18
7 {& @, N7 e3 Q4 M0 F19& d1 u1 i3 u1 t i7 H4 S( @$ n* A
207 g7 O/ Z" y% C+ t
21/ ~6 }' _0 k* b5 v
22( { C- k m" v" F+ H2 y% ^
23
* W' j/ o- g f# d24( [% p3 X9 ]: ~% O4 I
250 Y6 @2 S9 r3 _' x% Y0 n* _" h
26+ S3 u+ u& J6 @0 _# X: \4 ]
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。 n- P0 i1 n0 P
) t" e8 K1 ?/ A$ A! a" S( f) KSqueezeNet1_0的网络结构如下:
% s2 ?* `( e" u# x6 C7 `2 r# h' z6 s
$ X5 ~/ |8 j% k/ Vself.features = nn.Sequential(6 ?' C- J1 i) B$ C& L
nn.Conv2d(3, 96, kernel_size=7, stride=2),
& l4 z# }3 D( [' `" ~( ]1 [ nn.ReLU(inplace=True)," Y5 H5 e) w+ \9 J7 ]/ l
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
" s+ P) C# w- z/ C1 V- M6 x/ ? Fire(96, 16, 64, 64),( z! o/ u, _5 z0 t9 Z
Fire(128, 16, 64, 64),9 \! v) y; [: p6 R8 j
Fire(128, 32, 128, 128),& x# I2 R9 l7 }2 {8 ^; ?
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),8 n- r6 G4 A- f
Fire(256, 32, 128, 128),4 r2 s1 y- Q8 _0 M1 b# _
Fire(256, 48, 192, 192),
6 L' E Y6 R Q) z4 R% W Fire(384, 48, 192, 192),
9 `. y6 y/ e% ^4 `( a: v Fire(384, 64, 256, 256),
: f! P$ Y" M$ [- Y: | nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
# `# T+ T& j5 }5 _ Fire(512, 64, 256, 256),3 _8 S6 A4 v7 m* K! N& q% f7 V
) G& ^' ]$ C& Q3 c8 q- j
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1) A/ J0 H8 v0 } j' @
self.classifier = nn.Sequential(6 R4 f4 f7 M2 v
nn.Dropout(p=0.5),
7 y, I; D7 Y( M5 Q+ I0 \" P final_conv,
2 [4 i6 E w% d& {8 n' v nn.ReLU(inplace=True),
% g0 t# X) P' \6 W nn.AdaptiveAvgPool2d((1, 1))
% l4 z: ^! A$ A2 ?)
$ T2 m; H+ q# k; d1 o% O. y* |/ R/ a/ t$ R
5 o, T; D! O2 `; a/ v1
) r* V$ K5 N/ b5 Y2
b0 w1 m0 S, R6 f8 d32 `( `0 J. {. ~ q. a
4/ g7 u4 O4 d% S$ E3 r. J5 s
5
; W; h( u0 G6 m! v5 E67 T7 V; Q7 y7 c/ B4 d% `/ _
7
% l9 T5 t' Z" Y1 ?8
! r& Y$ T6 g3 T" W9
" R: D1 ~; f5 l' p10
" O# J$ m" f# A! x: a. [11- d' n4 F. k9 ~& v+ L. t6 x2 j
12
6 T! {4 Y7 u8 p$ W4 b$ W- x4 y13
' S' p8 J a$ x14
4 `8 a7 U# S! S' P( G# f15 m `# S1 @0 Y. F3 H( w1 u
166 i; W n4 x4 t; I" }$ t
17' d; Z7 y7 w' _4 o* p8 G( R2 \, V
18
2 ^; u/ o3 f9 E( [1 w. ^19! N* l* V0 J% p q
20# y2 z) m, Y& x3 p1 ]' _
21
* \8 b- n, j( i, A22
E$ K, ^9 j; e. g5 D" C239 x/ Q* o* Q3 d
SqueezeNet1_1的网络结构如下:
" s; D8 Y/ M7 C5 U
; a0 ?4 z& W; B2 Rself.features = nn.Sequential(
1 o# e9 f, t. L2 e/ N( u" o nn.Conv2d(3, 64, kernel_size=3, stride=2),
6 X- J: }, M( s' Y: X# @ nn.ReLU(inplace=True),! u! A1 ~- r. |
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True)," ^# P0 n! N; c1 v- ]9 z. ]: v
Fire(64, 16, 64, 64),
6 m- r+ W% v7 ? x* V! D& I' g% g y6 o Fire(128, 16, 64, 64),
2 q% a) J* O- t nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
" W% v7 f) K# L+ `9 k/ N; q7 P Fire(128, 32, 128, 128),( }4 Q( t- ~! f- o) m M) U% }
Fire(256, 32, 128, 128),
% s8 a0 I T/ ?* g; m+ v- I! p/ y nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),1 a( z0 n' s( r4 t
Fire(256, 48, 192, 192),
0 v& `# {! ^% B2 n/ V# p. S Fire(384, 48, 192, 192),+ b$ Y1 M8 V- j2 a( G: u1 [
Fire(384, 64, 256, 256),0 i9 h4 l% E) ]# B. z8 f; B
Fire(512, 64, 256, 256),
$ M) f2 Q: ?; E$ [: L/ E)4 H6 w8 B; D% X( w
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)- N7 h. H. |5 a( t. M( L7 {% b
self.classifier = nn.Sequential(
% s; N/ j7 G9 h0 `+ A8 j nn.Dropout(p=0.5),6 }7 e1 Y8 c2 b' i5 _6 r' i
final_conv,' ]$ w/ n: c; x L: M: h8 S# Q
nn.ReLU(inplace=True),2 r, ^) |# h6 {3 m6 ]
nn.AdaptiveAvgPool2d((1, 1))$ F; c1 n4 |0 l, D+ ?" j+ t: X
)
' {# j, u( }4 {0 I& q; H3 w8 a9 Q" a: ~
10 b0 w4 Q) Q; y6 ^5 B$ o$ I$ w7 p
2# e; Z( f; W1 _* G* n: S0 ~
3
* s% d/ X: [5 D1 w9 v! _& b }4
' x4 P% f8 |( P+ U3 u7 X: t% ]: f5 f58 g" d. |( v/ y7 k1 S' {; G
6
2 O3 M2 u8 y9 G4 k7
& C& H* ^8 x5 h8
; y E/ |, P, U( }- l) y. m9" N8 L5 m/ J* y& O1 k" y" p% q+ e
10
7 R5 ~' q$ d1 D1 s" P$ `, s" G11; k3 v9 `7 Y4 d" F# b
12
& f) m0 d+ b: d0 r/ l+ J13
: G ]* {- d' F A- r( K$ ?, K14
7 O3 q2 Q/ t$ ]; R- U; L8 A15
; o3 P8 s/ E. }, V16
# g1 q6 g; z, ^: ^' ~/ C17( L. a+ g: X t' P$ f0 D
186 N, F, [- o9 N- d* G6 A9 ~
19
! Q2 ~" F/ E3 r7 M Z8 J20
, K3 u' c4 y7 M6 e0 v214 v! v2 u/ f5 v! H
22+ W W* F4 Z8 Z3 x/ M3 D
SqueezeNet各层详细参数量及其输入输出如下表所示。
* r9 Z0 c4 w, k5 }3 f
- D. g5 K& \7 I7 s! {' d+ b2 \( n6 {( U8 V7 ~! M
4.2.6 其他实现细节
3 o* {" _. A2 ]+ E1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
+ m/ N! e: ^; u" jsqueeze和expand层中使用ReLU9 ?+ W+ i3 D! A% W& C l2 j/ f1 E
在fire9之后的layer中使用ratio为50%的Dropout* h, l+ |# N* Z
参考NiN算法想法,SqueezeNet中不含全连接层
P, t( j- K% r- o, C! x训练时,前期学习率设置为0.04,然后线性减少* V5 ]4 {1 W/ ]
4.2.7 总结
: W5 p) ]5 z5 k+ |# B( h# G本文最主要就是三点:
& ~5 M% A- H) L# E5 [ n( h2 b) K/ |6 l
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果" b! Y' s% |3 n6 G+ e, ]
减少输入到3×3卷积的特征图的通道数,减少参数量7 i; P: `! g8 V( W! n; ]+ ~
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率3 d5 O- S( i$ l- Q" ~% m
————————————————
: b7 J* `1 }8 H版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
; n1 f* o, g& i" z, ~. E原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
: z# A! ?/ m5 r$ t; x* T3 W; h: `; H# h% y/ z! h3 R/ [
& c5 T7 a3 Z* w% L* v2 A+ Z+ x0 a |
zan
|