- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566251 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175098
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
# K1 N% |* E/ I: A轻量级神经网络算法-SqueezeNet
1 \2 v( m& s$ {4. 轻量级神经网络算法目录9 m" V3 G+ b# g$ p( N
轻量级神经网络算法
; F! A; @- x" `* h5 V" I$ \4.1 各轻量级神经网络算法总结对比# ]8 j) [+ O& O2 v; _2 O0 J7 y
4.2 SqueezeNet
/ r9 L2 `8 A6 }8 q7 y4.3 DenseNet
/ r6 B h0 ^, K$ W! O& p4.4 Xception& W6 `( ^4 R1 {
4.5 MobileNet v1; I, ?2 `) [+ p9 N7 o
4.6 IGCV o) J; ~# c" \# m4 g/ f5 i0 J
4.7 NASNet5 ^2 r E. ]: W
4.8 CondenseNet
7 K7 Y7 D, Z0 `+ l4.9 PNASNet
& F7 z7 S: a$ o( J* Z; G4.10 SENet1 @9 g" X) T& T
4.11 ShuffleNet v1
" K1 Q& o. Y" g# u; \, X4.12 MobileNet v28 N+ {3 y4 w* O5 Z$ n S7 J
4.13 AmoebaNet
+ r) Y8 r7 F. u) {. q* d4.14 IGCV22 M$ n( v8 D. J1 f, M
4.15 IGCV35 f+ |: | G4 P0 n. P) S
4.16 ShuffleNet v2. m( J0 v+ D8 E
4.17 MnasNet
# l3 b9 M5 \# u$ p5 @; H: ^0 x7 E4.18 MobileNet v3
2 t7 ?$ B! V& T深度学习知识点总结" e |8 Z, v2 K4 A
( w# H! Z6 J. e8 \) m0 e* d
专栏链接:
+ p* a. t. b# Z5 J5 m, s" A& Qhttps://blog.csdn.net/qq_39707285/article/details/124005405
% e* r. F6 P! F- j本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
8 w5 i! e& c: `+ L' P9 {& q: z* | U. i7 |& J
本章目录
7 \8 |+ Z" A4 q8 E) O; |4. 轻量级神经网络算法目录
% L+ m+ m" S: `1 N( X2 e1 h$ K4.2 SqueezeNet1 P: U; k+ |0 }, a
4.2.1 问题分析- L c4 {( ?5 g" J
4.2.2 SqueezeNet的三大策略
?/ x5 }/ U1 R! I o4.2.3 Fire模块
$ V3 y4 P8 i" f6 m3 F, U( C4.2.4 SqueezeNet整理结构
* O. d+ p! t% H7 i6 z4.2.5 代码实现SqueezeNet
2 T8 Y+ T6 }% @# R# G3 O4.2.6 其他实现细节
" E% T# R1 l3 U$ t0 S' U4.2.7 总结
5 S$ D0 f6 w. z( Q- \4.2 SqueezeNet
' e# [/ r b* p8 g! \4.2.1 问题分析) ~" B2 _, ^3 f1 N2 X
最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
/ t( y5 h& Y$ J
/ H% q6 k" `* n& W* S; r在分布式训练期间,较小的CNN需要较少的跨服务器通信' w* C% n0 b9 b5 Q
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入
. W. E7 u% e2 p; j5 @% Z0 `较小的CNN更适合部署在FPGA和其他内存有限的硬件上
( p/ l S( A2 q3 U为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
5 M$ w+ E; r# k: V
+ j! Y8 a" b. u3 X* R4.2.2 SqueezeNet的三大策略+ T& _3 n# i" Q+ N. i/ i
策略1:用1x1卷积代替3x3卷积
! R/ Y/ i" o# l9 n" A1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。& p# K2 g8 x8 t7 C3 ^; |' N) t
7 G. M. l+ Z3 I5 ?" `! h% @+ T' N策略2:减少输入到3*3卷积核的通道数量
$ b( P0 f% C9 `/ W8 j对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。
) K. W2 [8 ?# K% s/ C! H' ?$ j/ q; l/ J: ~1 \" ?# V; s/ e# d9 ^( Y
策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
6 d. _8 l& Z ~: z D$ O d3 n- L6 _这里的激活图(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中。
, J2 C( Y7 W4 r! p- }) x
5 O, F% B, W% Y4 V策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。- R* z) O/ @- B9 j4 ~3 [
( p* }# Q! d9 `" \$ d& [4 {
4.2.3 Fire模块; a5 ?" x; B; x, X; Z" P
为实现这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的想法。% `, `# s$ H! l% d
4 G9 T' C$ V. C/ p$ `
" O( h: A' Z7 [. Z* |4.2.4 SqueezeNet整理结构
" A7 s; P8 f8 M8 V& cSqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
8 l# D8 [6 B3 G. ~' m' P4 M1 y# r' R- d6 v' y
, |0 e: K/ G6 K r5 W& a5 {4.2.5 代码实现SqueezeNet" n/ v7 ~8 |6 I; r% j4 ~, L
Fire模块的代码如下:8 ^5 n; ]7 V: x4 t4 l' P0 |8 _0 `
3 o& s7 F' P8 R2 }/ Fclass Fire(nn.Module):; r3 B) ]0 L8 H* y
; e& N2 w7 F* C+ M i% K1 x/ Y
def __init__(
, c, k% u9 q2 ^, R6 o3 U self,
& ^$ T% r5 z, R/ p inplanes: int,
/ i% O) A/ D4 P6 c) `, B squeeze_planes: int,- I5 A: L5 E) ]6 a; O$ S: h
expand1x1_planes: int,% u/ d! N/ v0 n, M
expand3x3_planes: int. [: U6 C9 M6 L! I j. x0 K
) -> None:' |* z2 x8 X3 u' S3 q7 k
super(Fire, self).__init__()! \) k- a) |8 K& T3 m# O1 K- ~
self.inplanes = inplanes
3 k. r9 I$ C/ l: t self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)
, a4 j7 p; R5 K self.squeeze_activation = nn.ReLU(inplace=True)0 Z- F( }$ D, V+ d& p& ?+ ?5 U
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,+ J5 y. [3 N" e
kernel_size=1)' V6 r4 J6 m' I! f/ a
self.expand1x1_activation = nn.ReLU(inplace=True)7 T/ w+ I, N6 g! r! Y
self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
1 E% h' G& x2 n3 o( C# K+ {9 A kernel_size=3, padding=1)" Q6 B- ^: {0 H8 k4 v0 n
self.expand3x3_activation = nn.ReLU(inplace=True)6 e# k u {( L+ x
0 z# ^* j' R' u7 U
def forward(self, x: torch.Tensor) -> torch.Tensor:' n: j, U3 G( r3 ?" W
x = self.squeeze_activation(self.squeeze(x))
8 w& V' f2 P; x. ^9 X return torch.cat([ Z1 V1 L) Y) @/ F! n% j/ B- D
self.expand1x1_activation(self.expand1x1(x)),
* a5 V' a% y& t' |8 L7 y1 M self.expand3x3_activation(self.expand3x3(x))5 o9 }; d6 X; t2 e( T9 q! x
], 1)
, z4 y4 ~- p7 u/ S& d; Q2 @, \* U0 W1 j, N- v0 C
1
7 V, M2 w% E+ `! I- `% v0 x- f: f1 o2, f( S7 S! {/ k# G/ S
3
5 A# s5 D% |3 \. y3 B4# `' [1 q) G3 n _4 V
5
% ~& R' Y& W/ K8 E$ Q7 U0 ?6* g; `1 H, ^/ U' u: `
7
5 n- j% a! L: T8
) t; C4 a3 R/ K: `9
7 l6 f5 {* E0 A; [8 `* A$ S10
7 s$ e- y6 ^+ u5 e0 e) L4 K11- o: v N( s( @
12
w. i K& I0 l( G! Y9 i1 i13
2 O( s/ G. ~# l5 N. s% O5 K) \145 l2 q1 h7 ~8 P5 S$ @
15. g6 A) B( K1 W, p7 ^# w6 c) _
16
0 o; U! _ O, Z17
3 T. b; m. k) d* r' u180 W/ {) Q4 G) l: ~( ]7 c
19
/ ^: Y. i" `4 t$ w$ ?/ @208 g0 Z' T9 a* [! }7 H1 d' [8 t, @
214 O! H: b; u) f% P. O- F
226 s' K+ R9 \% c) U$ q; N, e1 ^
23% j, Q1 n$ J+ t! W5 i7 x3 M
24
% o- P; q1 [5 L/ p; u. W0 T4 S25
+ b! k& l! D# B* Q& e26, j$ e$ A( A9 p4 x I
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。; C; @; W/ e; o. [$ i
& b* L$ }6 P7 I+ Q3 Q3 f D1 x
SqueezeNet1_0的网络结构如下: i+ q0 m" K$ D2 h# e+ G& b
) p5 `2 L {( j, @' \7 i8 V) jself.features = nn.Sequential(
7 r: c( ^: W# F nn.Conv2d(3, 96, kernel_size=7, stride=2),
1 R: k7 ^- T# H: O% [0 Z nn.ReLU(inplace=True),) X4 d* O' m4 p6 U$ l& ^
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),. o, @: k% I, a5 u
Fire(96, 16, 64, 64),
; y6 U& v( k) O3 n Fire(128, 16, 64, 64),
6 z( T( k5 Q5 J/ ?2 e" ?5 y" t Fire(128, 32, 128, 128), [! N+ S7 }' `4 f
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),( {, Q9 A2 e# B3 V% i/ ~- x
Fire(256, 32, 128, 128),% b5 i4 W& b4 B" m
Fire(256, 48, 192, 192),
* a K# w2 E/ b0 b0 d Fire(384, 48, 192, 192), N2 n, S2 a% o9 n
Fire(384, 64, 256, 256),& y1 Y2 Y7 p8 ~" B
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),& j6 m0 B( e$ E9 V+ _ R" ^$ Q2 U
Fire(512, 64, 256, 256),# e2 t3 h2 L/ X8 |4 p
)
P. Q& Y( M9 ^. E7 `$ Ifinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
* b" N" y2 r* b+ Nself.classifier = nn.Sequential(+ q4 ?5 ?! T& n( N& I0 I( V0 m! }1 \' y
nn.Dropout(p=0.5)," P" `9 q# ]7 R1 ~' V/ M2 P
final_conv,
& v: K4 Z' A' P nn.ReLU(inplace=True),( `% j" D8 r1 p1 `5 b
nn.AdaptiveAvgPool2d((1, 1))
# `7 V; i | ^! d0 O# W)) A6 h8 Q. `+ h5 x
) o" \$ m8 B2 @ ]9 x, v' Z% v
: b) y/ U# k4 z& I I
1; p3 N1 e. c& b( d
20 }9 l8 i( g1 O
3) u& I' `0 f. s( l
4: x) o; a* `; ~0 o9 e ?6 Y7 p
57 e; r. U0 [7 D! r
6
; \0 \. G; E/ l6 J7 ^$ G2 _- |5 ~5 @
8
2 w% g1 m9 @, t' i" b9
; ~) ^8 U7 ]5 J- @10; Z# R9 x8 @ L% G5 X; K
11
( [' Y# X! `9 w4 `& P/ B+ j124 s) O% s2 p) D: ?: I% v
13
3 a4 w9 v7 A4 t9 Z$ a- v14( \3 F9 ~" h @2 y$ g
15: L' A2 ~ u! H* j
16
0 h$ C6 w( ^5 g0 U7 ^17
2 S* D! K/ ?6 w! c18
. J/ Y; P: I8 O3 l6 y. x198 M5 K4 Y! a" F
20+ G4 P: r& _' G! A+ _" J* r( B
212 ^" p1 ^) P5 q* _
22
! v8 x+ D: j+ e: ?& |) q238 A+ \; l, `/ A) ]) l' _) u
SqueezeNet1_1的网络结构如下:
* v" x0 B4 y' c: p. N3 Q- A1 P0 j2 v( X9 D, T- c6 K
self.features = nn.Sequential(
) L5 b5 A! _5 R* ]) `2 J3 w nn.Conv2d(3, 64, kernel_size=3, stride=2),
" m" B/ N+ B b4 h b nn.ReLU(inplace=True),8 O5 B! M- m7 j4 J: Y9 R) K
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),6 T. X4 v1 p" Z: J: y- e5 H
Fire(64, 16, 64, 64),, L1 o* p+ t$ v( r! M/ T4 v
Fire(128, 16, 64, 64),
6 v2 J% r: b5 B' |* F* C/ y nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
! b2 p% Z/ B- T' ?0 [: m Fire(128, 32, 128, 128),0 C% _; e# M8 z3 s! @" D
Fire(256, 32, 128, 128),
; v* r; ~3 T/ B5 ] nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
7 G% z& s, n- k& J, C5 l3 v: y Fire(256, 48, 192, 192),/ S8 ]4 i/ S2 p+ } F5 ~6 t# w
Fire(384, 48, 192, 192),
3 d& h+ `) X1 {3 I& m, u Fire(384, 64, 256, 256),
8 L! @0 D( F: V6 K Fire(512, 64, 256, 256),
& _$ M8 _* ]& P( Z" Q)% C1 T i8 R4 ]+ O9 k( P
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)5 R) M' m) [8 m! X2 {# I
self.classifier = nn.Sequential(! R0 ^# \, c4 L% X p( j4 f
nn.Dropout(p=0.5),4 I$ j- Q4 Q" u; U9 \" l
final_conv,# p$ j& D; E9 R ~
nn.ReLU(inplace=True),8 V4 F3 p! b" C& B" O' [. r
nn.AdaptiveAvgPool2d((1, 1))
% e* I7 J) Y0 ~9 R)- v" F/ H9 ?/ Q; @7 d! X# B6 }
& H1 R' ^+ G0 u9 _/ P# X1
5 ^+ d/ p) d/ M* c+ u' y0 E1 V2
. Q! E! M4 @- ~! o' n38 _. |8 G6 O- f5 e0 \' g3 M9 p+ D
4$ h, [2 i4 z3 l6 I4 M9 C& u( M
5/ k* a$ p$ d& u b1 C6 ]2 G9 h
6
! o Q* r. [$ S( r. r) ]! Y* C7 C7: Y: Z# e/ \* C7 s x8 l- K
8: }1 Y6 I+ j/ a: {8 n
9' I) Y e: R: i/ e
103 u8 v: i, D6 {: a+ J
11
6 I7 g% [* I: E* p4 W$ e" }12* B+ H0 z$ d) w& _: o
13/ z0 R) \7 Y8 l) f
14! c6 l' k% l* {4 q* l8 r
15
' o" l( k! E; r! r- K5 f' s. V: O16- u; e; c* w/ r' s( }) {% F
17
1 \) H6 |% N/ ]' R5 B$ C18
1 ?; U# {1 D @5 F, I9 l) o19& d; R9 d( ]+ k( J/ [* g
20
6 p! s6 v7 j7 k/ e+ ~& h$ Z21
) ~5 \9 w( ?/ p& k( ?/ t22
* D7 a* z* b/ N" jSqueezeNet各层详细参数量及其输入输出如下表所示。
/ _9 m' t( X* s0 _- S0 E( b* f1 y! F& i( k% a4 E2 l
) p: s9 A! e9 k9 S9 s7 Z0 t, t8 o4.2.6 其他实现细节0 i; ?7 W/ w C+ D! j7 ]$ g9 M
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding- v0 l4 n8 b( m. e
squeeze和expand层中使用ReLU+ u0 H; E1 f; B2 N' A/ @, v0 m
在fire9之后的layer中使用ratio为50%的Dropout
5 ?: h, a4 c! `3 _参考NiN算法想法,SqueezeNet中不含全连接层% {$ ]* I j5 n. Y o
训练时,前期学习率设置为0.04,然后线性减少1 n5 D3 N) J, m1 I/ @# Y9 p
4.2.7 总结
' Q, F O; I# B2 L; g本文最主要就是三点:
8 {) z5 I5 `7 H* O0 U; z5 d' \& e4 ^9 j9 c
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
0 \6 j# { D- @* u8 V减少输入到3×3卷积的特征图的通道数,减少参数量: S. N6 ]. C( n9 Y, Z, @9 w
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率0 X& u+ X; z& V, H: y3 P+ \
————————————————
# ]/ p- x4 k0 c4 B- y版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: i k3 \ B' X, G; _
原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
3 r6 `/ }8 s7 ~: x0 w$ a! [* X. ~& }' v( J( n) e% R8 N) p' m. u
; W1 K3 Q& D& h1 } a
|
zan
|