- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563253 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174199
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
% i. N8 o8 I/ m1 h& S轻量级神经网络算法-SqueezeNet' q. \+ k; U5 I8 q, [" y3 \: f
4. 轻量级神经网络算法目录
% g2 A* y5 B% W" R" p轻量级神经网络算法: f; E% w1 Q O7 p' I
4.1 各轻量级神经网络算法总结对比$ c+ `6 `% Q: E! t. i% t( w. M3 J$ T. I
4.2 SqueezeNet) Q1 V) B8 Q. K0 m
4.3 DenseNet* N2 J% x9 L* Q
4.4 Xception
9 r" P/ [4 t' R9 F! {4.5 MobileNet v1
7 ?6 c- B9 B( {' ?8 o4 Z; O4.6 IGCV! \3 N* p- D3 t! b2 x$ \! z
4.7 NASNet! U i1 e! Y' P9 c
4.8 CondenseNet" _& e& K* f8 b K! I8 _8 G+ i
4.9 PNASNet
. @2 { K5 u Z( G. K4 S, [/ n. I1 I4.10 SENet
3 N& ]& ^ u& ^ Y4.11 ShuffleNet v1
( B3 K9 L7 a j a. j( H4.12 MobileNet v27 Y' s, K& w3 L5 r- L% R, J9 v! V# d
4.13 AmoebaNet
0 i0 E: e8 E$ i, S9 q4 a4.14 IGCV2
P4 D% ]; j1 ^5 V& t& @/ `4.15 IGCV3' T+ {/ M; g4 F5 X3 A- K
4.16 ShuffleNet v2
. d" J8 b0 c0 U% u7 \; `& U4.17 MnasNet
7 n: t: M4 r1 \4.18 MobileNet v3) a1 P( Z" ^4 v1 t. u: b* K" i
深度学习知识点总结
+ r6 G" K9 b- v/ P! A8 c c$ k6 F+ ~ I! U7 u
专栏链接:/ k' g2 n& X% h+ \
https://blog.csdn.net/qq_39707285/article/details/124005405
& \( r- v3 q* w$ W) _本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。- N6 ?! @2 }: U
1 f4 G4 N+ b, @9 z2 u. V' o
本章目录
4 @$ J) G# B2 k4. 轻量级神经网络算法目录1 {% ]3 M+ N/ m; t# j
4.2 SqueezeNet
( ~ `& \/ M0 g5 Z5 R4 e4.2.1 问题分析
% [# I( L/ W; D7 K; n0 c4.2.2 SqueezeNet的三大策略
# o1 a4 N' v. C. e0 ~4.2.3 Fire模块, S9 s' \. ]: Z+ [& ^0 |4 C
4.2.4 SqueezeNet整理结构
% x7 G: T2 g* y3 `3 Y; v4 [+ e4.2.5 代码实现SqueezeNet
: S# }1 |) ~: L& x4.2.6 其他实现细节
( }% h* y( n0 J& X7 n4.2.7 总结& L- V6 ]# @0 h% N6 ^7 N/ V
4.2 SqueezeNet
- Y6 }* _; t+ C( T1 E3 J+ g4 J+ Z4.2.1 问题分析
1 G% M+ ]5 a9 S9 w% Y最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
& |7 u" }! h* T* c+ T! z y
# M% g# f2 W# O/ g3 |% p) z: _在分布式训练期间,较小的CNN需要较少的跨服务器通信5 U" d8 h$ }7 U B# \8 U
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
8 \: e$ T, s" m; X较小的CNN更适合部署在FPGA和其他内存有限的硬件上6 a7 d$ _( ?) q
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
7 Z$ d* R9 k- @; h0 Y$ t5 Q# S
$ T5 h# n3 B5 O2 Q' n" Q4.2.2 SqueezeNet的三大策略% q" {3 @' W% d1 Q
策略1:用1x1卷积代替3x3卷积* P ?2 \' k( A9 H
1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
, s0 v9 h6 l! J$ X" c0 o
1 J+ }) h. u+ ^: q8 f$ o策略2:减少输入到3*3卷积核的通道数量. F/ ]/ _( d/ S! ^& ?
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。" U) O( n- @' g/ b4 M$ q/ g
6 w8 G% {2 N, K% H+ j0 q策略3:在网络后期再进行下采样,使卷积层具有较大的激活图$ Y; h) s, ^: j! |
这里的激活图(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中。
2 |4 t9 P7 Z: F* U9 X7 e- {5 j) L
策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
6 s7 q9 `* J" X& ~; X
( u6 R0 B0 g& ^! }* I' l- ^4.2.3 Fire模块0 l3 S/ r% t$ S- u% T0 V Y
为实现这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的想法。1 b/ o1 w4 u/ T# e; P; R R, P
8 b0 R T" e/ \/ V
) V0 D5 c+ p$ ^( ]9 e4.2.4 SqueezeNet整理结构
, |8 R" ?, V6 wSqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。4 [# g: Z1 _/ p( K5 ^! l
0 A: P4 t9 ?& d5 j5 L; M1 z* {! ~6 A: S) z0 ?' L. q
4.2.5 代码实现SqueezeNet' K! I3 c8 U* @1 y4 |
Fire模块的代码如下:
0 a3 }) y4 g p6 a( | K8 d" [
4 G1 }; p& c3 c; X* {class Fire(nn.Module):; h1 r4 z. N( W- L& }: p
2 |! ~: B# T6 w9 n. V* U
def __init__(
! V5 S, C- | d7 c! y; z7 B( b9 | self,
8 V5 p2 H7 i" N( K; w9 i& w inplanes: int,
( c7 n# n3 ?" V5 |; k& b squeeze_planes: int,4 B+ N4 S6 _# s# @( V# C+ ]1 A
expand1x1_planes: int,
' [+ P% H& E) M: v expand3x3_planes: int
' L% s, ], Y2 A: _+ ~ ) -> None:
3 M8 b+ Z* I: G5 c9 O. B super(Fire, self).__init__()* l& |# @# B' j" P1 t( c6 @3 e
self.inplanes = inplanes
w& ^) G8 J! M" d self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)% ~- s( X! D$ H- p1 t" I# `
self.squeeze_activation = nn.ReLU(inplace=True)6 L- l) d, S' @" t$ I
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
% K# R0 f( E7 L5 q. c$ O. i" s6 z kernel_size=1)
- M; N1 P+ @2 y1 h# g/ ` self.expand1x1_activation = nn.ReLU(inplace=True)
$ S" a2 _: l& v+ U! N, s self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,4 r, r2 K4 Y& R4 L* S
kernel_size=3, padding=1)8 J" V; g0 }- M4 E
self.expand3x3_activation = nn.ReLU(inplace=True)
/ t+ @+ ]# S0 i- @3 u0 n
' W* D5 x6 X4 m8 z( l$ r def forward(self, x: torch.Tensor) -> torch.Tensor:
6 S1 ]5 J6 i% W4 z+ c7 \7 [ x = self.squeeze_activation(self.squeeze(x))
) U: P! O. j# n1 }. o& b) k return torch.cat([
# H, @8 [/ `6 d0 W self.expand1x1_activation(self.expand1x1(x)),
6 Q' ? A( s' E- j+ g self.expand3x3_activation(self.expand3x3(x))
0 |5 x! K/ s4 X ], 1)0 P: m$ S+ T2 }5 m' [. k2 t
( u( s2 Z. N+ E1# M* S1 F/ T. z4 _9 h2 w
2, m$ P8 H# p. f% ^1 S
31 a$ e2 D T N5 X0 s
48 k+ f# W# d4 U# V- j3 N R
5
$ q5 o6 a$ b6 M6
# Q# O5 f" n- m& H: f" Q76 N9 B$ j1 d7 h& L9 ^/ A
8% }+ Z: k5 }2 n- a+ k3 j: E' t' j# k
9( J2 O7 Y- l+ q6 q ^4 U% s
10/ R& @5 [& k) S1 l/ {
11/ t5 m& u: l. l# `2 f, D
12# t& D5 h' ~$ q% L' U1 S! j
13$ J4 N5 @6 \4 U, Y3 k6 E
14 Y0 u6 I h* [4 f9 k* \
15
8 E* k8 V8 g1 n2 M6 q) }) l16
* u$ j& r Z% L; {! l G17$ c4 @: j4 v6 ], ^. T3 ~
18' R6 E: h: U1 R" c
19
7 t; W5 |% ~, k: Y& p1 f8 F20
, H) d" L7 \/ i: U: p) Q5 C* t219 f3 L8 L* Q0 ]; ]7 Y/ F
22
/ X" A0 R1 R: N& c3 J* \236 p: A( [- h' v9 h5 i
24
) G: Z1 t. n' N! n. l/ q$ ]251 r: R: h. F `1 D$ X$ U' E1 E
26; b& s" Z/ U0 W5 _0 B
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
5 z# W5 `, E- g# U8 w2 F' O+ S7 Z% y9 ]4 L, c2 p' J6 a; V
SqueezeNet1_0的网络结构如下:
* }1 z# {) ^' s9 h
/ g; |. z! U) i* yself.features = nn.Sequential(
/ w" d* t$ r& V nn.Conv2d(3, 96, kernel_size=7, stride=2)," e' z" Z' C5 W
nn.ReLU(inplace=True),* b6 W% S# N% Z4 {+ l# X; E
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),; w8 @* G' a! T; L/ L8 x" ~
Fire(96, 16, 64, 64),
( Y# V/ O- w* i3 e3 N- L Fire(128, 16, 64, 64),
! l) ]/ l: k/ U: D5 b; H3 t% E% G! B Fire(128, 32, 128, 128),
) w3 G$ K$ h4 J' V1 O nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
$ [0 I, p& v" o* X' e9 b2 H) u Fire(256, 32, 128, 128),: U) L( o q( M% S/ L" Z* X8 v" G0 Q* n
Fire(256, 48, 192, 192),
7 l# l% ~* W* E; l Fire(384, 48, 192, 192),
! v$ C* u0 e4 R3 }4 ` Fire(384, 64, 256, 256),0 ?9 ?! y6 x: g% @
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
/ K0 w" W) R* R# i' c8 ?: L Fire(512, 64, 256, 256),
, L) }# X5 b% m' T! {! g)
S/ @+ P' g% T5 X9 v2 q0 Cfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)4 A! b$ ]2 t2 r; ~1 Z" u( v: o
self.classifier = nn.Sequential(
# h: K' X9 d: i: F5 k: S# R2 D nn.Dropout(p=0.5),
$ S+ w5 M0 j& ~6 x+ g1 l. f final_conv,: x- p$ M1 [0 C: t( P
nn.ReLU(inplace=True),' H- Q+ F4 N; i' k( G
nn.AdaptiveAvgPool2d((1, 1))
% d l% p/ @0 z. C4 |5 L5 u x). e8 Y- m! |& M- I0 V! H3 F
6 f0 Y8 o$ [7 q8 |" P: L
/ l: {7 ~3 Q5 R) @10 L7 L( r n, a# D, `+ ]
2) k6 x! V& p0 C: V, [% A D
3. j$ T2 a" n& Z' e" S6 z- R
4
* a2 L& Q2 y& z, r5. C; B* G, z5 M. l+ s& O) l
6- C7 d; x8 [ h. ~! \( U
7/ v. [4 k7 y: z
8 W4 ?3 h: |9 W- f
9, N5 G' V! R* F* m2 S7 O- O
10
' p% ?, ]9 {- l) X114 ]9 g$ Z; Z+ f9 r/ i
12! L, C: U& B6 E2 o
13. }/ E, W) S% ^8 t& l( f
14
% W7 m* V3 i4 F15
; @' y' O" v l3 g& n; S16! f+ _! i. o% _3 g+ ]% L: g
17
$ y3 @ l% J- F& R: i18
6 K. a; c, s5 X$ H" c" Y% t6 M! f19
: a8 o( j6 ~" |7 x! c20/ w: n4 p7 ^5 c; u$ f4 J; y
219 x+ N8 z; g5 E, @. P" M* r
22
1 q, L9 E/ v: c+ P1 F23
5 K% a7 f- W# b2 aSqueezeNet1_1的网络结构如下:4 J# M x1 F1 u8 h# N
) D0 a/ C( h* K3 y
self.features = nn.Sequential(. G! z% p6 s/ q4 B+ k8 r" W
nn.Conv2d(3, 64, kernel_size=3, stride=2),4 {' ]$ d! w: Y6 P2 D
nn.ReLU(inplace=True),
9 n3 O& R/ w: j; Y nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),! | ?1 n' q: n' L C& A& y8 i
Fire(64, 16, 64, 64),& E X8 F& a! |: _
Fire(128, 16, 64, 64),' N4 ?2 D1 U; u2 J1 }
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),2 _. M- g: f; |) X/ a
Fire(128, 32, 128, 128),4 W2 Y. b' ]1 Q3 E7 K
Fire(256, 32, 128, 128),4 t6 L5 [5 Q8 [: V; H1 P: l0 M
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
4 |7 ]( Q+ b/ P& G% F1 [ Fire(256, 48, 192, 192),
6 N! n& p/ E% W$ b/ x5 i Fire(384, 48, 192, 192),1 o" r- Y* x4 N0 t+ Y4 F" C
Fire(384, 64, 256, 256),6 v4 H* E; J6 s6 i/ H! ^
Fire(512, 64, 256, 256),' U& y; v- e4 Z1 l1 O! [
)1 x8 e* e" g* U$ v; B* G$ u
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
6 U. _9 R: I, @8 L* i/ Dself.classifier = nn.Sequential(
# V V+ [8 q( d% f nn.Dropout(p=0.5),( ~! W0 n/ _8 h$ t# W+ Z0 C" `
final_conv,
* q' w( M# u2 f. z) F# L3 R- T8 @( U nn.ReLU(inplace=True),
6 P. K, P& P4 r# A nn.AdaptiveAvgPool2d((1, 1))
. [! f) X9 d$ S' U" U# X)
) M, {/ _$ O+ P% L2 U) q$ Q% c/ Y: o& U% m0 D6 J
1
7 u' g, j7 p! a' ]2% N5 l6 F9 y% [ A0 e- K
38 w- P7 o) Z+ x* s! ^4 ~
4
3 i) F9 Q2 n! v& s' i4 v56 g. ^8 h/ K$ }: y3 B5 A* _/ s& s
64 p7 s; m1 i' f8 I8 Q( K2 E5 }) p. ^7 R
7
' h! e% U& z/ t" K6 J' x8: f! M- A& T/ r$ r6 B% ]
94 ^; u; c5 k' ^. t# N# a
10, A$ ]& k# T [5 d) y- K
11
4 S$ a( S5 B: E5 O8 ~% {1 A12
& W2 T# r/ l4 d& m# I. O13
; t6 [' F" a+ q% p; I144 u f& t, H' w9 a! a
15$ y1 }' u# b+ G, ?1 t
16
# V2 I/ Q9 i1 p# c+ h t+ S6 y17
, k7 n' l' b) Q18
. G6 N7 M% B* {* c8 A* M |19# ?' J4 S7 ~! T. _0 |
208 @0 V0 f4 o' o1 _
21
- q1 |( A* v: _7 W9 {4 m22
* x" s" Y7 I0 |: \" YSqueezeNet各层详细参数量及其输入输出如下表所示。
9 Q- t& ]) e% A- F* t! q
; J: d; D0 a9 s4 I0 s* @1 h# L5 b/ c: _- E. B& m$ J" y3 r+ N
4.2.6 其他实现细节# i3 E/ D$ t) W1 z! t+ Z) ?
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding* J2 f( d# K# q# e# U& \( l
squeeze和expand层中使用ReLU2 g6 e' v _& K9 T9 S+ y
在fire9之后的layer中使用ratio为50%的Dropout$ z9 s6 r9 m* F |6 A% W' V1 j( j
参考NiN算法想法,SqueezeNet中不含全连接层! p4 v7 k+ ~) A- Z' i0 \7 F
训练时,前期学习率设置为0.04,然后线性减少
: w. R7 V) n$ p* F( _& M8 @9 z4.2.7 总结
4 E9 U, C; i" l6 d8 p+ L& L本文最主要就是三点:
) }( z6 A9 t2 a: R4 u# x# V
7 I8 c% t1 F- T用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
( n1 V+ ?( Z9 h% Q; k, O减少输入到3×3卷积的特征图的通道数,减少参数量5 x s1 j. Z( v% o9 d @
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率
8 P( |$ E% p3 Q5 s0 N3 p————————————————
! \/ T7 ~9 v: b5 a版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
* g1 j9 Y. S1 t8 w# @ ~* A j8 L# _4 a原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
. M6 y2 t$ Y0 m& `
2 e/ a; ]9 g6 o! g- x' w+ g/ I% l( ^3 }
|
zan
|