QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2889|回复: 0
打印 上一主题 下一主题

[其他资源] 轻量级神经网络算法-SqueezeNet

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-5 16:42 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    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
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-13 13:53 , Processed in 0.546022 second(s), 50 queries .

    回顶部