博客:博客园 | CSDN | blog

写在前面

如题,这篇文章将尝试从卷积拆分的角度看一看各种经典CNN backbone网络module是如何演进的,为了视角的统一,仅分析单条路径上的卷积形式。

形式化

方便起见,对常规卷积操作,做如下定义,

  • \(I\):输入尺寸,长\(H\) 宽\(W\) ,令长宽相同,即\(I = H = W\)
  • \(M\):输入channel数,可以看成是tensor的高
  • \(K\):卷积核尺寸\(K \times K\),channel数与输入channel数相同,为\(M\)
  • \(N\):卷积核个数
  • \(F\):卷积得到的feature map尺寸\(F \times F\),channel数与卷积核个数相同,为\(N\)

所以,输入为\(M \times I \times I\)的tensor,卷积核为\(N \times M \times K \times K\)的tensor,feature map为\(N \times F \times F\)的tensor,所以常规卷积的计算量为

\[FLOPS = K \times K \times M \times N \times F \times F
\]

特别地,如果仅考虑SAME padding且\(stride = 1\)的情况,则\(F = I\),则计算量等价为

\[FLOPS = K \times K \times M \times N \times I \times I
\]

可以看成是\((K \times K \times M) \times (N \times I \times I)\),前一个括号为卷积中一次内积运算的计算量,后一个括号为需要多少次内积运算。

参数量为

\[\#Params = N \times M \times K \times K
\]

网络演化

总览SqueezeNet、MobileNet V1 V2、ShuffleNet等各种轻量化网络,可以看成对卷积核\(M \times K \times K\) 进行了各种拆分或分组(同时引入激活函数),这些拆分和分组通常会减少参数量和计算量,这就为进一步增加卷积核数量\(N\)让出了空间,同时这种结构上的变化也是一种正则,通过上述变化来获得性能和计算量之间的平衡。

这些变化,从整体上看,相当于对原始\(FLOPS = K \times K \times M \times N \times I \times I\)做了各种变换。

下面就从这个视角进行一下疏理,简洁起见,只列出其中发生改变的因子项,

  • Group Convolution(AlexNet),对输入进行分组,卷积核数量不变,但channel数减少,相当于

    \[M \rightarrow \frac{M}{G}
    \]

  • 大卷积核替换为多个堆叠的小核(VGG),比如\(5\times 5\)替换为2个\(3\times 3\),\(7\times 7\)替换为3个\(3\times 3\),保持感受野不变的同时,减少参数量和计算量,相当于把 大数乘积 变成 小数乘积之和,

    \[(K \times K) \rightarrow (k \times k + \dots + k \times k)
    \]

  • Factorized Convolution(Inception V2),二维卷积变为行列分别卷积,先行卷积再列卷积,

    \[(K \times K) \rightarrow (K \times 1 + 1 \times K)
    \]

  • Fire module(SqueezeNet),pointwise+ReLU+(pointwise + 3x3 conv)+ReLU,pointwise降维,同时将一定比例的\(3\times 3\)卷积替换为为\(1 \times 1\),

    \[(K \times K \times M \times N) \rightarrow (M \times \frac{N}{t} + \frac{N}{t} \times (1-p)N + K \times K \times \frac{N}{t} \times pN) \\
    K = 3
    \]

  • Bottleneck(ResNet)pointwise+BN ReLU+3x3 conv+BN ReLU+pointwise,类似于对channel维做SVD,

    \[(K \times K \times M \times N) \rightarrow (M \times \frac{N}{t} + K \times K \times \frac{N}{t} \times \frac{N}{t} + \frac{N}{t} \times N) \\
    t = 4
    \]

  • ResNeXt Block(ResNeXt),相当于引入了group \(3\times 3\) convolution的bottleneck,

    \[(K \times K \times M \times N) \rightarrow (M \times \frac{N}{t} + K \times K \times \frac{N}{tG} \times \frac{N}{t} + \frac{N}{t} \times N) \\
    t = 2, \ G = 32
    \]

  • Depthwise Separable Convolution(MobileNet V1)depthwise +BN ReLU + pointwise + BN ReLU

    相当于将channel维单独分解出去,

    \[(K \times K \times N) \rightarrow (K \times K + N)
    \]

  • Separable Convolution(Xception)pointwise + depthwise + BN ReLU

    也相当于将channel维分解出去,但前后顺序不同(但因为是连续堆叠,其实跟基本Depthwise Separable Convolution等价),同时移除了两者间的ReLU,

    \[(K \times K \times M) \rightarrow (M + K \times K)
    \]

    但实际在实现上是depthwise + pointwise + ReLU。

  • pointwise group convolution and channel shuffle(ShuffleNet)group pointwise+BN ReLU+Channel Shuffle+depthwise+BN+group pointwise+BN,相当于bottleneck中2个pointwise引入相同的group,同时\(3\times 3\) conv变成depthwise,也就是说3个卷积层都group了,这会阻碍不同channel间(分组间)的信息交流,所以在第一个group pointwise后加入了channel shuffle,即

    \[(K \times K \times M \times N) \rightarrow (\frac{M}{G} \times \frac{N}{t} + channel \ shuffle +K \times K \times \frac{N}{t} + \frac{N}{tG} \times N)
    \]

  • Inverted Linear Bottleneck(MobileNet V2),bottleneck是先通过pointwise降维、再卷积、再升维,Inverted bottleneck是先升维、再卷积、再降维,pointwise+BN ReLU6+depthwise+BN ReLU6+pointwise+BN

    \[(K \times K \times M \times N) \rightarrow (M \times tM + K \times K \times tM + tM \times N) \\t = 6
    \]

