- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565615 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174907
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
! g, ^. G6 S. s) n3 | D! N: t
轻量级神经网络算法-SqueezeNet
9 U+ k! h2 F) {5 \4. 轻量级神经网络算法目录
7 ?) \$ k3 O) Y轻量级神经网络算法3 d: S0 N( ?/ ^& ^, h; ?) U& Q* K) c# e
4.1 各轻量级神经网络算法总结对比2 `- | V# f3 f* a5 s# f
4.2 SqueezeNet+ i# P2 B1 J8 }+ c( g! U
4.3 DenseNet
! N# @: G# q8 \) |" {4.4 Xception
* m; z0 }0 p5 O8 S0 r4.5 MobileNet v1" U8 w8 b( z4 q4 |
4.6 IGCV, a' L/ J' {- P
4.7 NASNet
0 B* J$ N% i( g% s* F/ s! V4.8 CondenseNet) N: g: V3 ]4 _0 s9 l
4.9 PNASNet% `: N1 N0 `% v3 q( s; x+ i8 h
4.10 SENet
9 l" G! Y+ N, C$ E4.11 ShuffleNet v1
" K: r. G Z; L5 O9 G% N4.12 MobileNet v28 d! P, }5 y9 q- \1 I0 x
4.13 AmoebaNet
3 b& S1 G( V8 M4.14 IGCV2
/ l1 m& Z8 f6 K4 e1 Q4.15 IGCV3
/ S8 M, I9 a7 Y5 C6 R4.16 ShuffleNet v2
+ p' j' e. U0 [4.17 MnasNet# N/ K, g& a3 E; O9 Q
4.18 MobileNet v3" }" z" B* s# C# y" i
深度学习知识点总结
" o3 J$ I' v& U3 F4 x9 T4 B
7 N/ K- l- {3 R. J! x5 ?; P$ c专栏链接:( U3 ?. C3 F) Z$ x3 t
https://blog.csdn.net/qq_39707285/article/details/124005405( O. p; A4 Y; `9 e
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。# s3 r/ \$ }( L$ [7 o
3 `0 b# c/ g D2 v本章目录
: J8 q; q2 L3 z0 p2 w5 Y4. 轻量级神经网络算法目录
, i9 e$ I8 I7 T* G4.2 SqueezeNet$ X0 L: |# [) l6 S! f, g
4.2.1 问题分析
, Z. o2 e8 P$ T! J' o- _4.2.2 SqueezeNet的三大策略: z+ Z) |) D- E
4.2.3 Fire模块
! |5 U+ ]) ^+ |3 C. H6 C4.2.4 SqueezeNet整理结构
: R; {1 T) {0 {7 z+ p4.2.5 代码实现SqueezeNet6 ^( D# P& H2 a+ E/ b4 y) s
4.2.6 其他实现细节* E- G q' }7 u4 U2 e+ v' Q) K' T
4.2.7 总结 ^- h! g9 \7 x/ O
4.2 SqueezeNet" D/ ~8 P C8 ~& R( _
4.2.1 问题分析8 Q: ]$ a- y' U# f$ W1 F5 X
最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:" A! Y) L' o8 Z |3 v& N C
0 Q* p" }* g3 `+ j3 X$ u7 a! W在分布式训练期间,较小的CNN需要较少的跨服务器通信. U( I& z- r/ g- n' _8 J3 i
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入- D( ?7 I$ N: T
较小的CNN更适合部署在FPGA和其他内存有限的硬件上& L1 T# `/ ?: E) E
为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
/ P/ H2 g, F* f+ A( F4 `' ~
7 w" N$ |8 N% `: E: n; m# K0 y4.2.2 SqueezeNet的三大策略
( i9 o4 k9 c& y! R策略1:用1x1卷积代替3x3卷积
* N6 }( Y! h5 w' c1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。- a0 d$ k {; i1 k4 m3 Z
8 [$ V9 v& z5 }5 j6 d: f
策略2:减少输入到3*3卷积核的通道数量% |& ~# i$ Y8 A* t0 S
对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。7 W# @4 @0 Y/ o
% r1 ^5 b! ~- G/ o5 ^7 V* R7 U& }策略3:在网络后期再进行下采样,使卷积层具有较大的激活图; X' t6 X& S* k8 R& S
这里的激活图(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中。" q9 e/ o) T, K7 G g; G
2 c k3 d8 I3 R/ ~% Y
策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。" S/ E1 N: N! B1 y" |3 u* ^/ w
, _4 w( p% B( |" [. U4.2.3 Fire模块
4 s' l$ O2 i0 y" C; C为实现这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 U2 s4 Q) s2 W/ F9 t7 L! ^2 P+ x2 K! C2 x4 o9 T
5 B+ `' k. W3 }1 Y: i
4.2.4 SqueezeNet整理结构
# |" L L M1 X' K8 x% w) }; w5 \SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。$ {* m- q: P( d2 R* g" S4 \/ p" b
) G# ^ [! m( ]( k2 ?5 [9 Z# x
" ^$ u* j, o0 r+ d' l* p4.2.5 代码实现SqueezeNet
5 r$ S0 F3 F1 [Fire模块的代码如下:! H' Z2 r) l) Q' `
5 M, u v+ w! R5 |
class Fire(nn.Module):$ s: E A/ i' {& K6 Y
' a& _7 C# u0 O9 x% @) p( B! d def __init__(
* Y7 P9 ^! A7 q self,
- }& e; d/ R9 P inplanes: int,. z( X' C; t# u* o2 ^0 t! B7 B
squeeze_planes: int,
% c% E6 ?# A6 K! p s9 s$ O6 d expand1x1_planes: int,( S" u% F: t) n" j
expand3x3_planes: int
0 v: Y2 v2 ]5 T. g ) -> None:$ K' A1 K0 t# n3 w C
super(Fire, self).__init__()
! }0 O& H! o6 P4 ]2 p self.inplanes = inplanes& w8 s! M2 t. b- u: U- i+ ~3 D; c% r
self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)4 p7 D2 K1 C6 u8 b5 ] ?: n
self.squeeze_activation = nn.ReLU(inplace=True)
0 n- K: ^1 ]' A% w0 T self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
4 s, z- s4 C( v% L4 W( c5 l kernel_size=1) H% U( ]1 z. u& f& `+ n2 W' ?
self.expand1x1_activation = nn.ReLU(inplace=True)
9 i+ d$ }& y. Y+ b6 Q6 h6 g! { self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
" u5 F+ ]2 m' Y6 l Z$ N kernel_size=3, padding=1)
! D m9 {5 B d# ]: K* v9 D" ` self.expand3x3_activation = nn.ReLU(inplace=True)0 r; g4 Q0 l) Z
+ i+ J1 Y; T/ R+ J
def forward(self, x: torch.Tensor) -> torch.Tensor:# ]4 P) _! O" r2 h: Z; r
x = self.squeeze_activation(self.squeeze(x))
6 I- Y+ L) U$ Z q" C. a( q return torch.cat([! |2 B& K1 Q: y' p2 l+ @1 a# n6 ^* m
self.expand1x1_activation(self.expand1x1(x)),
/ G1 }6 z# [9 t* R, Z* h self.expand3x3_activation(self.expand3x3(x))
2 m4 y- l7 I9 }1 u) K8 x. j5 v ], 1)
' E+ x1 `" X5 ]1 a) B
2 z* @, J: a, S3 B% P) U- A1) a$ t$ @/ O9 o; b! D+ k% B
2
! H8 _$ ^, F& h1 a7 t3 ~7 h" K3
. X# ~; w2 s; V- z7 k; a4
. { _$ s; v/ h9 l5
3 m4 ]0 h% p2 s l) L B6
- `9 P" c/ `' f3 w: i7
" u+ _0 F" G8 {4 }2 n, [84 E, H: S3 |0 x) F/ ^9 N
9
$ q+ Q( x9 j$ a. ^% |5 F10
5 z$ Y1 N# \& @; Q11
1 i$ C7 \# f3 e$ w9 d! s! ~12
% @+ j& j$ B2 _1 ?9 \13
0 w0 w* Z& ?- r" w& a14
& U5 V8 K1 ]7 O* w5 E15
M& W' {9 w" F16
& w: I3 `# U( }! s9 e9 |+ z; K17- _/ C- q% m2 c) h" v
18, Z5 L7 ~( i- R$ E- z# p
19/ ]4 \1 `, ?& J9 x: n- z
20
/ ]6 A- u" _7 N21
- K- _; n' D: ?! e" ?: h; X7 b/ S6 B22/ V5 i- |/ | E: Y' Z
23( P9 M4 E& L: K K$ |& P
24
+ Z/ E# R7 n. K; @) Z% Z250 V) s& W+ j% Z- B6 j: ]/ b
26
$ R/ P; E: p3 ESqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。' q% U3 F6 N5 w) f3 T7 T
) A- p5 `- w+ {SqueezeNet1_0的网络结构如下:+ D7 \, x6 _6 C
2 G1 L" E% Z7 E% }& Y) L4 Uself.features = nn.Sequential(1 d: y( x& k' }4 k( Z* o
nn.Conv2d(3, 96, kernel_size=7, stride=2),
; u' g& I9 Z. w# S nn.ReLU(inplace=True),6 a# f; h/ {" e& Y
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),# R n0 s1 b! w( c, O/ t9 Y
Fire(96, 16, 64, 64),
, w; I0 L' e/ m3 W9 S5 {; G6 g) k Fire(128, 16, 64, 64),9 e7 Y1 k: U. |, V/ O
Fire(128, 32, 128, 128),
/ @% y- _ g9 N$ d. n/ D3 x nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
* `# e7 F8 h7 p; G- M Fire(256, 32, 128, 128),
6 l7 @5 e3 k% {' t, p+ W# h; [ Fire(256, 48, 192, 192),
- v5 C7 j+ x% h Fire(384, 48, 192, 192),) J) k2 {1 `4 o1 S/ g9 E" e6 q( A
Fire(384, 64, 256, 256),. H( I+ Q- }0 I4 B1 c. U+ I, g
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
' A* i6 \% f; I& n- C Fire(512, 64, 256, 256),' R( T1 G) o/ ^" \- T& ]
): R) A% _3 x; V0 d* ?0 N+ Z
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1), h8 s$ ^; f" I4 [; `
self.classifier = nn.Sequential(, I' @6 B- g5 x9 v* e4 [9 Z
nn.Dropout(p=0.5),
0 f7 a7 U+ p" x final_conv,
0 S0 @- P) v" D# y' T( z- K2 D nn.ReLU(inplace=True),+ e& W0 o1 \1 O/ `- D$ t
nn.AdaptiveAvgPool2d((1, 1))
+ l+ @5 a/ m& k# S5 z/ t, y* f- l)
$ l5 L/ o9 i" U' x
% g+ _* Q( w8 [; `
2 ]4 m& N" ^/ r% T# h6 D+ N$ L1
+ G# D' s8 J# m26 V5 W7 [, s; W
3
8 Y j& ]& `, v3 n* D% R7 r4
6 F, m0 {2 ^ w- v50 c: {, O8 n1 | j
6, B2 W& _% _2 a+ E. D7 @( r N# G$ g
7
" D7 n1 t6 Z" b3 [6 G f! L0 i1 h8, S9 b$ k( v! h3 D/ o
9
6 E/ {# L' B* E0 C0 L+ I10. x$ b+ V* A+ P8 x9 a
11
* s1 S; o. R0 D$ Q9 w12) Q' |: [; F; p3 P
13: P5 f) ?; g! X" s1 |
14
- Y1 d1 q% i; ^2 K! J15
4 F, @% _3 @ I16
2 _6 V) T0 p. V0 v3 w9 H3 o T17# H/ s# d: D% X# L$ |: _( P, N2 W
18
/ j7 S0 c4 Y, T0 {" K5 I19( ~9 A& d0 }# }; m& Y
200 o1 \2 s. Z5 p- |( t
211 ?% o8 R! d' h6 z8 g1 d, H8 r: h
222 ^5 N6 F& l7 K
23
7 M1 o0 @% o* iSqueezeNet1_1的网络结构如下:
& z- G! I6 O0 n5 I% E/ D3 Y
0 ^! J) V n: E3 H5 [4 R! ~self.features = nn.Sequential(- `% H0 s. n! O& { i* C+ z0 K$ ]6 h
nn.Conv2d(3, 64, kernel_size=3, stride=2),
E( `% X& k D+ n' ^. D0 ? nn.ReLU(inplace=True),1 B& K W% O- j6 s
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
s/ j" R) e& R8 m# [ Fire(64, 16, 64, 64),* T: g/ Y# `* ?
Fire(128, 16, 64, 64),+ I0 j f- W& e4 l
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),- W8 v7 N. a5 f4 F, l$ l
Fire(128, 32, 128, 128),
9 z7 C' l2 k9 X5 z6 i0 i Fire(256, 32, 128, 128),
9 [7 ]4 K1 n% R6 A nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),2 U4 L+ ^. ~* @; J& I* S* j: X
Fire(256, 48, 192, 192),5 s0 k: ?4 z0 }' d: i8 U, Q
Fire(384, 48, 192, 192),: ~+ p) Y$ M( U' u$ |# N& Z* t u8 v; U* }
Fire(384, 64, 256, 256),* L8 k) B; S) w4 l5 J) C9 j
Fire(512, 64, 256, 256),
h% f& H( V, \. f& I) h% i! T)# @# w i7 A* K
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1); `2 g4 V4 R5 z8 A) d m4 f
self.classifier = nn.Sequential(
3 F! z& p% V2 N' k9 j nn.Dropout(p=0.5),
K0 w/ ?3 C& W0 m7 K/ S; R final_conv,) N1 z8 X2 R% q1 p! H
nn.ReLU(inplace=True),
& j. b3 K% H7 Z" B/ v3 K nn.AdaptiveAvgPool2d((1, 1))
3 H* D) k- }" g! _& W& b)) L" A9 j3 j( U/ W2 _ ~( ]
" m5 a: S, ^4 r) b
1, A# }/ E& A( p: A- C% @/ o
2
+ z: U" a8 X9 t* o& [1 l3
( S( k/ m6 F4 A+ j. ^, [4: e5 y' Y0 ^! ^) Z
59 F8 e+ d3 d( M( Q V& X* f( K& @. m
61 e ]6 Z' A& {9 u+ j& @
7
% d/ i. H% ~2 A& |8 X& w4 G8% B( R; \4 l8 j1 [& S% a% G3 b
9' J% O+ }, C* ?
10( B% s: @; C7 G1 A1 B: D
11
6 T3 s; x) l; Q9 T! y6 N; S/ {7 P, k) {129 M+ K6 r( I) W! [/ O6 Z
138 @9 u& G+ S& D) l8 Q7 G' N4 M# u
14
) y3 a3 T& e4 n& T- _15
& I& f ^. U/ i16# R" _. o4 i; g
17
8 {, O8 C0 f+ A183 O5 B1 @2 V, }$ B
19. M$ O6 l, U, A5 c6 {1 b
20% I- `, }- X ?" F
21) S7 ^8 q8 g1 M+ g# W
22- x' u9 a/ e1 p. {
SqueezeNet各层详细参数量及其输入输出如下表所示。
2 k5 V) ?7 v( d1 j+ S- u, S2 x* D+ q/ b
' D1 J4 w5 R) u) x7 [" Q9 o4.2.6 其他实现细节& o4 j8 E9 `' C) c
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding: H7 k; M" K+ p$ F# O3 s j+ t
squeeze和expand层中使用ReLU2 g1 t E1 t0 T3 g; B" s
在fire9之后的layer中使用ratio为50%的Dropout) R2 B2 x* @ w2 ^6 J$ t* l
参考NiN算法想法,SqueezeNet中不含全连接层- x# E3 g7 X: z4 u. L/ `9 ?2 C
训练时,前期学习率设置为0.04,然后线性减少8 i, U, Y. T. ?
4.2.7 总结
7 d* n4 y6 p: R0 Y3 e本文最主要就是三点:3 |' a1 X, R% W, X$ l
( y& y" Q; O6 D- t9 V' e* a1 f/ M
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果8 z% }7 q: ^2 C2 M4 ^" x! ~
减少输入到3×3卷积的特征图的通道数,减少参数量6 R$ z; P7 e: y
不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率+ p8 v6 W, l# Z
————————————————/ v; ~! i( k }+ I0 j6 v; t- D5 X
版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% S2 E; b/ T# e+ p5 j) B0 x
原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100. [- `1 N/ ? g2 W3 ~2 W! K8 l
9 F" { I0 |' {
0 D1 Q" Z( ]( z. I |
zan
|