- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 557936 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172754
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
4 ~$ x4 N: A" `6 N1 U轻量级神经网络算法-SqueezeNet
+ |/ T5 f. }. Z7 Y L8 h4. 轻量级神经网络算法目录
$ k! r0 B2 \, u' ?: s4 e轻量级神经网络算法& z) P9 T4 ?$ d9 k- i
4.1 各轻量级神经网络算法总结对比- j7 G3 C \' ]5 T, _. b: H. h5 a
4.2 SqueezeNet0 A b. T4 S# b- J, _0 L1 S9 l, J) p
4.3 DenseNet* e' W/ `: j( D {
4.4 Xception( L( o# j! H; P) N4 Q% U
4.5 MobileNet v1- `6 \- O) f% h
4.6 IGCV
j, s- f( s p2 ^4.7 NASNet
" O z) ?% o/ d, i# w4.8 CondenseNet
& n+ h$ E5 L6 m5 W- P) o4.9 PNASNet
, W% o) m0 X! N( M/ M4.10 SENet
9 i2 t! W) Z# |; e5 g9 E4.11 ShuffleNet v10 W; f$ U: _4 u3 K0 B& s/ ?
4.12 MobileNet v2% b N# \+ ], u
4.13 AmoebaNet3 Y3 F, h* Z( U7 L5 k" M6 Q& k; z
4.14 IGCV2
5 L0 r0 J# A3 h9 Y- e4.15 IGCV3
& |3 v: k6 f2 ]. t4 W4.16 ShuffleNet v2
+ F8 f$ p" ?- P+ j( D C! y4.17 MnasNet$ t, K, q2 B! e$ F8 G
4.18 MobileNet v3, ~* o3 V; @, c( `
深度学习知识点总结; \4 z, f' V9 K, G5 E ]3 \# g
$ f: Z X7 ]2 d8 O/ Z: B( n专栏链接:) K% t2 F K/ A
https://blog.csdn.net/qq_39707285/article/details/124005405
$ l2 }# M2 `) B* h( x& @本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。* J! j- _: J: {1 @- N/ n
# O; ^9 U* q3 \
本章目录- o6 F" ?8 @. P0 }0 I) F( h( m9 P i
4. 轻量级神经网络算法目录
& t( h7 {7 t- o0 S v O9 e/ [3 }4.2 SqueezeNet
$ P/ V W C/ B7 S4.2.1 问题分析, A0 M% \, U) ^
4.2.2 SqueezeNet的三大策略5 G. R6 v6 V* S1 {
4.2.3 Fire模块
- j& _; q; |( k! H, p6 E+ t& N* [4.2.4 SqueezeNet整理结构
H5 |$ m/ u" t8 k. g4.2.5 代码实现SqueezeNet
6 J6 I+ L% `: x( p5 ^( j5 M) |4.2.6 其他实现细节+ u# `9 j4 S9 B) y- \$ ^; V# ^8 H" ~
4.2.7 总结
/ B0 Z" D* R6 q) z0 N: w# Z5 Y4.2 SqueezeNet& u- F) ]: w# g' E. P9 O
4.2.1 问题分析
; ?" _ {+ F+ X# D8 b0 l- @. z最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:' q% `% G L0 G4 C
5 q; t- [* a/ U在分布式训练期间,较小的CNN需要较少的跨服务器通信
9 N9 l: n3 a, d在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
( r: `. c8 N% h4 S2 U较小的CNN更适合部署在FPGA和其他内存有限的硬件上
+ k. }" N* T/ i7 `+ `为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
8 z: H. w1 w, V* f- o) J% q
- R1 w. \+ V" I0 ?) _6 \4.2.2 SqueezeNet的三大策略; f D7 D8 M! r3 U2 r8 ?9 t
策略1:用1x1卷积代替3x3卷积
$ }* M$ N- i! ^+ T% k* t1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。+ ~! c# Y- Y. T1 o+ g) i; x
B, g4 j( |8 L7 i& A: J
策略2:减少输入到3*3卷积核的通道数量. E2 z2 A6 p4 W& J( t! x: w
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
r3 ~0 Z! u: X9 `
$ {- U* x1 J' t' t策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
4 Y' A6 _% Z/ `8 E( ~# l这里的激活图(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中。1 }( ~+ f% Y" L
0 q+ z" p. g# T
策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。$ P$ g' ~: j; W5 }
; B# T1 b7 G' \" m4 e4.2.3 Fire模块* }5 o+ P- t' r: y2 `3 L' u! q# s3 o4 \
为实现这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 R! l& R7 @6 b9 g) o
* M/ u2 S7 G9 r3 S7 y
# o9 A. d9 i, M& N! ~4.2.4 SqueezeNet整理结构6 m6 Z: Y9 V3 `0 v
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。9 @2 k; F7 z& o6 b
5 E' T6 z7 ^9 ?# v* w" I3 \
0 f% T7 m. L6 x) d1 G8 g& H0 a4.2.5 代码实现SqueezeNet1 g. v! w- M* O3 ^! p3 w: x: j- D4 I
Fire模块的代码如下:) M3 G) Q9 |$ U2 P) g) ^
+ x6 W* p2 e2 v2 k' dclass Fire(nn.Module):# _* {9 s, g: g- W: C: A- B4 @
0 e$ m- q. x) Z def __init__(; A3 W! U& x. ^# |/ `8 m& W
self,
( d/ l) K4 e/ O0 a* h inplanes: int,
% A0 C Y2 Y6 q squeeze_planes: int,
' H% V5 V" C- V. A, Q; b expand1x1_planes: int,
( a4 ^' S, {; M expand3x3_planes: int
# \; r `* |) o0 w V; T* ^$ G ) -> None:
$ G; m% h( r# `/ R9 U+ ~8 v4 K2 U super(Fire, self).__init__()4 [( B5 t" q+ r$ [+ [
self.inplanes = inplanes2 Q! A3 R' W2 I; U- ~0 I9 V; `- U
self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)2 j) ~: i7 A5 C- {. o9 T0 E0 P2 H
self.squeeze_activation = nn.ReLU(inplace=True)
, J+ I. z4 w- w0 m7 v self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,% y( c" E0 @# W8 i* _
kernel_size=1)
7 p' P8 Z) p" @, A$ j/ y self.expand1x1_activation = nn.ReLU(inplace=True)
7 Z+ r6 h, a% }6 a I% r# H# n/ u# x self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
0 z% Z5 l2 @$ m kernel_size=3, padding=1)
2 y. F3 k: o/ Z& u3 p! _: }* D self.expand3x3_activation = nn.ReLU(inplace=True)8 K9 e4 b/ m8 r* M/ U
+ W2 d! @4 o: h, |! m5 o def forward(self, x: torch.Tensor) -> torch.Tensor:3 P( _3 v- `* F1 r# c" _
x = self.squeeze_activation(self.squeeze(x)) S, I: E) J. A+ ?6 L
return torch.cat([1 J, y2 N- S% [$ Z6 T# _- ]# T
self.expand1x1_activation(self.expand1x1(x)),
& ~/ f( O( Z. N) L1 h0 _ self.expand3x3_activation(self.expand3x3(x))
' u; H$ s7 O7 y$ a ], 1)
0 [- c [; B" K6 M+ W- q" ~: C/ f9 N
17 y, N! W# z9 P- X7 N( E: d
2
/ X! \( q+ @1 H5 ?4 J9 M- ~2 j8 k37 z/ w) t4 ?; T1 u8 B
48 j3 F5 P( @" j$ U
5
@; T1 U4 W0 W* j! v6
+ t& _6 o( y1 ~/ u# g: B% C7& s* }2 r w1 B' M# `5 b
8& A. w4 H$ ]: B8 ^: e
97 i T1 E0 K4 _* _( ?& e6 h4 c
10
$ w* O4 ~7 o$ T4 c111 E0 W- ^/ g- ?7 Z8 ~( Q
12! X* H) t+ l( Q4 P" N/ Q( h; J
13
" t; I2 i! g) V: \14" I( C7 [& n3 H( \# S
15; \' x! {+ ~3 A4 \! d
16
) K) K# R& R5 j/ c17 W" t" A" F' S1 ]
18
# ?, u2 n# O+ W- q19& e8 s+ A, j0 t/ v. ^
204 c1 }) Z$ w& B' U d, @3 l; K
21& S3 q, L) i2 r1 J, L
222 F- r0 e& @4 ?7 i3 K
23( b8 v/ z2 I7 q9 H! u( R+ K
245 o$ O2 }+ D8 D
25' O0 F" g `- s/ x Q# C
26, E, x/ S# y S3 Q' \- `0 k! l# E. t
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
3 A3 _* w4 i. s* \) U9 G2 w, t- C# Z3 {8 P, T* C, x3 E8 X9 w
SqueezeNet1_0的网络结构如下:, l/ a6 n _& l
- r/ H6 f; W/ b! x6 [
self.features = nn.Sequential(! ^! s8 i8 F! T- E/ t# Y- F3 F
nn.Conv2d(3, 96, kernel_size=7, stride=2),
5 E% p8 a; J0 }2 X6 R nn.ReLU(inplace=True),8 M0 O& P. d$ b
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),8 G# e% ?- y# `" z/ I# z
Fire(96, 16, 64, 64),
! v* I9 [" k+ ^+ I Fire(128, 16, 64, 64),4 t7 y+ r7 R1 X( H
Fire(128, 32, 128, 128),
7 h& k/ B2 C! R% L- L nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
* W/ J# V$ X% Z6 I& A) H$ V Fire(256, 32, 128, 128),! e4 g% Y0 @% }* g" _* g
Fire(256, 48, 192, 192), ?+ O% i4 C0 J, k2 A) d
Fire(384, 48, 192, 192),! x& d8 E' S8 b) x5 s9 `
Fire(384, 64, 256, 256),& Q& F% F' W" U: K- L
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),3 W- E7 t3 H8 E( _( e% Q
Fire(512, 64, 256, 256),
0 m. T+ v, ?2 G# O)
+ f2 M r3 E2 Y& z4 p: ?: z8 Xfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)! t6 Z- e9 H# V7 H7 R" a
self.classifier = nn.Sequential() e' \3 b, O h# ~
nn.Dropout(p=0.5),
+ d! _3 d5 q# P' p. ~" @, s final_conv,* A5 \. }7 z6 @' c' ?* N( a
nn.ReLU(inplace=True),
$ j' h9 j! j8 l' @; M nn.AdaptiveAvgPool2d((1, 1))+ r9 z2 W* H4 E/ K' I- O
)
# ]; d0 l% G; E5 k0 A. D8 T( L
( ~( B/ C" \* V+ k8 n5 n
8 b4 o% m8 n n6 s1
0 ]& d' m. C! X' d9 ~' F2
1 ]* e9 O$ Q/ L- |6 }! f. T3
+ v- w9 O. ^3 F4
" n. s& Z9 h: F3 k5
4 S: G* _ w; W u; a6
- Q; y3 L) s% H4 X5 r% u7( X) G- P3 O9 n8 j+ J" u
8. b& v/ {9 J4 G9 H+ i( W
98 m! Q4 |3 C# O! e
10
; e4 g: y! l* x0 G11
, ~: u" O8 Q9 P5 ?7 K7 ~+ s2 q12! j+ p% e0 l* M
13
+ T4 z3 a3 l2 q9 g! r140 i/ T5 |" d" U5 E" Q- X0 d
157 k" d" S- e6 d5 Y: o% V
16
2 A! H5 `9 d% o' \% Z$ ]+ e17
- o- S2 e( O/ {- \7 E! R18
) n% ]7 y4 X: n) ~19
0 m& a) t' o6 u8 E205 Z0 m$ f2 A. v+ h5 M) `
218 x$ F- B. o" m
22/ d0 y5 y+ u( A5 p
23
7 x( O/ y0 g5 R9 g& NSqueezeNet1_1的网络结构如下:4 X) D7 Y3 }+ _
4 R r# i- E7 i' K
self.features = nn.Sequential(% f' F2 z) Q. j, k+ p a
nn.Conv2d(3, 64, kernel_size=3, stride=2),; d3 J) ] D8 a/ ]2 @8 {# |- t* W
nn.ReLU(inplace=True),; { T1 a: V: E
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
2 I2 Y p& U4 E+ ^( F8 ^3 ~( } Fire(64, 16, 64, 64),9 m5 C0 \9 P1 ^/ @
Fire(128, 16, 64, 64),
1 n4 M; o+ y' i- @, T nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),; ~. I V5 b2 g$ ]( l2 q$ N
Fire(128, 32, 128, 128),
+ a! ?$ G, D/ R Fire(256, 32, 128, 128),/ {+ |$ s1 i: ^: c" ?
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),, c: u! b7 ~: g. z. e8 d. D
Fire(256, 48, 192, 192),) y) x C! `/ n2 M
Fire(384, 48, 192, 192),8 x( t9 U* ~' n" l
Fire(384, 64, 256, 256),& I2 b7 E7 Q; ~$ T, i
Fire(512, 64, 256, 256),7 f" m6 Q2 D0 V9 o$ g
)
0 c; l7 r: g8 E* xfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
" L" C1 I/ q/ E8 @) e, @4 fself.classifier = nn.Sequential(! e! ]9 e, _+ m0 m7 H
nn.Dropout(p=0.5),* Q6 D) R7 g1 G. N' F
final_conv,
% T3 c4 b: n* l nn.ReLU(inplace=True),
! D$ S" R. i3 H! F9 ` nn.AdaptiveAvgPool2d((1, 1))
0 y4 B. t E. i2 o2 E)1 h1 X# B+ s9 l! E2 ]
5 p, L( a( g* \9 }% w7 b
1
$ d; O) f2 d4 i/ p E2
, K- H4 e+ q% w: f0 A {% \8 q% |3. }; r, W/ T$ x; m
4
( r1 c# ^! M- }5
, d; i9 u$ F. K: t; a6
- r: ~( a4 W5 Y/ N4 k1 y4 K6 D/ u$ d7
6 o& p+ k2 J/ h0 Z0 O8
& |3 T9 h/ s8 } T' w F9
8 b3 O' X0 b* t. u4 r% D! D: S108 m n8 G Z& K
11# u) p9 f9 d) { |' p! w9 l0 ~
121 A, b. L& L! O# H5 K; z7 _8 L
13! g9 S6 ^! O2 x- o+ ^: `1 q0 E M
14& W8 o- B! R. N
15
1 g$ r/ `& O, |% D" h16 W5 w% |8 C/ i$ N; n% g- [
17: u$ j7 a' }, G2 T& `; b
181 Y5 Y; L+ b+ G$ Y; l
19
% c4 Q$ }4 G' a* `20
* @ h, e4 q4 d2 Y! ?21
' m" x* Z( _# I& b5 f221 e* i" i* ~- ?5 K" Y: ]) h
SqueezeNet各层详细参数量及其输入输出如下表所示。
' U( z3 x$ \' Q3 R' q9 u T) Y
& V5 i) B) N$ r+ a2 T
: Z8 A" H( c7 E4.2.6 其他实现细节
' O- n' a# W1 f+ k( f ^1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
) B- y$ y# _/ Q7 x6 Hsqueeze和expand层中使用ReLU# @$ V# Y4 f t5 }2 b; n8 b
在fire9之后的layer中使用ratio为50%的Dropout
! f" t5 r" }0 n6 P6 z+ v% B参考NiN算法想法,SqueezeNet中不含全连接层
+ P0 }8 k7 ^" @1 v! c/ V1 k% f训练时,前期学习率设置为0.04,然后线性减少
" L4 ^4 N5 k6 \0 m: ~3 J5 j* D4.2.7 总结
8 S( e6 c1 d: s% c% p本文最主要就是三点:
, ]3 R, }' _5 I& j; D0 L
9 V, n9 Y7 e1 B! d! _8 T1 {用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果' g( B' h, m' f7 x- s& I2 U
减少输入到3×3卷积的特征图的通道数,减少参数量1 f4 L2 o0 e* Q' [1 F
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率- K' |4 c/ Z9 L% C) G+ Q
————————————————3 N/ M/ P9 b$ p: n' `* U/ c
版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& o1 m/ W: F' H# N9 O
原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100: I1 Q' n0 v/ M
! p" v+ r# k6 O( L
0 [5 P. ]+ w0 E |
zan
|