0


GHostNet网络最通俗易懂的解读【不接受反驳】

文章目录

前沿知识

在介绍GHostNet网络之前,我们首先回顾一下分组卷积和深度可分离卷积。

分组卷积

在这里插入图片描述

假设input.shape = [

  1. C
  2. 1
  3. C_1
  4. C1​, H, W] output.shape =
  5. [
  6. C
  7. 2
  8. ,
  9. H
  10. 1
  11. ,
  12. W
  13. 1
  14. ]
  15. [C_2, H^1, W^1]
  16. [C2​,H1,W1]

输入每组feature map尺寸

  1. W
  2. ×
  3. H
  4. ×
  5. C
  6. 1
  7. g
  8. W×H× \frac {C_1} {g}
  9. W×H×gC1​​ ,共有g组。

单个卷积核每组的尺寸

  1. k
  2. ×
  3. k
  4. ×
  5. C
  6. 2
  7. g
  8. k×k×\frac {C_2} {g}
  9. k×k×gC2​​,一个卷积核被分成了g组。

输出feature map尺寸

  1. W
  2. 1
  3. ×
  4. H
  5. 1
  6. ×
  7. g
  8. W^1×H^1×g
  9. W1×H1×g,共生成gfeature map

**

  1. 现在我们计算一下分组卷积时的参数量和运算量:

