科技小数据深度学习——卷积神经网络中十大令人拍案叫绝的操作


前言
CNN从2012年的AlexNet发展至今 , 科学家们发明出各种各样的CNN模型 , 一个比一个深 , 一个比一个准确 , 一个比一个轻量 。 下面会对近几年一些具有变革性的工作进行简单盘点 , 从这些充满革新性的工作中探讨日后的CNN变革方向 。
卷积只能在同一组进行吗
Group convolution 分组卷积 , 最早在AlexNet中出现 , 由于当时的硬件资源有限 , 训练AlexNet时卷积操作不能全部放在同一个GPU处理 , 因此作者把feature maps分给多个GPU分别进行处理 , 最后把多个GPU的结果进行融合 。
科技小数据深度学习——卷积神经网络中十大令人拍案叫绝的操作
本文插图
Alexnet
分组卷积的思想影响比较深远 , 当前一些轻量级的SOTA(State Of The Art)网络 , 都用到了分组卷积的操作 , 以节省计算量 。 但题主有个疑问是 , 如果分组卷积是分在不同GPU上的话 , 每个GPU的计算量就降低到 1/groups , 但如果依然在同一个GPU上计算 , 最终整体的计算量是否不变?找了pytorch上有关组卷积操作的介绍 , 望读者解答我的疑问 。
科技小数据深度学习——卷积神经网络中十大令人拍案叫绝的操作
本文插图
关于这个问题 , 知乎用户朋友 @蔡冠羽 提出了他的见解:
我感觉group conv本身应该就大大减少了参数 , 比如当input channel为256 , output channel也为256 , kernel size为3*3 , 不做group conv参数为256*3*3*256 , 若group为8 , 每个group的input channel和output channel均为32 , 参数为8*32*3*3*32 , 是原来的八分之一 。 这是我的理解 。
我的理解是分组卷积最后每一组输出的feature maps应该是以concatenate的方式组合 , 而不是element-wise add , 所以每组输出的channel是 input channels / #groups , 这样参数量就大大减少了 。
卷积核一定越大越好吗
AlexNet中用到了一些非常大的卷积核 , 比如11×11、5×5卷积核 , 之前人们的观念是 , 卷积核越大 , receptive field(感受野)越大 , 看到的图片信息越多 , 因此获得的特征越好 。 虽说如此 , 但是大的卷积核会导致计算量的暴增 , 不利于模型深度的增加 , 计算性能也会降低 。 于是在VGG(最早使用)、Inception网络中 , 利用2个3×3卷积核的组合比1个5×5卷积核的效果更佳 , 同时参数量(3×3×2+1 VS 5×5×1+1)被降低 , 因此后来3×3卷积核被广泛应用在各种模型中 。
科技小数据深度学习——卷积神经网络中十大令人拍案叫绝的操作
本文插图
每层卷积的卷积核尺寸需相同吗
传统的层叠式网络 , 基本上都是一个个卷积层的堆叠 , 每层只用一个尺寸的卷积核 , 例如VGG结构中使用了大量的3×3卷积层 。 事实上 , 同一层feature map可以分别使用多个不同尺寸的卷积核 , 以获得不同尺度的特征 , 再把这些特征结合起来 , 得到的特征往往比使用单一卷积核的要好 , 谷歌的GoogleNet , 或者说Inception系列的网络 , 就使用了多个卷积核的结构:
科技小数据深度学习——卷积神经网络中十大令人拍案叫绝的操作
本文插图
最初版本的Inception结构
如上图所示 , 一个输入的feature map分别同时经过1×1、3×3、5×5的卷积核的处理 , 得出的特征再组合起来 , 获得更佳的特征 。 但这个结构会存在一个严重的问题:参数量比单个卷积核要多很多 , 如此庞大的计算量会使得模型效率低下 。 这就引出了一个新的结构 。
怎样才能减少卷积层参数量
发明GoogleNet的团队发现 , 如果仅仅引入多个尺寸的卷积核 , 会带来大量的额外的参数 , 受到Network In Network中1×1卷积核的启发 , 为了解决这个问题 , 他们往Inception结构中加入了一些1×1的卷积核 , 如图所示:


推荐阅读