- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564676 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174626
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
5 R6 N& n! A& V- }轻量级神经网络算法-SqueezeNet
F$ @9 X: s. U0 M4. 轻量级神经网络算法目录
$ N; L, N5 \3 y' L" N: r3 B7 M h4 F轻量级神经网络算法
1 p! W) F9 Z0 v# ]2 N6 i; s8 o+ v4.1 各轻量级神经网络算法总结对比9 v6 v! z4 t- v& g: F
4.2 SqueezeNet0 ]: [9 O% n, ^0 ?* s! F7 q- Y
4.3 DenseNet. s J: B1 x3 `8 w4 i
4.4 Xception
1 A' }5 y7 X( w& l4.5 MobileNet v1
. N& k* u% n6 D1 H: f4.6 IGCV1 Z3 V$ y$ L4 @& G& D4 E# Y$ c
4.7 NASNet* T |' N9 r4 D! j. m& Z) p
4.8 CondenseNet
5 Y+ t2 e1 J \' V# n! {4.9 PNASNet
; L- M! z& x' u" J+ x4.10 SENet1 b7 s8 q8 {: {
4.11 ShuffleNet v14 z$ D& d) p$ d1 G, K2 x" ]
4.12 MobileNet v2
: K. p) i9 [% i8 i1 U6 Z5 A4.13 AmoebaNet }+ j% w3 W: ~7 g
4.14 IGCV2
( M: p Y5 y4 x3 R# W4.15 IGCV3& _2 K7 B' V. w' P& {
4.16 ShuffleNet v2
. E0 U5 }4 c! ^4 o. l+ a4.17 MnasNet y3 [3 F7 T2 p1 M" ~' K) M
4.18 MobileNet v3
; K( L6 F. h. a; y% |: [7 k! X深度学习知识点总结
) g }$ F- r$ B5 P, {# K; [: O& d1 S
专栏链接:' S( ?: q8 e7 T6 Y) g; y B
https://blog.csdn.net/qq_39707285/article/details/124005405& c! `! L6 O2 N9 M3 u/ t
本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。4 k% R( @- ?6 m9 L: V4 |0 G* L
: M1 H! K. G+ ]- l: N本章目录, v5 J9 `3 _' ~/ B5 T' ~, [. `
4. 轻量级神经网络算法目录
: T+ E8 T/ @8 d* C4.2 SqueezeNet6 L$ G) C3 R9 ] q3 h
4.2.1 问题分析
: |- b$ a9 H/ w! m4.2.2 SqueezeNet的三大策略
( Z# T5 _2 O( B3 d( \4 A5 G4.2.3 Fire模块
# Y% e# W9 Y" J4 |; k4.2.4 SqueezeNet整理结构
" b5 o! f: c0 |4.2.5 代码实现SqueezeNet
, j0 a" }# G* U* _) @% s, z4.2.6 其他实现细节, G2 ?# U4 _& C- z' t0 S7 h/ D
4.2.7 总结* D/ Q& f, e8 `: K- |* n2 b m l& A
4.2 SqueezeNet3 g' O% k1 { b. K$ Y4 J: I
4.2.1 问题分析
& z* R+ B8 E8 N- u- U9 p最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
3 W6 \! l5 Z" w3 b% T
7 m% R$ ?& K) P* d6 \' |在分布式训练期间,较小的CNN需要较少的跨服务器通信
}; X( u5 M7 x4 [1 g2 E" r$ I在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入# U8 A3 B& G4 i3 l1 F) \
较小的CNN更适合部署在FPGA和其他内存有限的硬件上
9 W2 Q" F$ J6 r, c) z" t为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。+ z1 O. t" _$ \- z1 ?+ C7 s
: Q) l* U8 g! D8 Z4.2.2 SqueezeNet的三大策略
( s8 }% W, g6 J* l6 T; C# U策略1:用1x1卷积代替3x3卷积3 i- x; k! V I7 a
1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
6 ~4 l" U2 a) E, c+ Y2 l
9 d3 A6 `6 s }" `- E策略2:减少输入到3*3卷积核的通道数量
; g* f: |, V! _ C# j) d6 ~. k m对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。# h) V2 X1 M* ~" Z A! M6 Y
) _" N% @8 }+ J1 H. B T% U" n
策略3:在网络后期再进行下采样,使卷积层具有较大的激活图$ s G/ M7 |* c8 P# @
这里的激活图(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中。7 U$ M6 S' Q5 F, s% l" N$ n
* b3 C% N/ C. W6 ^/ Z策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。# |8 O! \$ D8 E. X
4 w+ h0 a& g2 h' L
4.2.3 Fire模块
- Q S- r$ Z9 f) \4 h7 Z2 v: a为实现这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的想法。/ I0 x3 W* a( a+ k1 i
{$ |6 r$ ?) r# p
- [3 X6 x8 [/ [4.2.4 SqueezeNet整理结构
! u2 `7 X* E& {: rSqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。
+ s2 Y' {8 \8 E6 u# D. d7 M G% ~. E# ^$ f; Z3 l# I* f( G
/ j Z( m4 ^8 Z4.2.5 代码实现SqueezeNet9 d) q9 o: h1 Y V9 u% P" C
Fire模块的代码如下:
- t4 p! d( p/ a" Q- L+ d
4 ?1 e' k* M5 T1 M! Q( [- k2 j6 ?1 Oclass Fire(nn.Module):& }: @! D7 f1 s
- f% I' {& S, [ def __init__(
% J) T0 e$ C- W/ K; H self,
) S* l( x. w; s8 N7 w inplanes: int,* i1 U8 X6 {! q6 {" E
squeeze_planes: int,
5 p0 N9 u0 X- {( d @ expand1x1_planes: int,/ W. O- N/ r& j) @7 t0 C6 M' m
expand3x3_planes: int# b6 ~% j1 x K$ u( C
) -> None:
O: K D: J* s super(Fire, self).__init__()
4 |: B# w; b7 b& u1 c6 h* h self.inplanes = inplanes
, z5 q- M6 b; S) @ self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)' O0 `& E8 E$ K% K+ d% o& |* v7 r
self.squeeze_activation = nn.ReLU(inplace=True)4 q8 R2 s' s! L) n& m
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
* M5 j6 X7 f: q$ |" o kernel_size=1)
9 n7 \1 n) _0 K5 f" `- ^ self.expand1x1_activation = nn.ReLU(inplace=True) l0 F: H Y+ @7 L
self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,( A c% E$ l) X$ S, y8 U
kernel_size=3, padding=1)# M9 s) k+ b/ L! P0 K7 h5 h9 N
self.expand3x3_activation = nn.ReLU(inplace=True)
4 v, ^8 Y2 P8 G
$ r7 \& u: ~- a+ ?+ c7 P5 f9 e5 m def forward(self, x: torch.Tensor) -> torch.Tensor:
) o- x( m+ _6 y% B x = self.squeeze_activation(self.squeeze(x))* f% E1 s- b0 x( @
return torch.cat([
4 J v) h: w$ A6 H4 Y- j0 u self.expand1x1_activation(self.expand1x1(x)),# |8 {7 m8 n; p8 f
self.expand3x3_activation(self.expand3x3(x))
8 z3 u+ L8 K6 F5 D; N, H# W ], 1)
5 X0 o M5 x8 }3 b+ {
. o" Z' f# y: q( |1. C/ \9 ^: H5 o7 w, L7 }/ _
2
- S; ~' ]3 s0 W8 A! f8 O$ J35 D" U' H' |, a6 P) i: ~
4
& Y& w: i" h3 v) R) M54 J4 n) r9 S9 K3 ?3 K! O e, a
6
+ j; H9 J+ b1 |# Y# F7
: J# L$ j* Y$ T" ^- Q& o) f _8, B3 y9 \4 i' y6 h
9
a k# o5 J; w10
0 d, Q$ z/ n! I0 J11
, Q* Y% w8 Y l9 D12: o n& f' R; I/ O, q, t
13
. _# y; a8 j( L' D( a14 T% x3 b9 J& p1 |
15- z/ \& `7 v l% A0 b2 `0 p
16
. |4 e9 T' G( S1 ~, a4 s6 t, {17
0 z3 o! h: l( x/ \( X r/ \189 I1 H8 ~4 ~7 ]+ t. C/ s0 L
19
4 g+ ~1 P% e/ b4 T X20
6 l- B2 _# y# V21; @9 y9 O# e: Y7 B5 ~
22# P8 E {) J3 K. M
23 S# e' O$ Y6 o0 I
249 B2 I& p/ k( Z1 t% n8 Z5 L1 o+ p
25
6 M/ ? V8 _' ^" b! \26
. w! A) g) J4 _7 ^1 \SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
2 ]/ l- X7 ?' j( d' p5 V' |. Y5 J4 Z- G9 N
SqueezeNet1_0的网络结构如下:
9 l0 E1 `" S. {$ u* ~8 t0 t& Y4 }" f; ~4 e
self.features = nn.Sequential(2 P7 B0 K7 a6 x+ J6 w w
nn.Conv2d(3, 96, kernel_size=7, stride=2),
, d7 t! A# p2 Z% g nn.ReLU(inplace=True),! D ~! g1 t; c1 y; _% `+ ^. d
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),8 ^ g! q9 } C; _3 G B
Fire(96, 16, 64, 64),
; v7 ` p8 M1 @ Fire(128, 16, 64, 64),4 G1 _ u4 U8 ~4 X7 D
Fire(128, 32, 128, 128),
* Z) ]4 x* B8 w7 ~! c! p nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True), X4 t; {% e9 q1 z: Y
Fire(256, 32, 128, 128)," @( ?! G2 c t' q
Fire(256, 48, 192, 192),8 q$ U# ~2 s& A7 g+ R" c
Fire(384, 48, 192, 192),
/ ~. U- Y) a+ X Fire(384, 64, 256, 256),4 \7 L9 ^% b+ Q
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
7 \! | o: W! d Fire(512, 64, 256, 256),7 O2 K8 Z& \2 @. U* e, f- _5 h' P
)
* k" y1 s E4 F" r8 Afinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
) y& ?( b( b; r( l5 k9 K! w* cself.classifier = nn.Sequential(* b5 D' l |% O G* ?! Q
nn.Dropout(p=0.5),
& x. g. w, \2 v, c4 K- S final_conv,
! G9 N( ^0 }! P/ {% c8 C nn.ReLU(inplace=True),0 _2 _" B6 l% ?' `; [ c
nn.AdaptiveAvgPool2d((1, 1))
" s& b A/ W6 M)- H# ^6 {+ K' w$ t
6 h2 U4 z5 v. h/ v1 R
) p3 A" l/ T0 O3 E, ?/ z
1
0 o+ @- c2 {1 Q9 m" H% V+ c; A2
# A6 I! {/ k) l5 b8 t6 n3
( l; ] I' ~7 y% P5 D/ f$ Q ]+ \4* ]% y [. p! z* |+ T; t+ j
57 ?0 r/ ~- f1 m- R8 X4 E, |
6
( i+ D9 A" t. C: Z- [% V7 V7
o& [, s7 W) _# A/ r8$ l% l" u( }7 P0 W- r
95 g( `: Q9 t' K; O. T
10$ U9 x+ y$ k0 N& e
11& P/ ?0 i& l" G* z% c4 g
12
0 r" t7 n4 a, n' p8 k) C: g13 b: ]1 C' W* u& ?) |
14( H8 l) l9 o; d1 G( [4 a- R+ y7 t
15
3 Q5 o9 x# {( D1 r$ {: R7 @: F163 A4 f+ k; b% n& w
17, g! L3 B/ s: A, P7 c+ D2 j8 {
184 Q- N g6 z( a H3 ^. F
19
- J5 A. `* q1 L20
" M5 s& W: g- d _21
; W$ L) t5 H7 D8 Y+ f: c, U5 L22' e2 J: w2 N8 [1 _% O* R4 b
236 l6 O& R6 R$ R! X
SqueezeNet1_1的网络结构如下:
5 w9 Y8 l6 Z1 q9 G1 @% k
* Z1 a& a2 u4 F) E6 d7 Hself.features = nn.Sequential(% ~- F( J) x* ]
nn.Conv2d(3, 64, kernel_size=3, stride=2),
4 M6 z* O1 X; p3 y nn.ReLU(inplace=True),; I r! q6 K/ E' ?: V8 l
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),* b- N, O; b* k) s* F
Fire(64, 16, 64, 64),! Q& W0 S! U( D$ B
Fire(128, 16, 64, 64),
* \1 {* B3 d8 _# C5 i+ r/ } nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
/ d+ j5 m" |+ D6 Q1 F+ D Fire(128, 32, 128, 128),: @ P6 y X" V! I5 ^1 |5 Q
Fire(256, 32, 128, 128),! d, b9 Q% v) c5 I( L
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),
- a4 c/ Z! D; f0 |- [ Fire(256, 48, 192, 192),
- c4 h' `% Y0 E5 t- |8 a9 Z9 d Fire(384, 48, 192, 192),) q1 M) M/ _+ ]% X) x. `
Fire(384, 64, 256, 256),3 s- r) \0 B# f6 f
Fire(512, 64, 256, 256),5 o \# I/ H9 v# Q
)+ I$ Y. ~# \7 R
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)- ^5 \7 m! ]5 H( F0 @( u ^3 w
self.classifier = nn.Sequential(1 V0 f5 T, b3 m1 i* ~* \8 L
nn.Dropout(p=0.5), V$ x6 z& B$ q- X7 T7 g
final_conv,7 J+ L6 M, U" e* D
nn.ReLU(inplace=True),
M5 @) m4 } w, @; L! M nn.AdaptiveAvgPool2d((1, 1))
' Q- H# D" C/ n# o5 N)6 X- Q, a9 Y4 R: [- W& l9 Q: y
! C7 o1 L7 I1 m7 y+ k8 h
1
0 U% H" {" D) Y h4 y- g; D( {$ @/ y2
2 {2 W+ g& y: ^! d% w* G5 l3$ p( T2 _. i- E0 s, f
4
+ v/ W: T" {! f6 O/ ^7 y56 Z7 V2 r- N. Z a7 y# Y' P. @
6
% Z& D$ a- f$ r, H. Y7' K- \8 K, [/ q$ K: I- ^$ a& W5 [1 C
8
) E, o4 g4 C7 @2 k9- R& B3 ?% y3 _: c" g) ~1 L# u
100 T$ b( d7 r; ?7 W M
11" M0 J: G) u; |
12
1 K. Q6 k3 K# S5 |. G9 S5 F13
! ~% l s* R/ w& O- l1 y7 t# Y14
3 W! D N- y$ o w: Y152 R% M/ e6 A. k6 m' [! z
16
+ w, E/ Y% l- }17
7 R; p$ g( N7 u7 ~18
% Q ^" }5 `6 U7 O196 h+ t/ u$ k1 d" @( A
20# P$ ]. {. Y, d( o
21
6 |8 w) e1 T; t+ D, r1 K; V$ [22
3 M/ ]9 ?* f* f1 B6 {3 u4 nSqueezeNet各层详细参数量及其输入输出如下表所示。% [+ m- ]2 r! l
# Q0 M# Z; ?/ A' M8 y h% q1 o$ a6 R, H; P
4.2.6 其他实现细节9 N5 o% x3 A: W: _
1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding
Z( p( |- m1 E% @; l rsqueeze和expand层中使用ReLU
' g2 T9 t/ O; s4 N! ]) j在fire9之后的layer中使用ratio为50%的Dropout
0 g+ b! L1 c P6 b3 I+ l; [" T参考NiN算法想法,SqueezeNet中不含全连接层
0 H9 o& r8 n* t训练时,前期学习率设置为0.04,然后线性减少
4 z9 H# N5 X6 T) X! |/ H8 ~4.2.7 总结# \( w1 r. I+ y. f, x+ w8 q% U
本文最主要就是三点:
" v3 C2 B ^8 R) U1 |, A% i
. @. R) O: W8 p用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果8 M l! |* { Q) ]: t0 E; t
减少输入到3×3卷积的特征图的通道数,减少参数量
3 |( p: I N$ R( R不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率$ R: @' ?" m1 p$ |# O8 |
————————————————
4 \; i; W+ Y4 Y/ L! J版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 C0 f& R/ d2 f `/ h. T) F) P
原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
" I) t; G- b! [0 v* ]+ k) M1 s: R
" g" @4 m3 O; O9 w- f3 O Y) r6 p, }) c
|
zan
|