- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563411 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174246
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
$ \, W8 M0 m, A
轻量级神经网络算法-SqueezeNet
' g2 ^) U; ^, p3 s: N% l. l4. 轻量级神经网络算法目录1 h9 `. b" ]; [% ^
轻量级神经网络算法
0 P: Q, v- C. S: t3 B e4.1 各轻量级神经网络算法总结对比5 K! C" u: O' {6 `2 E+ m: W2 k
4.2 SqueezeNet z0 m5 E5 u7 Q9 |4 |0 n
4.3 DenseNet- `2 z& x5 x, N2 \, y5 y* O
4.4 Xception0 p' G# m7 {1 p( a- M7 V
4.5 MobileNet v1
6 [* b) e, u9 ~7 I9 s4 A' ?4.6 IGCV
) B; o1 d( ~ ^+ g* m4.7 NASNet& U- D# k# Q! ]% G
4.8 CondenseNet0 D7 {" t V* I0 i6 {8 T9 k
4.9 PNASNet
$ Q: W/ L* G! W& A, v" `4.10 SENet7 }7 _; O$ v8 Z
4.11 ShuffleNet v1
# a: W& v7 C# j: m" X8 r& w, ~4 T4.12 MobileNet v2
; I: S2 _7 ?4 Q- C4.13 AmoebaNet- X u% F3 J3 I5 A% R
4.14 IGCV2
, M. ^0 Q1 w5 F$ k" ~- K5 l J4.15 IGCV3
7 w5 L" s8 I4 ]8 N) m; I4.16 ShuffleNet v2
1 f- F# U8 A* a- U% x1 s4 @4.17 MnasNet
+ O; Q+ O4 `: ^% T4.18 MobileNet v3
8 g0 I, A, d+ y3 L$ \深度学习知识点总结2 l6 v3 ^4 p8 C" d2 y. Q% Q6 G! W
7 r) d& e, o/ V5 J3 d5 H5 q
专栏链接:
; E7 r2 Z3 N. P9 E7 M3 e, xhttps://blog.csdn.net/qq_39707285/article/details/124005405
/ D% K. c8 p; C本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
9 e8 e, u" m& i( Q1 D; Y3 X
1 L! [3 M# F0 d8 M. h6 }' E本章目录
7 Y8 l! l$ g" L2 o4. 轻量级神经网络算法目录
0 l3 }9 m* j, H/ z' s/ X. N( k4.2 SqueezeNet
* v D8 i Q4 u7 R4.2.1 问题分析
( x' M! u2 N l) E4.2.2 SqueezeNet的三大策略; \& Q6 F9 W. S/ [& w8 a: Z
4.2.3 Fire模块! H- b" j7 E) u0 `8 h7 O2 e) Y
4.2.4 SqueezeNet整理结构
. O. s$ j: H/ s5 o- o: f5 c4.2.5 代码实现SqueezeNet
{. i2 l: {; ?7 Y$ ?4.2.6 其他实现细节4 T! h2 s8 a% t: l) l1 f4 A3 Z
4.2.7 总结
6 O# S, c) x% O2 A! z4 { ?- J1 ~ W4.2 SqueezeNet0 F! ?+ i1 Q+ A- Z+ j$ G- @
4.2.1 问题分析
6 j( q* V. [( N最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
1 W4 } u* m5 k; |# {, ?& t- L# O) _8 u: z4 r" n; h3 C$ K
在分布式训练期间,较小的CNN需要较少的跨服务器通信' z& w& I4 W a& ~; _
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
2 @+ w/ N1 H U9 e m, F较小的CNN更适合部署在FPGA和其他内存有限的硬件上
" N0 [3 m2 S/ O+ d' W+ W为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
# i/ z$ f& z8 H5 g4 `& Z5 u3 `- E
9 o% K/ f% n% u: E! c, ?* b4.2.2 SqueezeNet的三大策略 ]$ O& ~, b+ F4 U5 h" V9 k L2 @* N
策略1:用1x1卷积代替3x3卷积
( x3 i* _6 w# W+ l4 a4 O1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
. S. [/ z) S7 F6 F8 @, L f' C: a0 u/ j
策略2:减少输入到3*3卷积核的通道数量
) n- B' X& x5 c4 r; `% k) p( p2 [对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。- s' D3 K' l0 M" w( g) r. }
& f \+ \* J7 k( O. y* J* B' C
策略3:在网络后期再进行下采样,使卷积层具有较大的激活图" w2 G. j! R" R) Z% S
这里的激活图(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中。3 N/ e8 u0 W# P( n( _# _
' `3 X0 q r' F
策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。. A7 `+ a( b9 H7 Z3 a6 C
2 N4 g7 a7 M( C/ M6 ]9 d6 j o
4.2.3 Fire模块
* f8 ~7 ~6 ^3 v* Y, p M. b: 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的想法。. T$ G6 a! N ]% {) c
8 R, g7 n% X: T# {: u+ r, ?; I _, [- g
4.2.4 SqueezeNet整理结构/ B, ~2 p* }3 V- G1 O, } q
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
/ h& R- {3 [: A; M; t1 d. M8 k1 h/ R
5 v. w/ y' Q) x7 }& t) C! V4 R9 k/ s- X, h1 ~
4.2.5 代码实现SqueezeNet1 @: y: W# ]' z& E+ e! e+ F
Fire模块的代码如下:. f9 Y# v* G5 w' _# c9 c8 F" Z
8 ~1 H5 Z6 w( g( J: Cclass Fire(nn.Module):% }' {+ k/ r, q- p* i
9 ^; _, F& B8 p: a
def __init__(4 x2 m: N. D+ U& \0 X! e
self,* b9 S" @9 z& F
inplanes: int,
9 M* g F) P# X- I. U squeeze_planes: int,, |0 ` w/ L( v! Z# H* p
expand1x1_planes: int,
! }+ t, B; `# N expand3x3_planes: int
: n, N9 p) p7 o' r& i, t i& u/ J ) -> None:4 \: E b( C- F2 y: H
super(Fire, self).__init__()8 F; j% A# l1 B7 M8 i
self.inplanes = inplanes9 Z$ y% ~- T. J. U1 T* t
self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
# p4 O2 V% J% o' o self.squeeze_activation = nn.ReLU(inplace=True)3 P1 c0 f9 f/ F9 M6 Q
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,3 m& P, ]9 t6 |7 V4 A" Y
kernel_size=1)
7 Q) X. j% J# j- i self.expand1x1_activation = nn.ReLU(inplace=True)
9 f' A/ d" T- w3 X" {3 ~( q self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,8 r2 Q1 J8 n2 A! J
kernel_size=3, padding=1)
* s! G" R2 M9 i0 x) q self.expand3x3_activation = nn.ReLU(inplace=True)
! ~( ]; R0 Y7 Q: U7 K# F+ |- ~/ m ^3 t/ H& J+ K2 s
def forward(self, x: torch.Tensor) -> torch.Tensor:0 }6 j6 j. M8 v4 U8 U/ N
x = self.squeeze_activation(self.squeeze(x))
& c2 |; f4 j3 E+ p return torch.cat([1 `5 X0 _6 b5 s
self.expand1x1_activation(self.expand1x1(x)),2 h$ f" S. I/ }7 l( O
self.expand3x3_activation(self.expand3x3(x))6 f* Q* H8 G/ } R* S! I6 c# ^! m
], 1)
. h0 c' `& a$ K+ z4 Q; h# H* X4 E2 K$ o1 x/ O
1
; d8 M2 a4 ~1 ^, s) ~9 c7 [2
5 B/ A' g. ^0 J1 C8 e* ~( d4 A3
- y! ?7 E$ }, v4
2 {2 ] t! ]) ?' i5 D50 y" J. I1 D& |! f; ^: a9 A
6 `8 _/ b; Z. k* J% G/ E" `
7/ N2 K- @3 w/ l- b
8
G3 b* K" C% p/ `; m/ r9& l! Y' _& [- p8 C; @
10
# Z( r; d3 |5 j' A11- g/ b7 i: f& S1 B+ k
12/ @/ t) D( c) P- [; A9 Q
133 ^$ e4 N r! v- c# f
14
5 m1 s! m! h. n2 [15" j7 D1 W; {9 P
166 v. G) F( |" O! d$ O2 G
17
( M4 a/ s# H: l$ j: X A18
4 w1 G6 }, S5 W: O) M V/ j, p19
: w" C) P! {4 o6 E: R20# m4 Z1 a( J- u, O, @
21
. }9 e0 }: g6 K! O22
( F- m: x. j" T+ G' A( f237 Z6 r/ l" o/ K0 J" U- Z% h# P
24
% y, |* [* y: N* k8 ~" k25
# X t" A: M% p$ b+ I' y5 L R26
6 {* L" q* Z5 Z$ M: a" j' m& HSqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。5 U/ h! [% L0 T; ~+ K* E* C7 D
' K# n1 v% A) O) q5 r3 x3 R- K$ [
SqueezeNet1_0的网络结构如下:
8 n$ |- x# j& Y5 g2 D T0 _0 i# z6 Y1 s+ _, D
self.features = nn.Sequential(
) ~+ U& ~6 E- L. N1 F" a# c3 {, w nn.Conv2d(3, 96, kernel_size=7, stride=2),! Q g1 u8 N" Q' e+ y+ C0 p/ e! e$ B* \
nn.ReLU(inplace=True),/ g/ f, I# r, C+ C- N0 e* @ W' S
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
$ N6 ?2 H# U$ K0 R Fire(96, 16, 64, 64),
( F ]% U2 }6 L$ _8 {+ y Fire(128, 16, 64, 64),
+ u3 g9 u3 Y2 q1 r H( e Fire(128, 32, 128, 128),/ I5 d$ _* c- o' P
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),6 ]# [6 C# W/ G
Fire(256, 32, 128, 128),# C- c x F( e% m2 o* u' r
Fire(256, 48, 192, 192),
/ n/ Q1 o* M& Q2 W5 ]# o. d Fire(384, 48, 192, 192),4 b8 m# \5 ?8 x; B0 V
Fire(384, 64, 256, 256),
/ t I7 H4 V1 W. y9 A9 H, \ nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),7 [" V7 m8 n7 [. ~: J
Fire(512, 64, 256, 256),' l+ Z* Z& V) \# P0 Y$ }( n
)$ U; ~! S2 [1 T* G) r
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
$ x" {; y7 u. r7 yself.classifier = nn.Sequential(4 E* ~9 G9 S% j8 L; T0 A% d. m: h$ ^
nn.Dropout(p=0.5),
4 u% W k2 M1 p7 k! y. F final_conv,7 `- V. u' ]( s0 Z
nn.ReLU(inplace=True),! v+ r2 k; Z5 W1 ~% c
nn.AdaptiveAvgPool2d((1, 1))
, s7 d) x/ \1 D6 i) J5 D)9 r" N6 R1 S4 V. V8 I9 ^1 o9 ~6 W
* d5 C8 `+ d& R. @$ N
9 @; K( C2 O2 _1
F$ c1 `* _: ?8 I% V. }2' u. o' q) l5 }! Z4 y
3
+ r. K3 A, p" s0 [4
. M! B" M4 m5 A% r# R$ m4 G5
5 J% \4 o' K/ `& x6
) Z, @: `! A7 x" B" x- ]. G7
! h7 d% w1 \& d% `89 O5 {7 x m& P `! D+ [1 h; R
9
/ v5 M, n& F+ A5 ~1 X# f7 {1 G( ]10
/ Y3 |* W6 z' F! a. S" [5 _3 E114 H5 x+ k+ S+ K( l
12
4 T, P: `9 ^2 L z13
6 ?0 }. F ~9 |3 n14
% i7 O2 B0 z% \5 u" i) e7 j! | I& c15+ M8 W P& A' N9 v- K! K
16; |% r' |# [8 L, A1 b3 Z6 n
177 m+ N2 S+ D* T2 e# _6 Y* A" Q
18) `+ H' k9 O7 S' s
19
1 M/ @- |" X) d% ]" h; U20& k% C2 H/ D" Z O0 z+ y
21
* W+ @& e3 [% W2 D9 }. x" ?22! \! H: ~% K( a0 B' f7 A
231 L4 ^" t: K' Z& @1 {1 s: @! S0 \
SqueezeNet1_1的网络结构如下:
0 \" I7 F' o! `& ?; k
" ~7 }6 V1 y9 R- o) [- ? Z2 g) l: qself.features = nn.Sequential(
" J5 X5 `: r# m4 K' o# V nn.Conv2d(3, 64, kernel_size=3, stride=2),
5 Y* I* G, }" f& c nn.ReLU(inplace=True),
! y# {! x. c( O G nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
- L5 e/ o r. n Fire(64, 16, 64, 64),( u+ O1 L. x9 n( m0 a
Fire(128, 16, 64, 64),$ x$ l, Q# p4 x1 R) O7 i' u
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
- S2 K6 a8 v3 F" i) u; P7 p6 R Fire(128, 32, 128, 128),
1 ~; n* Y8 C/ `* I( } Fire(256, 32, 128, 128),
; ?: o9 N3 H3 x6 O. i R4 ?, O- K nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
' j! A# U8 h3 X$ }2 K Fire(256, 48, 192, 192)," Z- ^, t1 Y; H
Fire(384, 48, 192, 192),
0 d# u+ ?: ?. M( Q i" J! ] Fire(384, 64, 256, 256),
7 _; N! d, R% O/ D1 c$ l4 Q6 j Fire(512, 64, 256, 256),
. h- U" F( m2 E" O5 V( _* O)+ @9 _7 G/ H' b' R9 Y0 O: F* q
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
H) |# D$ @) jself.classifier = nn.Sequential(! G& C5 { } n& a
nn.Dropout(p=0.5), N; I& ]) v( G9 W' J
final_conv,
+ i1 l& b% ^$ ?8 x' J+ | d2 F. V5 T nn.ReLU(inplace=True),
' @$ F) J$ q3 [. z( W# b nn.AdaptiveAvgPool2d((1, 1))
. R7 ]8 n# V; d# a, [. n)
5 N7 n0 U2 j$ _- ^
. X6 }! N- p1 j/ b3 J1$ m4 W. Q# |' F. @/ a
2
+ x/ q( O$ ?& r: _6 A! {. z) L3
% \8 c7 N# X* D7 S' G4
( o' N s2 m# V, W52 f( S0 Q( w0 R% ~; d! o
6
0 s# I5 @3 N- Q4 q L7
. I+ V! N0 D+ M Z' g8# @; [2 i: `4 c3 z0 |- z
9' J6 w0 _1 t% m3 M1 N
10# T+ N2 q2 l: P; h9 P7 c# m
11 k/ i% g$ y! b7 H& J
12+ M! A: z4 Z; X- X
13
9 |6 g5 ]0 j9 ?4 O6 Z' t4 Q1 d+ u14
/ b8 `/ l9 n8 E3 b/ m15
, X9 t/ M- u1 @0 @$ U16& d0 n$ G8 b3 A O; z
175 m$ }% X4 C8 `; K9 Q/ L! H$ W
18
- Z% I* I' k# o, W' c$ n- x19" Z- k: S' t# \- E
20
, j1 r( z0 e/ |# u& J, x' m213 q- a4 S9 ~3 A6 R
22# r. x0 ?$ Z9 S) o$ C: L: z
SqueezeNet各层详细参数量及其输入输出如下表所示。
. _ r* t) C f5 x+ p& d. j. `4 J: ^# i9 o
, M$ W" ~/ t. p4.2.6 其他实现细节
( E' Y/ V! Z$ |& S3 t, Y( [7 D1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
1 q) y1 N0 s" Y- O( F- W5 {+ Zsqueeze和expand层中使用ReLU
4 r% ~9 K( z8 L在fire9之后的layer中使用ratio为50%的Dropout
& C5 `6 k' @. p# L8 \. K9 v参考NiN算法想法,SqueezeNet中不含全连接层
6 l1 R: T1 {3 y* A( \4 F' C) ~1 w8 p% l训练时,前期学习率设置为0.04,然后线性减少
* k3 E& R' A: K/ F$ x- q+ U4.2.7 总结
% t2 v" E S# X; O本文最主要就是三点:
) p; n8 b4 ~9 Y' _ t' e' z; B5 P
! f( ~7 b$ E4 J- y' \% R- G用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
7 {, r% |) r5 R* l减少输入到3×3卷积的特征图的通道数,减少参数量
. z/ K [8 H: j' C1 o/ I不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率
, S+ m6 N# q% m6 @' S t————————————————
1 Q, j% B- X* N f( ~6 F, q: P版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& r& M0 C2 W4 m, ^, m( N- O& Q9 U
原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
9 ?5 e3 l, r- i$ V8 {. P
, X) s2 c8 |5 f! Y/ |: u2 p" A9 H3 X! V
|
zan
|