- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569615 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176107
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
/ W5 ]1 x. U) c. J Q& a
轻量级神经网络算法-SqueezeNet4 C' k" Z- Q, |2 |8 Q, F$ m
4. 轻量级神经网络算法目录* \0 B* X6 m6 b: D$ z/ c
轻量级神经网络算法& e5 m# q5 S, K: B/ h4 H
4.1 各轻量级神经网络算法总结对比! x: c3 @: W9 k; G5 P
4.2 SqueezeNet" [ |0 u; v8 S; D. c; x
4.3 DenseNet
" z( _5 J3 {/ v1 l7 r5 J$ J7 y# s9 L4.4 Xception
( M+ }- p% m. I1 I5 ~/ q4.5 MobileNet v14 m7 J! F6 |/ n$ c' [
4.6 IGCV
6 f& @9 k; Y$ Y# x( \4.7 NASNet
! g$ x: ?$ W: }2 ?5 X( k3 ?+ \4.8 CondenseNet9 R; n- y w f6 [ [) c
4.9 PNASNet# [$ B( P- |! Y6 L) U8 j
4.10 SENet
( R1 n# e# E7 G( E/ D/ T& t4.11 ShuffleNet v1) ?# e0 x ]7 i( j: ]1 N, l
4.12 MobileNet v2
! D2 k' F! x6 H+ N, p# J; Q4.13 AmoebaNet
4 W- x4 [ v* M6 ^+ I% @ P4.14 IGCV2
" J' Z3 A" I! R3 `' q& |4.15 IGCV3. Z2 J# q" f$ m5 f- a
4.16 ShuffleNet v2
% G9 t$ D$ @0 {8 v M0 {( {$ C; S4.17 MnasNet
2 A0 @3 _" \4 I4.18 MobileNet v3
9 c- k6 |+ D2 Q( ^8 {# g深度学习知识点总结- b, ?3 y6 |, \
( v) T% `$ B" b6 |/ Q1 Z
专栏链接:
' A _3 ^5 N( c. Qhttps://blog.csdn.net/qq_39707285/article/details/124005405
: H z Y7 q/ X8 y本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
% z2 F5 D" x: t( s4 `, |/ M O: Y0 M6 D! f& F8 ~' G, M# a
本章目录
9 x' P" J% M T, m R4. 轻量级神经网络算法目录
, [5 @6 @* b+ \0 v$ _( u4.2 SqueezeNet% L2 [, r+ ]1 {) E. J
4.2.1 问题分析
% i1 x$ a7 M- X4.2.2 SqueezeNet的三大策略
% w8 i3 k. V! h4.2.3 Fire模块 r; W. d! ~. r/ x( g
4.2.4 SqueezeNet整理结构
4 w( A, z! O4 N- w: k4.2.5 代码实现SqueezeNet0 N3 W8 @0 r+ o. v3 B
4.2.6 其他实现细节
3 l/ X4 I, O8 b/ e$ E3 m4.2.7 总结4 _% w1 E" d, s$ X! L: z* M& z
4.2 SqueezeNet4 [6 l) s/ t; e2 z! t
4.2.1 问题分析( ^5 N, P& I' p8 E. e) v
最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
& q, a- P# Z- H4 \3 S9 X+ M
1 n( }" j8 a8 O在分布式训练期间,较小的CNN需要较少的跨服务器通信5 b* p0 N4 S5 j4 n: p/ S
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入$ S; E$ |( m/ }/ D/ Y! v6 z
较小的CNN更适合部署在FPGA和其他内存有限的硬件上) O' N# G3 }: ~, P
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。9 U) Z; Q3 q0 \. K, d3 j
# A4 P0 [* Q3 r9 H
4.2.2 SqueezeNet的三大策略6 O) S3 p5 s, _1 M, g' U9 j
策略1:用1x1卷积代替3x3卷积
: R* I1 y4 a7 }7 `; Q6 O1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
, b# t6 \; a2 @9 o6 [% W
; l, H1 v# R: _- M- y- s策略2:减少输入到3*3卷积核的通道数量! P1 o0 h5 i/ m, \) ^
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
9 { m" V2 ~- X) a- f T' } J- u- C' j+ x9 f5 N. f
策略3:在网络后期再进行下采样,使卷积层具有较大的激活图& u, B. F" t0 ?) a( r9 d) |/ O
这里的激活图(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中。
0 P- Q& H, K% Z' u _
7 p3 j. ?4 f- }/ w. B8 }策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
2 n7 y8 ]% [3 y8 [ a0 n5 @ l" x& U& }& K
4.2.3 Fire模块/ ?1 G8 y, r1 g' }# p: R2 q
为实现这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的想法。
. L/ R7 P) ^$ t, k! Y) }
4 \( N$ v! L1 s3 F$ y$ ~/ _; T
7 g' B- y" x2 p3 g- z6 t4.2.4 SqueezeNet整理结构
* W, h: }: B" C' Z: ESqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。 b2 C$ F n/ S2 Z. g6 v. T/ D
, i- J! U% P* l8 n5 }+ a5 T! Y, G) P+ \
4.2.5 代码实现SqueezeNet$ J2 _+ f5 A& o& B, u
Fire模块的代码如下:
, c" e* k" [: Q6 _; k8 A* f. F
; r( c5 q" v2 f Xclass Fire(nn.Module):& J& ?# z3 ^9 l
2 L+ \) O* B* b6 l" h! E
def __init__(
! W" t4 r" P; v6 I* K self,7 v0 n' [. K3 s4 n' k! D/ Y
inplanes: int,
* i0 V9 {, M( }* ] squeeze_planes: int,& s* W, |. t! v- q# s2 O3 h
expand1x1_planes: int,- @, }# z z' [+ | m, E" G$ V2 x/ J
expand3x3_planes: int8 Y5 A" i- t, i0 v% |
) -> None:
s B6 i. C: C8 M2 c) P& j4 U super(Fire, self).__init__() y+ N1 Q9 Y$ z B% ?$ ~
self.inplanes = inplanes
' A7 h0 I4 y9 `: J self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)# }/ o; v+ ~% H7 w6 z; W
self.squeeze_activation = nn.ReLU(inplace=True)" F+ G: ?+ g0 u8 V: Z
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes," ]4 H6 O( v: F
kernel_size=1). u* u/ Y8 P3 Q* Y7 m3 o" g
self.expand1x1_activation = nn.ReLU(inplace=True)
9 ^# A3 L3 E9 \# t$ t+ V' ~7 { self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
, h# r8 r j0 N kernel_size=3, padding=1)- c1 e% P, d) V! R
self.expand3x3_activation = nn.ReLU(inplace=True)
' x& n# G, C9 a! V8 L3 u& K$ X
) P6 D* M( ?" }/ B+ C! n def forward(self, x: torch.Tensor) -> torch.Tensor:
5 I. e }5 A3 T" B x = self.squeeze_activation(self.squeeze(x))* b3 N$ c' c, J1 P! v! ^
return torch.cat([: c* n( R5 x4 w2 ^; ~2 k/ R8 _7 A
self.expand1x1_activation(self.expand1x1(x)),, @1 \ H4 U6 o& [
self.expand3x3_activation(self.expand3x3(x))4 y c/ k( A( M9 S/ q
], 1)2 n' b5 ?+ `, ~1 W8 e( F2 ^0 Y/ B: ]
) s2 l( C4 V; v1
) L4 G7 i+ P6 L; K+ S& A2
; S* I7 q; }% I3* z }5 v! a3 `% U- D
4
- a. M( m+ ]7 i- R, k5 A: Z- _( l5& o7 r6 c5 t! q$ l" l' C1 u
6
# z5 o, g, D' V; E7! i( ~" I. I+ G) P) b
8
/ A; V/ ~3 d( n0 c7 ~- p! p9 o9
5 G: ^+ i. U% z# I10
6 I6 B: x( r0 S, s1 E0 `/ }5 N( f117 i* q; p; @$ \- L
127 I0 C _/ t+ ^2 I1 k8 k! M& S* n
13
# r( |" J% o0 z. p8 `: _% n140 }; \5 ?- f1 ?$ M$ D
15
3 Q, j2 T/ s7 d2 f1 r9 }" t169 p) |- d- W7 H5 c0 d0 |( x
17' k2 E2 ]+ m6 n) ]3 I0 F5 P' m9 l
18
! `1 x! P0 X3 z+ w* z19
9 c/ Q9 f0 a; R6 a20
! x b! t' |1 b2 R: h* ~. d A21
3 R2 g( [" v8 J- n1 F; {22# S) p6 w' [6 D; U: S7 C, _9 l
23
1 a+ |5 X7 H0 V' j( a- \6 m: u24! r& L9 Z4 `5 o
25
3 w1 S1 P+ n. s5 f% Y0 o26, o$ G8 W& U, R1 R
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。( [/ `; n/ E6 @: w% J1 H8 E, G
l h/ ?% j6 @9 C. ?
SqueezeNet1_0的网络结构如下:; {) g+ L! i# P' I: B
$ b- G! ]) x7 D* Z& T t8 B w' yself.features = nn.Sequential(: L5 H0 Y! x0 b9 V
nn.Conv2d(3, 96, kernel_size=7, stride=2),
, _) Q& l l0 q nn.ReLU(inplace=True),
% X2 V! {( A' y* ~+ E nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
: Y* w! w% D- A0 K6 u7 V" f# ^ Fire(96, 16, 64, 64),7 ~9 A9 H( m$ a& Y* J' q3 ^8 W
Fire(128, 16, 64, 64),3 j4 F4 t% S1 m
Fire(128, 32, 128, 128),
* s; w$ O- |. c! E } nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
& v$ T1 s% ~; v Fire(256, 32, 128, 128),3 e w x2 x% w- ]4 G1 ~
Fire(256, 48, 192, 192),* W$ q, E4 ^3 t) V: I
Fire(384, 48, 192, 192),5 {5 U! s: @- r8 F( r" z* [
Fire(384, 64, 256, 256),8 m% L- Q, \# i7 S) a: h
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),) f4 q F0 m; e" \% O
Fire(512, 64, 256, 256),
f- Q/ R: a9 Y( }, o$ j5 G)
2 Z# t V/ O5 T4 W) s8 K1 z; J A8 [final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)+ D' G6 i% n3 X% p$ u3 b. P
self.classifier = nn.Sequential(
0 s) F' p. U( m$ i nn.Dropout(p=0.5),
9 F5 ]- W- E+ q& ^0 l$ _& G U/ p final_conv,& e& X+ i6 x; n. T
nn.ReLU(inplace=True)," |( @% S1 } E
nn.AdaptiveAvgPool2d((1, 1))
6 a: o' h K H8 x+ U/ @)
7 i6 ~" T/ M$ O6 q7 X3 F) @+ P! U$ i5 p- t3 F& ^3 L0 e- E
% v9 B9 D3 i4 y
1
y, I+ p- g5 l4 Q7 I% g* f2/ h& a d3 Q0 W; ?' H& q# X: z+ U
3
5 J8 s; _9 Y3 a" ]9 n) K4# e$ M% S$ m9 o7 e
5( ~$ I* W. p' C; s2 K ]; z
6
3 y9 R: ]: ~. w9 e7
$ S3 D/ A6 a z p3 k( O9 }0 V* T8; _2 X y) S, R
9' W6 @2 l8 e Y4 ^: q' z
10/ j/ w3 A6 K) b( n% t/ j
118 I2 {- r3 z' j V
12
$ g) ?. }% e h. @13
7 @' L6 [6 @( a14
( M, d$ Q+ R& H& {15
?+ y. ^4 {) ^5 l; r' B: y16
! X. X, ^; B" B$ A9 I2 G% [17
' [) J! C2 n5 q8 o. u186 I! r7 l" A# k8 o
19
9 l ]' n9 @$ Q5 k D20- x: k. M2 F/ d0 L. o+ e9 D
21+ q7 f$ L& y0 |- R6 D$ ~
22/ k5 J* ?: |+ w2 m( H$ m( |
23
; n* o0 d2 H' u9 _SqueezeNet1_1的网络结构如下:
& S: i$ w$ |( ^1 G$ }9 o( t4 j: z" `8 n4 o# [7 ~ R
self.features = nn.Sequential(
N# O7 \0 p- N0 o+ _+ f1 [8 a# c nn.Conv2d(3, 64, kernel_size=3, stride=2),
! v; @+ {3 S, Q- K4 a6 B" Z nn.ReLU(inplace=True),
4 F0 E% v/ j. ^7 l: }, E nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),/ B7 B6 f* g2 G/ p( J
Fire(64, 16, 64, 64),
% K$ b& Y* q/ b: P- {2 B _# e9 N Fire(128, 16, 64, 64),+ U$ x/ _1 K9 C$ T8 m
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),, c5 ]9 t# ~$ I0 Q- l: w' G
Fire(128, 32, 128, 128),
0 u# @' @; ?, N U Fire(256, 32, 128, 128),. H0 Q3 |. @3 E; n1 A8 i) E" s" D
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),+ k$ j# ?) o( m# {" [7 u
Fire(256, 48, 192, 192),0 k, V4 t7 D/ ~( o/ B) u
Fire(384, 48, 192, 192),
6 W) k& R. i- x2 I6 O& A8 V Fire(384, 64, 256, 256),8 S# F$ ^: v1 D1 d, `# `! \/ h3 Y
Fire(512, 64, 256, 256),
& O% b. ~( H5 |5 |): `. E3 W3 Z' K
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)& ~7 G8 D9 P6 P% c8 V
self.classifier = nn.Sequential( ]" L1 u. ~# ]( Y( T
nn.Dropout(p=0.5),
; u W9 f r8 P! z# U0 _1 t' t; X final_conv,# S% S1 `" K7 { G
nn.ReLU(inplace=True),: w W$ J$ u* v1 `7 Q
nn.AdaptiveAvgPool2d((1, 1))
8 q _8 {7 P1 J2 J# v/ m)
1 c: O: v7 b- H" t+ p! D7 V- y. l c- c
1
6 f: ^4 J" U1 X2 \8 d% @2
& y8 i: C: Q4 z( o6 \+ K. X9 M- j3. |$ x8 |& |: K; P# u2 s$ v2 R
45 O' i; P: r5 H7 M2 |6 Z
56 M& _& A: V! X: Y, I# [: C$ g0 B
67 J) i% } F0 c, e9 L
71 i! T) S5 t. a0 J( q) C( d
8
2 @! z0 O* o! I; V1 T7 c9
- f1 E, I1 ~$ ^- b; o103 y2 }# |$ t8 F# h5 A; O1 p
11
! L: s- s: q3 s$ X+ u# o+ M124 e( i7 b0 b! T4 \ V, N
131 G6 d4 _6 z6 E. U& @ w1 m
14
+ e- t" V' |0 n2 W; G' L* U15
4 Y# ]5 N: |' ]7 F1 K16
# W+ g$ z& ~+ q4 I# H17
^4 s( j; w4 d+ q185 m# E. @' U3 Q: d2 I+ J
19; C- ~ R/ G& Z+ V4 t3 y; \8 D
20
5 J; [: i$ N3 G( A, p4 q9 C, n21' ?* V6 o" m) U V
22
! Y' C5 K4 `9 ]8 x2 g) y, |SqueezeNet各层详细参数量及其输入输出如下表所示。2 i# D6 M/ y: a- _# _
# d; J- \2 K$ W7 }5 C( D' G- |" S- O( @9 R9 x+ }
4.2.6 其他实现细节# y' I" u4 G7 h* H4 R( [6 f
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
. ]6 l0 W2 A" Z/ Y/ Osqueeze和expand层中使用ReLU
, v" l) s9 Q" w+ \* z在fire9之后的layer中使用ratio为50%的Dropout
( l2 {% \" |8 s- D* S) {. I' i. G% ]参考NiN算法想法,SqueezeNet中不含全连接层5 k* u# O+ H$ \. h4 W7 k; e
训练时,前期学习率设置为0.04,然后线性减少
0 f! w! [4 n' x) h- w% q% j4.2.7 总结
% c! L5 E8 c$ i8 m! _/ h+ U9 @本文最主要就是三点:
: P! o! N, n% i4 f z( X6 X* ?0 Q& H6 X* p6 e+ h v4 F0 y4 n5 N
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
. w8 A, g: q, Q# a减少输入到3×3卷积的特征图的通道数,减少参数量/ O# ]( y' Y. d1 _/ B! C
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率' u* A9 [' Z4 U0 d# }
————————————————
& I# f9 G; H6 l V版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
' V+ L3 @+ G4 e: s e" w. }原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100! v. w2 B% t; A
. ]2 f. f2 q) b6 m" S
+ f+ l$ q5 v, _7 _" W e7 @
|
zan
|