QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2917|回复: 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

    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
    转播转播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-6-12 18:08 , Processed in 0.570722 second(s), 50 queries .

    回顶部