博客:博客园 | 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. 解决项目迁移至Kubernetes集群中的代理问题

    解决项目迁移至Kubernetes集群中的代理问题 随着Kubernetes技术的日益成熟,越来越多的企业选择用Kubernetes集群来管理项目.新项目还好,可以选择合适的集群规模从零开始构建项目: ...

  2. PHP函数:array_key_exists

    array_key_exists()  - 检查数组里是否有指定的键名或索引. 注意:array_key_exists() 仅仅搜索第一维的键. 多维数组里嵌套的键不会被搜索到. 说明: rray_k ...

  3. Mysql使用终端操作数据库

      使用终端操作数据库       1.如何查看有什么数据库?     show databases;        2.如何选择数据库?    use databasesName;       3. ...

  4. eclipse git 文件状态 及git分支的创建与合并与删除

    eclipse里面Git文件状态及图标展示   EGit会出现如下图标,其对应状态及意义如下:      1)忽略[ ignored ]:仓库认为该文件不存在(如bin目录,不需要关注).通过右键Te ...

  5. SringMVC入门程序

    Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架 1.Spring优点 轻量级,简单易学 高效 , 基于请求响应的MVC框架 与Spring兼 ...

  6. 使用STM8S i2c对TPS65987寄存器进行读写

    上图是TPS65987的i2c读写协议,和标准i2c协议有点出入,不过也不难理解,在读的时候i2c slave在发送数据过来之前会先发送1byte数据表示后面会有几个字节数据过来,在写的时候i2c h ...

  7. QtConcurrent::run 运行类的成员函数

    https://stackoverflow.com/questions/2152355/is-it-possible-to-use-qtconcurrentrun-with-a-function-me ...

  8. OSG加载倾斜摄影数据

    目录 1. 概述 2. 实例 2.1. 代码 2.2. 解析 3. 结果 1. 概述 ContextCapture(Smart3D)生成的倾斜摄影模型数据一般都形如如下组织结构: 在Data目录下包含 ...

  9. 这个linux命令能让时光倒流!你不知道的date隐藏用法

    文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 今天给项目写了个脚本需要获取前一天的时间,本来先获取今天的然后减一下, ...

  10. 前端跨域解决方案: JSONP的通俗解说和实践

     对于前端开发者而言,跨域是一个绕不开的话题.只有真正明白了各种方案的工作机制,才能针对性地进行跨域方案选型.本文将以探索者的视角,试图用最通俗的语言对一种"鼎鼎大名"的跨域解决方 ...