- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565164 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174772
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
) u/ G5 Z" P( I* f轻量级神经网络算法-SqueezeNet' {- h' \! D' u# _ b
4. 轻量级神经网络算法目录
6 Q( o) o6 o9 E5 K' n% a$ Z轻量级神经网络算法
5 N6 f% h3 Y% ^- \1 t9 R4.1 各轻量级神经网络算法总结对比
R b& n* `. ]+ g4.2 SqueezeNet
( l/ @/ l6 k! g1 q5 Z4.3 DenseNet
4 I7 t! A" g, {9 F i% }4 _$ l I# l4.4 Xception4 R, i! b& Y& t9 x+ j4 R3 |# [* G
4.5 MobileNet v1
]6 C- d L1 C; V' a1 P, O$ S4.6 IGCV9 ?/ Q9 c1 g: U) g
4.7 NASNet
}4 e. \$ [1 {9 @1 S! J4.8 CondenseNet ~2 Q8 v6 j0 G6 o$ G6 u! e4 M
4.9 PNASNet5 w* Y" g+ \& ] `6 g4 R/ e
4.10 SENet
5 u" C' D4 J2 }( P( ]4.11 ShuffleNet v1% a! T# a/ X3 H+ r2 p$ `
4.12 MobileNet v2: ^9 N5 s) X7 Z" C
4.13 AmoebaNet
, M: o* E% M# ?' X. F4.14 IGCV27 L; p% f# m# ]4 i
4.15 IGCV3% u( \2 N0 X! n4 p5 \4 z# [( d$ C8 d
4.16 ShuffleNet v2
! [3 Q) q% @& A# X4.17 MnasNet
; P6 A9 g# V1 O/ U8 d# E, ~, s4.18 MobileNet v3
9 Y$ I0 `* w6 q2 o, b深度学习知识点总结" Q" Z! i5 J% A0 J( h! v. \
& ?: s2 \! [% w- e专栏链接:/ R$ Q0 X c0 L
https://blog.csdn.net/qq_39707285/article/details/124005405 m# d3 u9 @4 [; ?( ?) [( d
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
0 J% B `* c4 q, J! Z0 Z( n. G
+ F& x( J. S5 o8 F1 S本章目录
$ F" U2 G% x" A2 z2 r0 Q4. 轻量级神经网络算法目录3 ^7 S7 x+ L/ h& P) x9 c: x* r
4.2 SqueezeNet" r' \; {/ s$ y* ^# J6 V( |7 ]
4.2.1 问题分析
& F& T' w9 F6 g% L; i2 K' U! o4.2.2 SqueezeNet的三大策略
3 e: T# ~$ V. m8 \9 p4.2.3 Fire模块3 W( w. v/ E+ f7 y; y R7 Z# F( Y
4.2.4 SqueezeNet整理结构
. r* e B+ {- I6 S, w% f7 y" C/ J4.2.5 代码实现SqueezeNet. D3 [1 [ a4 j! ^, @, O$ m" c- V
4.2.6 其他实现细节" V/ u* q c T+ l& ~1 B) H3 B
4.2.7 总结
; _- k. O) R4 @( ~% k3 P4.2 SqueezeNet
! Q7 T! }5 N; i5 ^4.2.1 问题分析1 `: O& T- U. F7 b& m6 X
最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点: B O% v/ w5 n! V
1 Z/ [- q: J/ I在分布式训练期间,较小的CNN需要较少的跨服务器通信/ W1 W/ I: r" u4 H
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
" f0 q0 P5 ]7 h l% g7 {" K较小的CNN更适合部署在FPGA和其他内存有限的硬件上
& u. p' U' h4 x为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
4 _* C+ e7 w K& }2 ?, [6 S: @: L; s6 Q' q) x1 \4 \
4.2.2 SqueezeNet的三大策略
- r8 d) P% e* S: `4 L策略1:用1x1卷积代替3x3卷积- {8 @ U, n1 P6 Z5 T
1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
' k3 ^" n* B+ o% L7 ~! [5 V
6 W [( J- ?/ e3 r1 t策略2:减少输入到3*3卷积核的通道数量* g8 _% s8 f Y; C% X8 D4 U, A
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。 h0 B" P% e) ~7 q
8 @/ l' A9 O7 \% `$ y策略3:在网络后期再进行下采样,使卷积层具有较大的激活图0 a, x+ K, v! o: T
这里的激活图(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中。
. v- C1 C1 l- u) V- ? O3 f) Q3 p% Y+ ]/ ~% K/ x, _) p
策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
& X U2 \# G6 g( k/ S1 G8 g; ~ H/ |
4.2.3 Fire模块
4 q! g, \: Y% f6 @为实现这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的想法。/ k$ }6 g- R0 v* z
4 w% z0 B9 `7 e1 M8 W8 I
+ I3 o# W& C1 ~7 p1 K) c( u
4.2.4 SqueezeNet整理结构
3 f% t: t- K1 \+ D+ v* q# H; m( G/ ASqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。! Q" z7 X: f5 I( Y
% e$ C4 d5 \" K7 T3 [0 F" u q+ J( y, R# j4 h
4.2.5 代码实现SqueezeNet" i' I% @0 y7 K: R2 r7 e
Fire模块的代码如下:7 f3 C. y. S4 k7 W9 ]* |. Z6 [9 v$ u
$ n& W8 e* I v Nclass Fire(nn.Module):' ^4 n: R3 G/ c2 t+ I6 j& j5 B
( r' y, q( j% X6 I9 ]. _- }! J3 U
def __init__(
, Z3 E. _% y: A( l: c2 U self,
3 j9 J# J4 p& ?! C# m1 X inplanes: int,
. } h6 r9 T- q squeeze_planes: int,
; G( p/ h5 t3 [ expand1x1_planes: int,
6 v" N3 \! W2 K5 v+ u expand3x3_planes: int4 Y! q3 P0 ?6 M" O! K
) -> None:
+ O. i$ M/ k' g9 y7 e super(Fire, self).__init__(): c- S( i- Y7 r& [6 [% A" Y
self.inplanes = inplanes
. }2 j7 E" [! s7 Q1 W6 x) p self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
# X& a. l& C, o& r6 T* }" {2 n4 ^ self.squeeze_activation = nn.ReLU(inplace=True)0 u: C8 r- L* c q9 u
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,- {/ v0 d0 _9 O& w9 V
kernel_size=1)
+ \# q/ P/ C+ v( L( V1 x self.expand1x1_activation = nn.ReLU(inplace=True)5 b( d: A' g0 x* z+ Z2 y8 Z
self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,5 m3 e3 K- ]# z. K
kernel_size=3, padding=1)1 }( b$ l- `2 p' K4 t1 l
self.expand3x3_activation = nn.ReLU(inplace=True)
' H4 j9 J5 {8 A! M3 [0 [( } r0 W3 X: v/ `) d9 P
def forward(self, x: torch.Tensor) -> torch.Tensor:
6 G6 ~0 y. c1 N( V+ j, q- k x = self.squeeze_activation(self.squeeze(x))
( r* r+ T, v- G return torch.cat([
5 A1 N- E) S; |3 P) R( v% Q self.expand1x1_activation(self.expand1x1(x)),
$ _( } s; Q- ^4 w self.expand3x3_activation(self.expand3x3(x))+ {# P: n6 H* V( h; ` R
], 1)2 s* K. i2 X4 L7 m2 [
4 b% a" p& B. E8 H2 |
1
% x7 O6 D/ j" Q$ t+ ?2
. O; k- o6 ~) x& V K3
% c" E v; C0 _, j/ I% X7 H4; b4 v; T4 F3 s# ^
5& z, \: T4 A4 p4 b e8 |9 Y, G
6
: K$ }3 r; D* d6 R/ K0 z3 `7
. ^6 n5 k l# L3 I6 r; ?4 z8& ^9 e$ B& b: E( [8 B
9; W# `7 c Q" s
10; Q$ x( J/ M7 o/ {$ ]
11 Q; ]) d% t0 _8 J
12* C2 m: F' K5 e( I$ o
13
d Z2 s2 K& F5 z; i6 q' a14) s1 R' i( ]% w; a9 B m% }- m
15
; u' P- o( q8 q9 y# X16
4 R- N' U; c" W$ _/ b( o E$ u: c170 Z9 O) a, Z) u2 F& l K( Z
18
: b/ o, m5 ]" @; D) ]# E4 w/ ?2 y19% `* |4 a5 G* E
200 p6 r. o; U! ^: u; B9 q
21
! J" p* f; ~! ^' j22
( ], f {4 _% m1 V: v23
! s2 e! k! {8 @24
) j. J1 z, p" X. b) [25! J- |( _& n# Y1 G: F) K$ o
26# H8 i' r# P. u. C3 C& y' u' T, I
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
b7 D# ]( `/ e3 p$ ?
: z5 H" Q- }' WSqueezeNet1_0的网络结构如下:
8 {; {- v' _1 a2 n( n- r5 r2 X2 P- E; Z$ ^% V# x% i: _
self.features = nn.Sequential(
f$ b9 a, e6 B- w( M8 }- v# S6 R# L nn.Conv2d(3, 96, kernel_size=7, stride=2),
* _/ e0 j1 Y7 y9 d% I! N nn.ReLU(inplace=True),
* ^+ ^) R; v* I/ I& B, J/ d nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
2 A9 ]$ R4 J% E Fire(96, 16, 64, 64),
2 u( P: c9 |5 O& ~ Fire(128, 16, 64, 64),) v0 x9 ?9 _- v9 V) a" v: x
Fire(128, 32, 128, 128),3 }% \$ V) }4 @( d; y
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
7 I7 x4 u) x; M8 y9 n6 m. ` Fire(256, 32, 128, 128),5 X) e1 t( e% ]+ ]: W
Fire(256, 48, 192, 192),% P' u+ m0 o, M; v) Q/ i2 A' \
Fire(384, 48, 192, 192),
% t0 V% ? B$ H0 n" ^) d9 i Fire(384, 64, 256, 256),
8 e9 Z' B! h5 Y3 f nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
, n4 u+ D7 r" F) Z1 t Fire(512, 64, 256, 256),2 W6 t) ~$ j0 o: J: X; E# X
) g7 s6 {! }1 v- ^! Q7 l4 f6 N
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
, ~" s' f$ o4 Iself.classifier = nn.Sequential(
5 |: }# a# U% i" g0 @& u, c7 E nn.Dropout(p=0.5),
- H D2 v6 U' G# J8 d8 ]1 O final_conv,
4 w( D' I. v" c nn.ReLU(inplace=True),
+ ^! r1 l# z( c: D& x nn.AdaptiveAvgPool2d((1, 1)): f: ]9 T D2 i$ ?$ @ e5 c" `
)- Z: G2 M m+ k0 C! k) b% l
( U. u0 a0 a) Y" K' V6 q
( ]) p6 M# W1 }3 w- g1 g
14 {- t M+ Y- }7 D! |' S
2
0 C. Q1 h9 y+ @" |% a1 P3
7 c9 k4 O. D9 Y4
% f+ O) z6 ^5 U. b9 O P: z/ L3 g9 T5
% ]# P4 l+ ]( p7 ^9 I* d& n* R6
7 h. o) `& y9 ]7
7 D9 C2 J2 I# @8) A$ ]; e; E9 ?
9
7 {& P7 v8 @' c* [; F7 ^* ?2 I10# D8 l1 \( Q* H0 O4 ? s
11
2 a0 O8 F0 }4 b6 E; H6 a# } r+ s12
* O' v3 ^* G8 o, A) Z13
8 Z6 z) X- i9 K* }14; W% N: l0 F) i
15% l9 H: \4 p: n9 }1 @4 q
16% ? S, b9 T1 W! _8 |( f
17$ j1 X' Y; r- Q9 @& z
18# V8 |7 q: Q" q+ L) B
19
- _! \* R" T/ K2 F% ^6 k20% E/ T) ?3 V9 c) K( \; \
21: [+ W4 b3 \; z2 x# t1 b
227 O: g D% J, l4 ?: r q7 @
23& H Z& t( R! v, c; ^7 F6 Z/ ]
SqueezeNet1_1的网络结构如下:: f' }. y4 r6 O
9 E6 o( M3 D3 I$ T1 ~* M! X7 p! H; D
self.features = nn.Sequential(
. O( X9 x/ b- J6 y nn.Conv2d(3, 64, kernel_size=3, stride=2),, u7 |% @4 E+ j9 R
nn.ReLU(inplace=True),
5 @, d$ J. Y, v6 v- ~1 a$ J. m8 o nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True), F! x* o; y# e; ~9 s7 z3 M
Fire(64, 16, 64, 64),
' o% E$ E9 a" \4 f2 E Fire(128, 16, 64, 64),, g. i- M6 U5 k5 l1 Z* g
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True), |7 Z" m/ ?9 F# R
Fire(128, 32, 128, 128),. q x9 \2 C* S- e) Q
Fire(256, 32, 128, 128),
! U6 f' D1 T# x" C5 |) ~1 n- J nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
8 p- X0 [$ h6 N- A9 R Fire(256, 48, 192, 192),* i& L- O0 Y) ^! C6 a; C) Q
Fire(384, 48, 192, 192),
/ X& ?" I$ R8 t* @. B8 N/ T Fire(384, 64, 256, 256),- Q/ Y) U9 p' O) ~) Q$ _6 h
Fire(512, 64, 256, 256),
8 I1 D- {) Y5 G)
0 T) {% P8 C! _! ?5 vfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)6 q9 I0 O5 P1 o; I, n1 Q1 Q
self.classifier = nn.Sequential(- \" k# j$ j: b/ w Y5 |0 y
nn.Dropout(p=0.5),8 x' P& d( ~2 S# A$ o! @1 y
final_conv,
- @, Q+ P. v$ [0 E2 z$ D nn.ReLU(inplace=True),& p, Z' y/ A( y- y% l: A# B- P7 G, S/ N
nn.AdaptiveAvgPool2d((1, 1))
6 ^7 [. M+ c8 p( _/ {)
3 m. ^2 P- B% r4 x8 P
: E3 p- k& Y* C9 {" c1( w |# g9 v' n3 K7 H8 T
2
4 }' j. P' U$ t3
& a* N8 t3 ]) r$ \2 W4
% @. c! S w# C5/ p# @7 D* F0 c3 {
6
& k0 X6 {. x. P6 Z72 S U) X+ A5 W$ h) N6 T
8
" e+ F5 a: g+ F+ t1 o: }- S9
3 w0 I6 p4 B6 W9 U( W100 W7 f: R, l# a( S; N; d4 _
114 y% R% }7 d4 C! @! V& }) [
12
5 r$ F1 z7 Y: }9 U, c/ A4 i: ?13. c D6 q/ \) W
14
, O, Z' @- `) Z8 p4 S15
. M# X2 C5 s( ? f G16
4 V7 i2 J5 k3 T0 Z( v; `. s4 q17
( P; m+ M. S5 T3 \' p, r1 b) W0 N/ \182 S v1 K+ @, ]- w3 W
19
; z# a |, F( Z R8 W) y20! F* P; k& b6 ^: |: A" p& x& V1 [
21" z) l* v( G7 D8 s8 B
22
/ U+ s- i9 r& K1 k% QSqueezeNet各层详细参数量及其输入输出如下表所示。( x) P3 _$ u* |- A* k
( e( F! z6 W* i9 g: p- O
0 a3 ^; X5 H( F, K$ Y* a
4.2.6 其他实现细节( r5 y. f& Q' c% i# H
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
: }7 b5 t& o1 d9 v G9 x( b) q3 msqueeze和expand层中使用ReLU
. R9 G9 S" u8 q& f0 a+ m1 o在fire9之后的layer中使用ratio为50%的Dropout8 P" V( q( S9 E
参考NiN算法想法,SqueezeNet中不含全连接层$ B6 F* F- n' g, O( |8 C
训练时,前期学习率设置为0.04,然后线性减少
0 @. F" e2 D) \. h$ f: N4.2.7 总结" f1 A" R5 X' g% y. ?/ l; {
本文最主要就是三点:% @5 O5 }- _& G2 o( P) N
7 F3 o3 X; z. M6 }, Q用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
9 P5 _3 A6 ?. |0 }9 M5 }减少输入到3×3卷积的特征图的通道数,减少参数量
# t' p+ O% E: Y; K6 D, B3 D; r8 u) E/ V不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率
% U {7 d* _9 M) d8 y- a0 ?6 A————————————————$ }! k3 E- H5 K3 D, E
版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。) R9 \) Q8 C* X: K
原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
2 z6 w+ ?5 F A6 p2 O2 H! ^1 K+ b3 c% G* _4 w
8 ]9 ^. y0 b: [0 Q |
zan
|