- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565662 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174921
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
! K& K6 U* P$ w- Y3 J0 s; e轻量级神经网络算法-SqueezeNet
: Q" B/ r5 ]; w1 n6 q+ I2 I2 E4. 轻量级神经网络算法目录7 o- j& B$ I B; [
轻量级神经网络算法
* h! T* ]3 x6 C4.1 各轻量级神经网络算法总结对比3 w& ^( l* S1 ]1 B6 |: }- h, i
4.2 SqueezeNet
, r: h) v" G- ]2 e7 S4.3 DenseNet: C! R3 X7 `- R _' F+ y$ ~1 w+ \
4.4 Xception9 P! L: O5 i% K, w0 E9 [7 @* [
4.5 MobileNet v12 q- U% a" `0 O5 |& R
4.6 IGCV# y# V# @' t% E1 T0 ?$ D
4.7 NASNet# x3 S y, M$ I/ l
4.8 CondenseNet
3 j6 e3 N2 |5 {- z( c6 v9 `4.9 PNASNet
! g% I# r7 h1 V& ?( B4.10 SENet0 l* o2 z: u) C
4.11 ShuffleNet v1! I5 E4 J F5 V1 e/ N, t3 Q" {- v
4.12 MobileNet v2
; h5 b7 S M" O* ~1 l4.13 AmoebaNet
" A! k% g1 ~+ u7 Z) L, ^4.14 IGCV2! M/ g8 K/ P/ q9 }6 C; T
4.15 IGCV3
( a( ^/ l! k. e( ^- `4.16 ShuffleNet v2$ S5 t9 I1 ]( C
4.17 MnasNet
9 y* C7 K) E1 _4 ^4.18 MobileNet v3
* Z. _' Z9 B: b6 A# E: Z1 T, O" d深度学习知识点总结7 B& H1 f6 z" l x' \$ a
5 \7 N# D7 Z# x* C: I/ `
专栏链接:
& w: R# Y6 ?& N1 _# F- N9 c: `, _" yhttps://blog.csdn.net/qq_39707285/article/details/124005405
( x D6 i& h( W本专栏主要总结深度学习中的知识点,从各大数据集比赛开始,介绍历年冠军算法;同时总结深度学习中重要的知识点,包括损失函数、优化器、各种经典算法、各种算法的优化策略Bag of Freebies (BoF)等。
5 z! T, ~3 J& K* ^* l
. v4 {/ G0 g3 x0 n' e, `$ H本章目录
( g- ?( A9 Q+ B, O% A) `4. 轻量级神经网络算法目录
9 f* q8 a2 L' B, `; ~7 c8 P6 m3 }4.2 SqueezeNet
& c* d Y" T( Q4.2.1 问题分析0 u: E- I- X. T2 R M5 P
4.2.2 SqueezeNet的三大策略# ~* o. C, e( U# {( n3 j& t) Y
4.2.3 Fire模块5 h; b& e+ W" l y( P
4.2.4 SqueezeNet整理结构# ~3 O! C8 P' N
4.2.5 代码实现SqueezeNet9 d ?* t5 o, E; V$ m
4.2.6 其他实现细节% N7 s& I& ]: p% r, _$ R2 J
4.2.7 总结& B! ]" F8 P0 F( f3 E3 | z
4.2 SqueezeNet! F: Y# y: z' ?% S4 x
4.2.1 问题分析
* `% g: M5 ~( ?最近在卷积神经网络上的研究主要关注提高准确率。在给定相应的准确率之后,通常有多个CNN结构可以达到该准确率要求。在同等准确率的情况下,较小的CNN结构至少有三个优点:
, L, K8 \% a+ ^$ e# ]; ~/ S, J9 I" D
在分布式训练期间,较小的CNN需要较少的跨服务器通信& h* b, G! U8 B
在自动驾驶汽车等应用场景下,较小的CNN需要较少的带宽将新模型从云端导入7 t" Y: K! s& y2 l
较小的CNN更适合部署在FPGA和其他内存有限的硬件上
: K5 f* \4 a# d1 Q$ @# m' p6 s为了达到所有这些优点,本文提出了较小的CNN结构,称之为SqueezeNet。SqueezeNet在ImageNet上实现了AlexNet同级别的准确率,但参数减少了50倍。另外使用模型压缩技术,能够将SqueezeNet压缩到小于0.5MB(比AlexNet小近510倍)。
8 }0 b3 a2 L( @( X( E0 C0 f; J
& s) |! k$ M/ f4.2.2 SqueezeNet的三大策略
; U3 l' Z* P6 ]% e- o2 q0 p策略1:用1x1卷积代替3x3卷积
/ j1 t, {2 H5 f8 ?- p* W1x1卷积核的参数比3x3少9倍,所以网络中部分卷积核改为使用为1x1卷积。
, Q, {) k+ t% L8 \6 X
$ F: |/ ]+ q( D/ c0 a/ B7 } c策略2:减少输入到3*3卷积核的通道数量
# Q0 H* s5 y0 _对于一个完全由3×3卷积核组成的卷积层来说,总参数量=输入通道数×卷积核数量×(3×3),所以仅仅替换3×3卷积核为1×1,还不能完全达到减少参数的目的,还需要减少输入到3×3卷积核的通道数。本文提出squeeze layer,来减少输入到3×3卷积核的通道数。 @; A7 K3 L2 v9 g8 |" f
- w, y+ o6 O" L: E! o3 ]策略3:在网络后期再进行下采样,使卷积层具有较大的激活图
$ S; a$ t d3 E: h4 b这里的激活图(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中。, ^# @3 h k; `8 i
! Z" S/ l) z; S7 Y+ v
策略1和策略2在试图保持准确性的同时,明智地减少CNN中的参数数量,策略3是在有限的参数预算上最大化准确率。/ ^: g6 J9 m" R9 L" w
% q X7 `" ]! D5 \+ t/ z* {7 h( O
4.2.3 Fire模块
" [: L0 F2 ^5 _5 ~% 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的想法。6 m4 u8 S' j7 l& c
* ?% d5 q' b' c! [( {
+ d8 `1 y5 A/ G5 [4 V4.2.4 SqueezeNet整理结构& H6 @! T# P) v1 Q* X' x" D: Z
SqueezeNet整体网络结构图如下所示,其中maxpool(stride=2)分别设置在conv1/fire4/fire8/conv10之后,这些相对较晚的pool安排符合策略3的想法。* Q( x: H5 ?& p2 G9 Z
3 q/ g8 i5 s2 |! j% l, c
1 Y m3 F4 r) x) _ w1 c j
4.2.5 代码实现SqueezeNet
, \7 [- I, u) F" e! n0 v2 pFire模块的代码如下:/ |& Y* K5 ?0 a+ v) m" n
. D% a/ h5 K+ h: P; iclass Fire(nn.Module):$ F/ t2 x; y3 Y' c2 X+ b6 a$ N
9 ~8 r; y) Z& ^# R4 Q" q3 y def __init__(
' r7 |6 ?4 `# Z9 l$ @3 { self,
/ b% M& ~ E: ~" x; i; O# m inplanes: int,
+ z4 P" _( Y: P+ v6 k squeeze_planes: int,/ I" N7 M: p# Y
expand1x1_planes: int,7 p( n8 z& F; P( G' a( s! d
expand3x3_planes: int
2 n& e' I9 z2 d& I ) -> None:
$ n4 d4 v- L% e- u0 l9 S super(Fire, self).__init__() n) T* Y: Q0 ? g1 e: s
self.inplanes = inplanes+ z* \7 \ d9 J% M3 |
self.squeeze = nn.Conv2d(inplanes, squeeze_planes, kernel_size=1)8 e3 ~6 g M: F: k# g
self.squeeze_activation = nn.ReLU(inplace=True)3 d+ T& ~$ {7 K' V, H8 [; m& ^
self.expand1x1 = nn.Conv2d(squeeze_planes, expand1x1_planes,
, {, h \+ O4 z$ o- a2 o( t kernel_size=1)) O7 L3 J2 F/ B; q
self.expand1x1_activation = nn.ReLU(inplace=True)6 w- H- r# p6 t0 ?' n3 q
self.expand3x3 = nn.Conv2d(squeeze_planes, expand3x3_planes,
) @! K- r: o( K/ p- p kernel_size=3, padding=1)% v5 H) i; q8 x9 X
self.expand3x3_activation = nn.ReLU(inplace=True)8 ^8 X- a! ^' B& y y
: l) g W8 u- h% e# ]* k
def forward(self, x: torch.Tensor) -> torch.Tensor:
, C- _+ q9 ?1 p x = self.squeeze_activation(self.squeeze(x))
3 a1 O: t8 C: r: s return torch.cat([* x6 {( F3 H- R% C, C2 U8 N' k/ j
self.expand1x1_activation(self.expand1x1(x)),. [. J: o: _ p7 o& ?7 ~9 p
self.expand3x3_activation(self.expand3x3(x)) k: T; g3 A- G$ y$ x
], 1)# {5 D0 D- D8 o: @" l
$ y( n9 y' U: i3 h
1
$ G$ g: C: [6 t& S) D x2* o G1 h4 H- f9 S! f$ b: s+ L C
3
) T: ^* X5 n( t4( Y) C; I d- }% l
56 ]8 |4 { ?5 w' ~: P0 k1 @1 v
64 t! s R* I; g- R
7
# [$ X ~7 x5 c! H86 M' ~6 i, _( N1 ?- x
9
3 ]; F' A+ J. ]" s& F10
, Q( y2 Q( n' C) t4 | {) A11" X' T; l+ x8 n$ q5 H; @1 V$ n
12" g1 d: n* n! V3 v; J0 Y; a: ?
13( s% m: `9 S& K: F H9 x7 N
14
/ |3 O' H- Z8 i% m15
7 J, ]' y4 ?% P16
$ i+ B% ^) x( H$ ?/ c# k- m17& f9 N: h& N0 Z7 S1 A1 n
18
% }* y6 |) ]0 R, @5 v! s* d# ^# s19; H8 g/ K/ @9 ?2 a |& D
20
. h5 J6 W5 y O21 k5 B/ N. a- M8 ~6 p- J
22
" v& K# a% z# D/ p" v23* Q: p% g. q, d* Z
24
) @$ ?5 k, z9 t' q) S/ F25* w- {: b( c( d; V1 R2 @
26" B% E! p5 a5 U. N* X- W0 g/ E+ G
SqueezeNet主要有两个结构,SqueezeNet1_0和SqueezeNet1_1,SqueezeNet1_0即官方版本(图2左侧),SqueezeNet1_1与SqueezeNet1_0相比在没有减少准确率的情况下,节省近2.4倍的参数量和计算量。
9 a0 Z2 M- O' u. V. w. p
" i S; y+ Z0 v- O: wSqueezeNet1_0的网络结构如下:
0 [& e: Z+ z) ^+ y/ b9 c
; {% i! E" d ]7 Nself.features = nn.Sequential(( T( e* z: Q+ x3 c4 y+ k
nn.Conv2d(3, 96, kernel_size=7, stride=2),6 _1 w" B) X0 Y' Y& V' z' o; d
nn.ReLU(inplace=True),
! x/ P! _& J( ?/ o nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),. ]) I, l( p6 W) L1 y" ?
Fire(96, 16, 64, 64),
( y* @ |9 O. u+ D Fire(128, 16, 64, 64),
$ o: x q/ Z4 f' F; L+ m* K Fire(128, 32, 128, 128),
8 Z) G. v* @$ r1 B# Q" G, i8 ~ nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),/ n# @+ T3 r' K$ m7 _: U
Fire(256, 32, 128, 128),3 ?1 f f: d w
Fire(256, 48, 192, 192),
9 P8 c) Z9 l6 x- F$ x& l& P Fire(384, 48, 192, 192),
$ w0 y- L! W `. A$ O$ F Fire(384, 64, 256, 256),& Z+ Y4 }# Q5 `7 [
nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),' D# k. [; p5 w/ ] [( U
Fire(512, 64, 256, 256),
* i6 T; k2 p1 g8 d) o3 C)
3 I0 R5 m z" ~. Zfinal_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)0 w$ M- }) D6 k6 J
self.classifier = nn.Sequential(+ P4 B8 N9 A9 I. F
nn.Dropout(p=0.5),- O# Z! j7 V$ ?! ?1 o3 `) @
final_conv,& D- y, f S. k3 o' g1 C) _
nn.ReLU(inplace=True),
+ O; ]0 N+ t$ a nn.AdaptiveAvgPool2d((1, 1))2 n. i8 b! y! Z5 O1 W1 R; v* Z
)' _: `! ]& t/ \- _2 Q b3 z5 Z
4 a9 }$ J: ?7 S( L1 Z# H+ Y/ ^: j: i
16 J' S- m1 \" G7 Z* y
2
* q# {, k8 z. a& \$ q- V3
8 y: ^# _$ O4 j8 l' u1 n4
5 B k0 n6 P) ~* J# Z+ N5
& v( E1 W! x8 W) w; V9 W/ ^6+ _- ]6 P4 w/ s# b' Q6 ?
7
0 v1 W# P ?& L6 w8 h8
; X# S& [7 N1 }/ r9, F N( @7 E, O1 Z6 j$ W# k
10
4 X! G- h/ d: K8 A; p11! W; m2 `: I: j- A
12
/ Y+ d4 z Q$ z3 o$ C* l, f13
; [8 S( s+ D" n; n: S14& U1 V- q" F5 g( X* i
15
B& N& m& o9 A% V. b& i& Z$ b3 _; H0 F6 j161 ?' Z+ e8 C; r& Y! O+ i) u
17. w5 |$ d( w) v' l6 s7 c4 e
18* x+ w) \; Q6 J+ J% `
19/ L' P" l2 ?+ x
20
/ Q. ^8 e% _& _" {" e9 ]21, L# c$ c' [9 H2 K; h
22
4 {; L/ u. d2 B1 c232 A- Z4 ~0 I: V3 i2 z v
SqueezeNet1_1的网络结构如下:
- k/ L2 Y0 i1 J2 B" F7 i, y! M/ |8 O% M8 Q
self.features = nn.Sequential(
/ q! Y. K+ }+ {8 ? nn.Conv2d(3, 64, kernel_size=3, stride=2),
8 L: h& n, ]3 G' r4 a nn.ReLU(inplace=True),
. S0 m. A' a: K/ ]1 ~ nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),* X6 T6 S! v( q% x
Fire(64, 16, 64, 64),
) w* h# l1 ^6 i: w; ^ Fire(128, 16, 64, 64),
/ k, h, @( b* ~4 Q& ?! A4 o nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True),( S8 G, t! Y+ L! V8 z
Fire(128, 32, 128, 128),. D% t: Q% Q2 `* `/ x
Fire(256, 32, 128, 128),
* _/ k9 T* c" M8 D+ q9 I0 n, _: y nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True), Z- r6 R* b% K$ N$ @) n9 S4 r
Fire(256, 48, 192, 192),
! V) Z& z4 } N, e4 [. ?. F Fire(384, 48, 192, 192),5 q$ W6 v6 R* ]$ y1 N1 d# c l
Fire(384, 64, 256, 256)," K. J5 p, u3 B, V7 S) M; D
Fire(512, 64, 256, 256), c8 h' Y% f2 o8 k3 l
)! D _. k. u; f; R+ R; ^- A" M+ u2 H
final_conv = nn.Conv2d(512, self.num_classes, kernel_size=1)
# q5 L$ b5 J4 k0 a7 C; M: @self.classifier = nn.Sequential(
* f5 ^7 P& o2 q+ ?- t nn.Dropout(p=0.5),
% R* O: v( l0 s$ s/ e final_conv,1 O- @: q7 S. c2 Y
nn.ReLU(inplace=True),
: h! A D5 U2 c9 | nn.AdaptiveAvgPool2d((1, 1))
) k" D( Q$ y+ P9 v)
. c6 T9 O7 P2 M0 J- l/ q! G: o
+ d- h! B3 P! H/ H1- N' O' z* u+ w' `" \, X# ]2 |5 B
2
6 q& G2 e% s P. i( g- N( y" W3
0 P+ r; a1 B# b8 }! I" R% M' G P4
2 ?" D; q0 w% [; s5: k8 U+ |3 D C! ]' w
61 E; h9 m8 F! g
7& b5 u; f) w$ G8 @! T) i7 U
8
7 _/ f: m; U+ a% P9
8 u. Z1 g* W' D, D- S108 X0 B# S) e6 M0 k. |
11
- }/ x4 `0 B$ E$ w7 J; D) _12
5 A0 g( s, D9 k4 d2 f# ]13! G4 f1 |# R8 v0 O
14
6 T7 L' [* f- n. x, ^ r154 d) c" `3 p' c# J6 g2 ]& ?* \$ y
16
% d2 y% L, K" }! D! G175 V; C$ s. h5 t# B, u
18( C3 o+ z& N5 n1 ^0 l
193 C7 ]* r2 |5 |+ k8 r
201 O( R+ D+ w0 v6 a- O7 }
21: k+ x% |6 i$ c- \5 @
22
) [5 s- ~7 F& C3 l9 `8 ESqueezeNet各层详细参数量及其输入输出如下表所示。
, ] }& K% \# z& Z6 k
4 A7 Y3 b8 z$ W9 T( K8 m3 m5 D. R& Q( |2 d, {' r4 V/ Y8 \* v2 l
4.2.6 其他实现细节
3 P/ c( @, }; @" @$ A8 ~/ u' B, L1×1和3×3卷积的输出宽和高不同,所以3×3卷积设置1个为0的padding, U B3 G3 e% t+ m. R+ h# ]
squeeze和expand层中使用ReLU) `; D( P4 W k1 Y; q0 V( h9 k
在fire9之后的layer中使用ratio为50%的Dropout
% w& c' z" {' s0 T- Y3 @6 G; ?参考NiN算法想法,SqueezeNet中不含全连接层
* y0 u# I6 E0 k1 a/ R训练时,前期学习率设置为0.04,然后线性减少& f y! L/ Q. L
4.2.7 总结; h, v3 K+ }' {0 R+ u3 k: S
本文最主要就是三点:
( h, F# v& [1 b" J* z" B4 X% d" Y5 Q" ^: Q
用1×1卷积代替部分3×3卷积,输出两种卷积级联的结果
( _( |& }# R; e" N减少输入到3×3卷积的特征图的通道数,减少参数量
; g. M0 S$ y1 V% G+ G2 y不过早的使用pool,在网络结构后期再使用pool,这样能提高分类准确率2 P! l" \7 L9 Z% i5 W: C+ l# h0 H
———————————————— \1 @! k; V8 ]$ |/ ]) W y
版权声明:本文为CSDN博主「Mr.小梅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
m* o1 I4 c `; ]# M原文链接:https://blog.csdn.net/qq_39707285/article/details/126498100
1 ?+ x/ T$ _: D# A4 }6 j4 ^1 i. t" e4 ~% m& x9 h/ Y
( E; S5 C- k% e2 F' v
|
zan
|