**
参数量

  1. p
  2. a
  3. r
  4. a
  5. m
  6. s
  7. =
  8. k
  9. 2
  10. ×
  11. C
  12. 1
  13. g
  14. ×
  15. C
  16. 2
  17. g
  18. ×
  19. g
  20. =
  21. k
  22. 2
  23. C
  24. 1
  25. g
  26. C
  27. 2
  28. params=k^2×\frac {C_1} {g\frac{C_2}{g}\times g=k^2\frac{C_1}{g} C_2
  29. params=k2×gC1​​×gC2​​×g=k2gC1​​C2

运算量

  1. F
  2. L
  3. O
  4. P
  5. s
  6. =
  7. k
  8. 2
  9. ×
  10. C
  11. 1
  12. g
  13. C
  14. 2
  15. ×
  16. W
  17. 1
  18. ×
  19. H
  20. 1
  21. =
  22. k
  23. 2
  24. C
  25. 1
  26. g
  27. C
  28. 2
  29. W
  30. 1
  31. H
  32. 1
  33. FLOPs=k^2×\frac {C_1} {g} C_2×W^1×H^1=k^2\frac{C_1}{g} C_2W^1H^1
  34. FLOPs=k2×gC1​​C2​×W1×H1=k2gC1​​C2W1H1
  • 分析: 利用分层过滤组提高CNN效率论文地址 官方分析:Alex认为group conv的方式能够增加 filter之间的对角相关性,而且能够减少训练参数,不容易过拟合,这类似于正则的效果。
  • 代码实现(pytorch提供了相关参数,以2d为例)
  1. import torch
  2. import torch.nn as nn
  3. ...
  4. model = nn.Conv2d(in_channels = in_channel, out_channels = out_channel,
  5. kernel_size = kernel_size, stride = stride, padding =1, dilation = dilation, group = group_num)

通过上述的代码我们可以清楚的看见

  1. 分组卷积

就做了一次卷积。

深度可分离卷积

在这里插入图片描述在这里插入图片描述
MobileNets:论文地址
深度可分离卷积是MobileNet的精髓,它由deep_wise卷积和point_wise卷积两部分组成。我以前一直觉得深度可分离卷积是极端化的分组卷积(把group数量设为Cin个就行)。但今天再次思考一下,发现他们很大的不同在于,分组卷积只进行一次卷积(一个nn.Conv2d即可实现),不同group的卷积结果concat即可,而深度可分离卷积是进行了两次卷积操作,第一次先进行deep_wise卷积(即收集每一层的特征),kernel_size = KK1,第一次卷积总的参数量为KKCin,第二次是为了得到Cout维度的输出,kernel_size = 11Cin,第二次卷积总的参数量为11Cin*Cout。第二次卷积输出即为深度可分离卷积的输出。

  • 举例

举个例子比较参数量:假设input.shape = [

  1. c
  2. 1
  3. c_1
  4. c1​, H, W] output.shape = [
  5. c
  6. 2
  7. c_2
  8. c2​, H, W]

(a)常规卷积参数量=

  1. k
  2. ×
  3. k
  4. ×
  5. c
  6. 1
  7. ×
  8. c
  9. 2
  10. k \times k \times c_1 \times c_2
  11. k×k×c1​×c2

(b)深度可分离卷积参数量=

  1. k
  2. ×
  3. k
  4. ×
  5. c
  6. 1
  7. +
  8. 1
  9. ×
  10. 1
  11. ×
  12. c
  13. 1
  14. ×
  15. c
  16. 2
  17. k \times k \times c1 + 1\times1\times c_1\times c_2
  18. k×k×c1+1×1×c1​×c2
  1. 上面的例子我们可以清楚地看到,得到相同的output.shape,直观看上去,深度可分离卷积的参数量比常规卷积少了一个数量级。
  • 代码实现(pytorch)
  1. import torch
  2. import torch.nn as nn
  3. ...
  4. model = nn.Sequential(
  5. nn.Conv2d(in_channels = in_channel, out_channels = in_channel,
  6. kernel_size = kernel_size, stride = stride, padding =1, dilation = dilation, group = in_channel),
  7. nn.Conv2d(in_channels = in_channel, out_channels = out_channel kernel_size =1, padding =0))

之所以在写在前面中提到,本文的题目一定要先是分组卷积再是深度可分离卷积,因为在我看来后者是前者的极端情况(分组卷积的

  1. g
  2. r
  3. o
  4. u
  5. p
  6. group
  7. group设为
  8. i
  9. n
  10. c
  11. h
  12. a
  13. n
  14. n
  15. e
  16. l
  17. in_channel
  18. inchannel,即每组的channel数量为1),尽管形式上两者有比较大的差别:分组卷积只进行一次卷积操作即可,而深度可分离卷积需要进行两次——先
  19. d
  20. e
  21. p
  22. t
  23. h
  24. w
  25. i
  26. s
  27. e
  28. depth-wise
  29. depthwise
  30. p
  31. o
  32. i
  33. n
  34. t
  35. w
  36. i
  37. s
  38. e
  39. point-wise
  40. pointwise卷积,但他们本质上是一样的。
  1. 深度可分离卷积进行一次卷积是无法达到输出指定维度的tensor的,这是由它将group设为in_channel决定的,输出的tensor通道数只能是in_channel,不能达到要求,所以又用了1*1的卷积改变最终输出的通道数。

这样的想法也是自然而然的,

  1. B
  2. o
  3. t
  4. t
  5. l
  6. e
  7. N
  8. e
  9. c
  10. k
  11. BottleNeck
  12. BottleNeck不就是先1*1卷积减少参数量再
  13. 3
  14. ×
  15. 3
  16. 3\times 3
  17. 3×3卷积feature map,最后再1*1恢复原来的通道数,所以
  18. B
  19. o
  20. t
  21. t
  22. l
  23. e
  24. N
  25. e
  26. c
  27. k
  28. BottleNeck
  29. BottleNeck的目的就是减少参数量。提到BottleNeck结构就是想说明1*1卷积经常用来改变通道数。

GHostNet网络

GHostNet论文地址
如下图所示,是由ResNet-50中的第一个残差块生成的某些中间特征图的可视化。从图中我们可以看出,这里面有很多特征图是具有高度相似性的(在图中分别用不同的颜色示意),换句话说,就是存在许多的冗余特征图。所以从另一个角度想,我们是不是可以利用一系列的线性变化,以很小的代价生成许多能从原始特征发掘所需信息的“幻影”特征图呢?(冗余的特征图是非常有必要的,可以保证网络对输入数据的理解更为全面。)这个便是整篇文章的核心思想。

在这里插入图片描述

如下图,我把Ghost-Module分成三个部分:

  • 第一部分就是一个普通的卷积操作,但是我们并没有把其的通道设置的很大,我们假设其输出通道数为 m ( m < n ) m(m<n) m(m<n), n n n为 O u t p u t Output Output输出的通道数。
  • 第二部分就是一个分组卷积操作,记住是分组卷积,很多博主写的是深度可分离卷积操作,上面我也提到了深度可分离卷积是分两步操作的,但是这里的代码就是一次卷积,这样就好理解了。通过第二部分的分组卷积操作我们可以得到 O u t p u t Output Output输出特征图下面红的的一部分特征图。
  • 第三部分Identity,这个就很好理解了,就是把由第一部分卷积得到的通道数为 m m m的特征图与第二部分分组卷积得到的通道数为 ( m − 1 ) s (m-1)s (m−1)s的通道数相加。在这里插入图片描述 其中, Φ i Φ_i Φi​ 为线性变换。实际操作中 Φ i Φ_i Φi​ 的变换方法不固定,可以是 3x3 线性核或者 5x5 线性核(其实有点类似深度卷积思想,但不同的是深度卷积前后的通道数相同,而这里 Φ i Φ_i Φi​ 可以产生所需要的通道数,并且可以对同一通道特征图进行多次线性变换【其实当 s 取 2 时, Φ i Φ_i Φi​ 就是原原本本的深度卷积】)。另外,理论上可以使用不同尺寸大小的卷积核组合进行线性变换操作,但考虑到 CPU 或 GPU 的推理情况,作者建议全部使用 3x3 卷积核或全部使用 5x5 卷积核。

代码

本张图片来自GhostNet 详解,首先我们可以知道Output的输出通道数为

  1. n
  2. n
  3. n,通过
  1. 第一部分卷积

后的通道数为

  1. m
  2. =
  3. n
  4. s
  5. m = \frac{n}{s}
  6. m=sn​,通过
  1. 第二部分

得到的输出通道为

  1. m
  2. ×
  3. (
  4. s
  5. 1
  6. )
  7. =
  8. n
  9. s
  10. m\times(s-1) = \frac{n}{s}
  11. m×(s1)=sn​,那么再通过
  1. 第三步
  1. I
  2. d
  3. e
  4. n
  5. t
  6. i
  7. t
  8. y
  9. Identity
  10. Identity恒等映射把前面两部得到的特征图按通道数(dim = 1)进行相加,这样我们就可以得到
  11. O
  12. u
  13. t
  14. p
  15. u
  16. t
  17. Output
  18. Output输出特征图且通道数为(
  19. c
  20. h
  21. a
  22. n
  23. n
  24. e
  25. l
  26. =
  27. m
  28. +
  29. m
  30. ×
  31. (
  32. s
  33. 1
  34. )
  35. =
  36. s
  37. ×
  38. m
  39. channel = m + m\times(s - 1) = s\times m
  40. channel=m+m×(s1)=s×m),又因为
  41. m
  42. =
  43. n
  44. s
  45. m = \frac{n}{s}
  46. m=sn​,所以输出通道数还是
  47. n
  48. n
  49. n

在这里插入图片描述

GHost Module比普通卷积的优点

在这里插入图片描述

GHost Module模块

在这里插入图片描述
在一个 G-bneck 中存在两个 Ghost module ,其中第一个 Ghost module 用于增加通道数(expansion layer),指定输出和输入通道数之间的比例为扩张比。第二个 Ghost module 减少通道数以匹配 shortcut 分支的通道。当步长为 2 时,在两个 Ghost module 中间加入一个步长为 2 的深度卷积层。

参数量对比

在这里插入图片描述

GHostNet网络结构

在这里插入图片描述


本文转载自: https://blog.csdn.net/weixin_54546190/article/details/126439207
版权归原作者 ☞源仔 所有, 如有侵权,请联系我们删除。

“GHostNet网络最通俗易懂的解读【不接受反驳】”的评论:

还没有评论