- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563316 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174218
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
1 B1 f; |$ Z* k" y- Y
轻量级神经网络算法-SqueezeNet
, [2 }+ [" @* T& G7 R4. 轻量级神经网络算法目录3 B% d1 o p+ W
轻量级神经网络算法( N9 S0 L4 E, n j j
4.1 各轻量级神经网络算法总结对比* q7 z. `3 L. D( C9 |+ k2 g" ?( f' w
4.2 SqueezeNet: Y# o6 P/ `2 r' v# ] s
4.3 DenseNet1 n3 a+ y4 f4 Z8 ^0 n0 K! e3 q
4.4 Xception
; U5 N. V% v6 u6 f/ u- `1 t1 a8 t. ^4.5 MobileNet v1" R* H ]% j& E% d8 \! `: b/ R
4.6 IGCV
+ Q I2 |" J! l) V/ p% q4.7 NASNet
, j0 ^. g6 i, x3 o: U- D( m4.8 CondenseNet; X2 [% c5 ? s* K& j& W' U
4.9 PNASNet
. K: C4 t$ k9 v1 Y9 C7 @+ G4.10 SENet
! A$ G- ?' }& m* N ?5 o4.11 ShuffleNet v1. |! P0 E! p/ a, r% Z
4.12 MobileNet v2" r) s2 ~9 M" R6 I
4.13 AmoebaNet
9 E3 c3 X; x: {6 O4.14 IGCV2
9 `5 \( J5 |& V4.15 IGCV37 p# v* ^+ \4 O8 @
4.16 ShuffleNet v2$ i3 i, } x) _
4.17 MnasNet
* a; H% D8 Z- n/ N6 ?4.18 MobileNet v3* d2 { {7 x) `3 G9 ]. R9 b
深度学习知识点总结! C- P4 ^5 ]3 n8 B( ?& u
' t6 C# X8 u8 Y( t' C' B# V8 ]专栏链接:/ t" E2 W: W( K
https://blog.csdn.net/qq_39707285/article/details/124005405: [& L# c* }4 y6 B: q
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。! E# Y+ M& j( }; f+ O( v T
: I6 ?# T( R8 c# p$ r7 E* [0 O本章目录
" w; X; L+ j1 F p9 }4. 轻量级神经网络算法目录" K7 e: \% L) N( |& I
4.2 SqueezeNet$ o5 M0 V6 }, P0 j
4.2.1 问题分析# Y8 [ V" B3 P# }1 f( F" G
4.2.2 SqueezeNet的三大策略+ z% p. a: P1 @$ H% [$ A2 [
4.2.3 Fire模块
3 Q4 n- G% ^* j: V( q3 h0 A# }4.2.4 SqueezeNet整理结构# l W$ ^2 }- U; H/ @$ v Q* j
4.2.5 代码实现SqueezeNet2 Z! W" x$ x: Z6 s) \
4.2.6 其他实现细节2 u8 T$ o l8 s/ c- t9 e
4.2.7 总结: A& V! S7 c$ L. y3 P
4.2 SqueezeNet
! h" o7 y1 Q2 i- n: i0 ~1 \) b4.2.1 问题分析; H4 ~! p; c" c- u: }) N
最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:( f9 n& g- t0 x/ V4 Y. \7 T
7 G: V" R, y4 H4 S& E9 c6 @
在分布式训练期间,较小的CNN需要较少的跨服务器通信- I2 ^7 C3 P; E; a
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
2 Z: ^8 Q# d! [) b" c2 e# C较小的CNN更适合部署在FPGA和其他内存有限的硬件上
6 T% a$ E% L& y' ] g为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。- Y4 R& N2 R" \2 t* R a9 K4 r
3 X' ?9 J$ s3 I
4.2.2 SqueezeNet的三大策略
' [ o5 q: `8 F5 l. K& R策略1:用1x1卷积代替3x3卷积
1 Y) y7 @' @9 ~$ M1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。: Y5 r2 e( _. o1 z) y `8 N( B
4 x; Z$ h0 A! W策略2:减少输入到3*3卷积核的通道数量- Z1 F+ }) t& [
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
+ h2 q) \) h' F& }) f7 {; }# \% u0 u+ ^/ M/ R
策略3:在网络后期再进行下采样,使卷积层具有较大的激活图" u. S% l2 _* b+ 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中。' L+ M2 n+ R1 t$ g
( n1 `. B* c% P! A( j5 p策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。
. S. j: S& `9 O% R0 e- t. z+ y% F7 J$ p4 W' h$ ^9 j' B! K
4.2.3 Fire模块
) u7 p" k6 H6 R: o2 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的想法。
# m% Q2 C6 e. {
4 m, d; o3 V% s2 f: Q
+ S6 {* ~& L# k2 d3 d, C: u8 i4.2.4 SqueezeNet整理结构% p. L5 J W( _9 E3 g
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。3 B4 ?8 W( Y( x- }$ \' q+ `7 I
1 p3 Z- D% Z* ~* b1 G! q* p# Z5 H
# v2 [. u7 D, ^/ N, V* J4.2.5 代码实现SqueezeNet3 w( J* z, m5 g. v7 Y5 Q: n6 z
Fire模块的代码如下:
. {( I& y9 d- ?. o
/ W( ?% f& T" kclass Fire(nn.Module):) S5 b) \7 t7 ]
/ e* D9 U7 e$ q( s' r4 v def __init__(
, }5 l: L& v4 t) _9 b. z% Y self,; a. O' c; s' _) H. L
inplanes: int,
& B9 y' Z( D, U- j. ]9 b% E' \ squeeze_planes: int,% C4 `; {1 B) R1 ^2 i2 W% Y* f) L
expand1x1_planes: int,+ H, J7 f& r( p0 O$ S$ {
expand3x3_planes: int
: C7 u1 \' o* ~# x/ t; P ) -> None:% d& ?. @( [& u2 {$ |
super(Fire, self).__init__()
% u' m& o/ `" x9 D) R' d self.inplanes = inplanes0 e8 ^3 x4 [, ~( v) M8 c& s, h
self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
! B2 |! K4 Z F" T x, o self.squeeze_activation = nn.ReLU(inplace=True)
e K4 i' T5 g" ?6 W self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
3 P( D7 k' @, x kernel_size=1)
$ U/ D4 | u6 v% r self.expand1x1_activation = nn.ReLU(inplace=True)
$ W o/ C' s" W self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes, z" x& f+ R$ p& d! W
kernel_size=3, padding=1)
4 g1 O! Q2 Z0 Q3 o" _/ | self.expand3x3_activation = nn.ReLU(inplace=True); ^+ B: S+ q8 ?- x% |
9 z: @, v, T, c' A6 W* ]3 { def forward(self, x: torch.Tensor) -> torch.Tensor:; ^$ K1 J6 ]5 x2 Q8 i
x = self.squeeze_activation(self.squeeze(x))( g( Y2 ?. ]: N, Y @
return torch.cat([
' [/ U- k/ G; d: Q self.expand1x1_activation(self.expand1x1(x)),
1 ~& d5 L1 B' c; P! n self.expand3x3_activation(self.expand3x3(x))
. k! m$ U! h5 [) t% k. C8 v ], 1)
' w M( m+ w8 _ B6 M7 Z$ t
/ s/ j ]+ U S1
2 I0 `3 ^- c8 Q, p; ^ ?% y+ l2$ C0 F; c9 w7 {+ s; I
3* q& V# l6 p0 ^- V! I
4
# |% x: h& u5 D) ~/ t& \0 w5
$ H; A+ e7 ~* b* ]( g6' z1 r" ~/ m4 [# a) i8 K
73 f( T1 o' k2 {: w$ w; v8 z g
8
! i3 Z" L4 k, l9
5 r- o& c8 S5 ?; l102 o. X4 I# ]; v6 M6 D, [, O
118 N( |3 c6 A8 G" {) b4 b
12
! S% }. w5 S/ }! j13* u( X5 X0 V9 ]) F7 Z: E
14' g2 o# z# w! s. @/ m! L- x
15
h/ O. S3 m1 P) J16
; u q0 `* P8 z17
6 Z; o1 c( r; w18- W8 v9 q4 j% X) d& ], Q( g/ a
19
3 Z* u$ t, f% O% b, A20/ x/ x/ X4 k8 J6 D+ M5 g
21
: M7 |0 j, D. E/ B: f" K0 I# _! N22" I2 D5 x, q2 C' R- F
23! I' T1 c+ q0 w) H! y# s
24& U; A) e' y) `( u a
25! Y9 X: r, F( z
26+ k p1 Y/ \2 P* W( [& v' H7 l
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。4 j9 {1 x9 g! T2 O
; r7 X: y' z* a r
SqueezeNet1_0的网络结构如下:
9 i* [$ Q& Z, n. [& K5 i6 W+ O8 Q8 Y+ \$ V0 f1 _
self.features = nn.Sequential(
: G {' N% z7 t; g! x3 t: Q1 S nn.Conv2d(3, 96, kernel_size=7, stride=2),2 K" x- n' E& a4 k
nn.ReLU(inplace=True),
. c: ~$ B1 g0 v; d nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
9 f6 X- s8 Q- ]( Q3 q4 g% O Fire(96, 16, 64, 64),; J# t8 H* }% Z, D+ |
Fire(128, 16, 64, 64),
O0 ~4 f1 @- r1 @5 d+ O3 _ Fire(128, 32, 128, 128),
/ N$ k; u5 i0 q) A+ L$ B9 ^ nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
c( x$ I9 ~7 z, C& S Fire(256, 32, 128, 128),
" o3 f% X& }0 Y3 h( t' L Fire(256, 48, 192, 192),! D! v0 s+ b! {! R
Fire(384, 48, 192, 192),
( U( T* p" S. x8 T. ], k4 d0 D Fire(384, 64, 256, 256),
( y Y/ n0 p( M8 E) t nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),6 L; C% [) X# ^, f$ A& X) H
Fire(512, 64, 256, 256),
9 T$ y5 v3 {5 ?6 q/ E# x)
* g3 L6 Z1 P4 ~- pfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
) A' f( C$ Y- ]self.classifier = nn.Sequential(
o0 g* e' ~: ~( o7 w+ j" d nn.Dropout(p=0.5),
* N4 o: |$ { U1 G5 U* O final_conv,4 \8 j( T0 ~+ C, R @
nn.ReLU(inplace=True),1 L8 S6 R- i: k7 e4 D0 x: A1 t
nn.AdaptiveAvgPool2d((1, 1))
9 M6 M# j7 D7 `* g- b)& ? v$ `0 ~1 P* Z1 r) K, p2 W, K! M
' c; G$ A4 F/ c( I6 u: P
, ^3 L8 \/ u( {, m* k5 g- w8 ?' ~' }
1( l, y {. u3 V
2% h5 _ Q7 S) U# w' l
3
/ F$ F+ a; O6 T8 M2 x6 k# b4" w7 R* y) K' }. ~* c
55 a2 F$ x% {, n; j# U+ j
6
" i8 f9 h/ a+ r* ]/ M" }' f' I7, k. s0 n, i% F
82 g4 b @! m3 E9 O& ]) P
94 [5 k" u, @& x! H) o4 _" _2 U
10
# w0 d, B8 c* O0 M4 ^112 I& ~! r' V. g
12- J6 q+ X0 o- z2 Z" l1 l
131 A+ ]7 r0 \3 V
14
" D2 Q0 w) r1 p/ C n15, g& m4 @3 {% K7 K: R
16
6 [6 \9 g1 w. j. G4 F2 Q9 Y17
; Z* G. E9 b0 M- f/ Y& C7 W189 T) h! ~, F5 E; [5 L+ x
190 o$ H& X; V) b* W2 N
20
% E! M, v" j& E4 I' p9 A# v21
: c* q& @9 C7 n) w u22
s! @* m; l9 u3 z) I4 B233 w& ~6 P- _, x& A$ C! R; C
SqueezeNet1_1的网络结构如下:
4 |( q( v4 x# y% h' D3 l! |6 t* i9 ?) {& L- Y5 C+ \0 A1 B3 G" _/ O+ s
self.features = nn.Sequential(
4 s! h( d) x- m& a0 ~9 _7 ^ nn.Conv2d(3, 64, kernel_size=3, stride=2),% C5 Q, ?" N2 }% A
nn.ReLU(inplace=True),# [9 U' j. \3 c6 e
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
. T9 a) d% P* X# U+ n. z Fire(64, 16, 64, 64), ]/ b" ?$ f9 }$ z, y/ z9 D2 j
Fire(128, 16, 64, 64),% |8 @, t o$ _7 d: _& f) M4 K
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
( s0 {, S% N( P7 A" s$ h0 ] Fire(128, 32, 128, 128),4 f6 }. B0 V( k T P, y
Fire(256, 32, 128, 128),
( t' f- a4 `; w. J; } nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),, y5 L8 ^- |0 [- \8 N
Fire(256, 48, 192, 192),# O& g1 p; d" G7 j# L( F! j
Fire(384, 48, 192, 192),
# o! y9 D6 ]6 q Fire(384, 64, 256, 256),
- P% s1 q- |! C5 I& g8 o3 Z Fire(512, 64, 256, 256),
0 {% _5 H+ Y t8 [- J)0 m+ R \# d5 e
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)7 q+ p7 r( t$ C
self.classifier = nn.Sequential(
8 }/ c5 z- ]* Y$ C2 D nn.Dropout(p=0.5),, ]* \5 d9 Q- T- ]) q V
final_conv,/ r* {3 G6 a/ s; D
nn.ReLU(inplace=True),
( ]6 E/ R# @/ z) K nn.AdaptiveAvgPool2d((1, 1))/ m K& C; O, ~% J' n) T; P" t
) k# M4 @2 y4 J0 W3 h
% J( p; K6 X; s+ u1# g1 O4 z5 B a3 ?4 x" W
2
3 ^. i* \1 ]& {! o$ V0 s7 m34 [+ G; Y! {0 i6 [" q
4
" u M/ R$ Y, k; M$ {5
8 s( v" m, P, v3 v7 D6
& i" \/ b& V0 W6 P4 H- b5 G7
" E7 K1 A6 n% B- q1 ^$ z& h+ c8
9 G" k+ o) M; w- W1 M8 Q b- d9
, A+ Q1 z+ W: Z% Y10
7 `# Z+ x% Z0 O116 Z7 ~6 E4 g3 l5 J8 u. q3 D0 S
12
" i% `% i ^) r7 G/ I13
$ t% k3 b/ m8 f; A- H6 |145 u5 H: o2 ~4 I5 Z- g" i+ A1 {
15
# ?: [7 n4 N/ t4 w7 R16
. l3 T' D5 F' P( u17
{$ C. g- r" ~1 _* L18
1 q: `- j, C* _, ~4 t! j19
8 v# q% U$ P: A9 ~1 W$ W+ g$ B202 N# b5 }3 ~# M g, H3 z
21
3 F' m% y1 L2 \: E22/ Y/ x0 ?! `1 D4 f
SqueezeNet各层详细参数量及其输入输出如下表所示。2 e; x4 U* V- }* K J
/ [# b) y& O: r# U9 i" |' i5 q9 K( l) a+ k5 L! s
4.2.6 其他实现细节9 U) w/ r# g9 g0 D
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
7 ]; ]/ p2 S W" ssqueeze和expand层中使用ReLU
9 z# ~7 d E+ E) V' q9 {在fire9之后的layer中使用ratio为50%的Dropout
: i5 c, }# v2 v* H. w# N参考NiN算法想法,SqueezeNet中不含全连接层
3 p: A+ O$ n; @0 c# x训练时,前期学习率设置为0.04,然后线性减少
7 k* V& d' X7 s/ V5 Q4.2.7 总结
, ?( B7 @5 R2 u4 v5 u' W本文最主要就是三点:
) x" p3 ]0 I0 [8 q( B" U# O3 t ^( b4 X
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
7 H k! i* D& G( ~% _减少输入到3×3卷积的特征图的通道数,减少参数量5 S( e2 G1 M: u6 f
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率
4 |7 }& v& X5 A————————————————
+ R' I' ~/ c1 O( a& U- K, {版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; _) `0 h$ @8 |* Y6 z4 T
原文链接:https://blog.csdn.net/qq_39707285/article/details/1264981001 g; r. Z3 o) d$ I# z$ x
6 I9 V2 {# y4 ^
9 J+ `: T1 o: N1 i8 {
|
zan
|