小结

最后小结一下,早期的CNN由一个个常规卷积层堆叠而成,而后,开始模块化,由一个个 module构成,module的演化,可以看成是不停地在常规卷积的计算量\(FLOPS = K \times K \times M \times N \times I \times I\)上做文章。

  • 拆分:卷积核是个3 D 的tensor,可以在不同维度上进行拆分,行列可拆分,高上也可拆分,高上还可以多段拆分(类似SVD)。
  • 分组:如果多个卷积核放在一起,可以构成4D的tensor,增加的这一数量维上可以分组group。

不同拆分和分组的方式排列组合就构成了各种各样的module。

从卷积拆分和分组的角度看CNN模型的演化的更多相关文章

  1. 聊聊Netty那些事儿之从内核角度看IO模型

    从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...

  2. 对博弈活动中蕴含的信息论原理的讨论,以及从熵角度看不同词素抽象方式在WEBSHELL文本检测中的效果区别

    1. 从赛马说起 0x1:赛马问题场景介绍 假设在一场赛马中有m匹马参赛,令第i匹参赛马获胜的概率为pi,如果第i匹马获胜,那么机会收益为oi比1,即在第i匹马上每投资一美元,如果赢了,会得到oi美元 ...

  3. Android IOS WebRTC 音视频开发总结(四八)-- 从商业和技术的角度看视频行业的机会

    本文主要从不同角度介绍视频行业的机会,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,欢迎关注个人微信公众号blacker ----------------------------- ...

  4. 【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』

    作者:阿里云用户mr_wid ,z)NKt#   @I6A9do   如果感觉该评测对您有所帮助, 欢迎投票给本文: UO<claV   RsfTUb)<   投票标题:  28.[阿里云 ...

  5. [置顶] 从引爆点的角度看360随身wifi的发展

    从引爆点的角度看360随身wifi的发展 不到一个月的时间,随身wifi预定量就数百万.它的引爆点在哪里,为什么相同的产品这么多它却能火起来,通过对随身wifi的了解和我知识层面分析,主要是因为随身w ...

  6. 站在Java的角度看LinkedList

    站在Java的角度看,玩队列不就是玩对象引用对象嘛! public class LinkedList<E> implements List<E>, Deque<E> ...

  7. 从源码的角度看 React JS 中批量更新 State 的策略(下)

    这篇文章我们继续从源码的角度学习 React JS 中的批量更新 State 的策略,供我们继续深入学习研究 React 之用. 前置文章列表 深入理解 React JS 中的 setState 从源 ...

  8. 从线程模型的角度看Netty的高性能

    转载:Netty(二) 从线程模型的角度看 Netty 为什么是高性能的? 传统 IO 在 Netty 以及 NIO 出现之前,我们写 IO 应用其实用的都是用 java.io.* 下所提供的包. 比 ...

  9. INDEX--从数据存放的角度看索引2

    在上次<INDEX--从数据存放的角度看索引>中,我们说到"唯一非聚集索引"和“非唯一非聚集索引”在存储上有一个明显的差别:唯一非聚集索引的非叶子节点上不会包含RID的 ...

随机推荐

  1. 基于 HTML5 WebGL 的高炉炼铁厂可视化系统

    前言       在当今 工业4.0 新时代的推动下,不仅迎来了 工业互联网 的发展,还开启了 5G 时代的新次元.而伴随着带宽的提升,网络信息飞速发展,能源管控上与实时预警在工业互联网中也占着举足轻 ...

  2. Unity 游戏框架搭建 2019 (三十二、三十三) 类的命名 & 代码文件命名

    昨天我们完成了第八个示例的第二个 MenuItem 菜单顺序的调整. 我们今天再往下接着调整. 我们来看下接下来的 MenuItem 代码如下: [MenuItem("QFramework/ ...

  3. python学习笔记(五)---函数与类

    函数 def为定义函数的一个标志 demo1: def greet_user(username): print("Hello, " + username.title() + &qu ...

  4. tp5.1 依赖注入的使用

    参考:概念:https://blog.csdn.net/qq_36172443/article/details/82667427应用: http://www.cnblogs.com/finalandd ...

  5. PHP $_FILES的应用

    关于文件上传这块,如果处理不好的话,很容易成为黑客入侵的开口,例如黑客在你这个上传接口里放一段木马的文件,那只能祝你好运了. 所以,我们上传文件的时候都会先判断, 但是一般的操作是先上传,再判断,如果 ...

  6. thinkphp5--关于多条件查询的分页处理问题

    首先,我们要想搞明白,我们的分页参数起作用的原理: 正在使用的时候的语法: if(!empty($seach)){ $where['user_name|mobile'] = ['like','%'.$ ...

  7. thinkphp5.0--auth权限

    一般auth权限有四个表: think_admin:注册表, think_auth_group_access:用户组明细表(关联), think_auth_group:用户组表, think_arut ...

  8. SOCKET网络基础

  9. 2019-2020-1 20199328《Linux内核原理与分析》第九周作业

    笔记部分 2019/11/12 14:45:44 从CPU和内存的角度看linux系统的运行 CPU角度:首先我们进行了系统调度,然后系统进入内核态,把信息压栈,然后我们进行进程管理,由于进入系统调用 ...

  10. UVA10603 倒水问题 Fill

    伫倚危楼风细细,望极春愁,黯黯生天际.草色烟光残照里,无言谁会凭阑意. 拟把疏狂图一醉,对酒当歌,强乐还无味.衣带渐宽终不悔,为伊消得人憔悴.--柳永 题目:倒水问题 网址:https://onlin ...