首页 > 编程知识 正文

卷积核如何确定(卷积核计算)

时间:2023-05-04 15:34:08 阅读:92713 作者:3798

雷锋网押:本论文作者Professor ho,原文登在其知乎主页上,雷锋网经其授权公布。

从2012年AlexNet的发展到现在,科学家们发明了各种各样的CNN模型。 一个深一个深,一个准确,一个轻便。 对这几年的转型工作进行简单盘点,从这些创新工作中探讨未来CNN转型的方向。

注:由于水平有限,以下见解可能有偏颇。 请用奇怪的眼光指出。 另外,只介绍代表性的模型。 几个有名的模型原理相同,所以不介绍。 如果有遗漏的话请指出。

一、卷积只能在同一组进行吗?-- Group convolution

组聚合包卷积最先在AlexNet上出现。 由于当时的硬件资源有限,在训练AlexNet时无法用同一个GPU处理所有的卷积操作。 为此,作者将feature maps分成多个GPU分别处理,最后将多个GPU的结果进行了融合。

亚历克斯内特

组卷积的思想影响比较深,目前一些轻量级sota(stateoftheart )网络使用组卷积的操作来节省计算量。 但是,题主有这样的疑问,在分组卷积分为不同的GPU的情况下,每个GPU的计算量会下降到1/groups,但是如果用相同的GPU进行计算,最终整体的计算量会不会发生变化? 我希望读者能在pytorch上寻找关于卷积操作的介绍,回答我的疑问。

py troch千兆网

编辑:

关于这个问题,用户朋友@多情的母鸡提出了他的见解:

group conv本身觉得应该大幅减少参数。 例如,如果输入通道是256,输出通道也是256,kernel size是3*3,不进行组连接的参数是256*3*3*256,组是8,这是我的理解。 我的理解是,对于卷积的最后一个组,输出的feature maps需要作为concatenate而不是element-wise add进行组合,因此每个组输出的channel是输入channels//

二、卷积核一定越大越好?-- 33卷积核

AlexNet使用了非常大的卷积核,如1111、55的卷积核等。 以前,人们认为卷积核越大,接收场就越大,图像信息就越多,所以得到的特征越好。 尽管如此,大的卷积核会导致计算量的激增,不利于模型深度的增加,计算性能也会下降。 因此,在VGG (最初使用的)、Inception网络中,利用2个33卷积核的组合比1个55卷积核更有效,同时参数量) 32 ) 1vs 5

三、每层卷积只能用一种尺寸的卷积核?-- Inception结构

传统的层叠型网络,基本上是一个个的卷积层的层叠,每个层只使用一个尺寸的卷积核。 例如,在VGG结构中使用了大量的33卷积层。 实际上,同一层的特征图可以使用不同大小的多个卷积核来获得不同比例的特征。 此外,这些特征的组合往往比使用单个卷积核更好。 谷歌的谷歌网络或Inception系列网络使用了多个卷积核心的结构:

第一个版本的Inception结构

如上图所示,通过将一个输入feature map分别同时经过11、33、55的卷积内核处理获得的特征进一步组合,可以获得更好的特征。 但是,这个结构有严重的问题。 参数比单个卷积核多得多,这样庞大的计算量会使模型效率低下。 这引出了一种新的结构:

发明

四、怎样才能减少卷积层参数量?-- Bottleneck

谷歌网络的团队,如果只导入多个大小的卷积核,就会受到网络中11的卷积核的启发,为了解决这个问题,如图所示,在Inception结构中加入了11的卷积核

放入11卷积核的Inception结构

根据上图,试着进行比较计算吧。 假设输入到feature map的维是256维,需要输出维

也是256维。有以下两种操作:

256维的输入直接经过一个3×3×256的卷积层,输出一个256维的feature map,那么参数量为:256×3×3×256 = 589,824

256维的输入先经过一个1×1×64的卷积层,再经过一个3×3×64的卷积层,最后经过一个1×1×256的卷积层,输出256维,参数量为:256×1×1×64 + 64×3×3×64 + 64×1×1×256 = 69,632。足足把第一种操作的参数量降低到九分之一!

1×1卷积核也被认为是影响深远的操作,往后大型的网络为了降低参数量都会应用上1×1卷积核。

五、越深的网络就越难训练吗?-- Resnet残差网络

ResNet skip connection

传统的卷积层层叠网络会遇到一个问题,当层数加深时,网络的表现越来越差,很大程度上的原因是因为当层数加深时,梯度消散得越来越严重,以至于反向传播很难训练到浅层的网络。为了解决这个问题,sldjy大神想出了一个“残差网络”,使得梯度更容易地流动到浅层的网络当中去,而且这种“skip connection”能带来更多的好处,这里可以参考一个PPT:极深网络(ResNet/DenseNet): Skip Connection为何有效及其它,以及我的一篇文章:为什么ResNet和DenseNet可以这么深?一文详解残差块为何能解决梯度弥散问题。大家可以结合下面的评论进行思考。

六、卷积操作时必须同时考虑通道和区域吗?-- DepthWise操作

标准的卷积过程可以看上图,一个2×2的卷积核在卷积时,对应图像区域中的所有通道均被同时考虑,问题在于,为什么一定要同时考虑图像区域和通道?我们为什么不能把通道和空间区域分开考虑?

Xception网络就是基于以上的问题发明而来。我们首先对每一个通道进行各自的卷积操作,有多少个通道就有多少个过滤器。得到新的通道feature maps之后,这时再对这批新的通道feature maps进行标准的1×1跨通道卷积操作。这种操作被称为 “DepthWise convolution”,缩写“DW”。

这种操作是相当有效的,在imagenet 1000类分类任务中已经超过了InceptionV3的表现,而且也同时减少了大量的参数,我们来算一算,假设输入通道数为3,要求输出通道数为256,两种做法:

1.直接接一个3×3×256的卷积核,参数量为:3×3×3×256 = 6,912

2.DW操作,分两步完成,参数量为:3×3×3 + 3×1×1×256 = 795,又把参数量降低到九分之一!

因此,一个depthwise操作比标准的卷积操作降低不少的参数量,同时论文中指出这个模型得到了更好的分类效果。

EDIT:2017.08.25

本文在发出12小时后,一位知乎用户私信了我,向我介绍了Depthwise和Pointwise的历史工作,而Xception和Mobilenet也引用了他们16年的工作,就是Min Wang et al 的Factorized Convolutional Neural Networks,这篇论文的Depthwise中,每一通道输出的feature map(称为“基层”)可以不止一个,而Xception中的Depthwise separable Convolution, 正是这篇工作中“单一基层”的情况。推荐有兴趣的读者关注下他们的工作,这里有篇介绍博文:【深度学习】卷积层提速Factorized Convolutional Neural Networks。而最早关于separable convolution的介绍,Xception作者提到,应该追溯到Lau- rent Sifre 2014年的工作Rigid-Motion Scattering For Image Classification6.2章节。

七、分组卷积能否对通道进行随机分组?-- ShuffleNet

在AlexNet的Group Convolution当中,特征的通道被平均分到不同组里面,最后再通过两个全连接层来融合特征,这样一来,就只能在最后时刻才融合不同组之间的特征,对模型的泛化性是相当不利的。为了解决这个问题,ShuffleNet在每一次层叠这种Group conv层前,都进行一次channel shuffle,shuffle过的通道被分配到不同组当中。进行完一次group conv之后,再一次channel shuffle,然后分到下一层组卷积当中,以此循环。

来自ShuffleNet论文

经过channel shuffle之后,Group conv输出的特征能考虑到更多通道,输出的特征自然代表性就更高。另外,AlexNet的分组卷积,实际上是标准卷积操作,而在ShuffleNet里面的分组卷积操作是depthwise卷积,因此结合了通道洗牌和分组depthwise卷积的ShuffleNet,能得到超少量的参数以及超越mobilenet、媲美AlexNet的准确率!

另外值得一提的是,微软亚洲研究院MSRA最近也有类似的工作,他们提出了一个IGC单元(Interleaved Group Convolution),即通用卷积神经网络交错组卷积,形式上类似进行了两次组卷积,Xception 模块可以看作交错组卷积的一个特例,特别推荐看看这篇文章:可耐的洋葱详解ICCV 2017入选论文:通用卷积神经网络交错组卷积

要注意的是,Group conv是一种channel分组的方式,Depthwise +Pointwise是卷积的方式,只是ShuffleNet里面把两者应用起来了。因此Group conv和Depthwise +Pointwise并不能划等号。

八、通道间的特征都是平等的吗? -- SEnet

无论是在Inception、DenseNet或者ShuffleNet里面,我们对所有通道产生的特征都是不分权重直接结合的,那为什么要认为所有通道的特征对模型的作用就是相等的呢? 这是一个好问题,于是,ImageNet2017 冠军SEnet就出来了。

SEnet 结构

一组特征在上一层被输出,这时候分两条路线,第一条直接通过,第二条首先进行Squeeze操作(Global Average Pooling),把每个通道2维的特征压缩成一个1维,从而得到一个特征通道向量(每个数字代表对应通道的特征)。然后进行Excitation操作,把这一列特征通道向量输入两个全连接层和sigmoid,建模出特征通道间的相关性,得到的输出其实就是每个通道对应的权重,把这些权重通过Scale乘法通道加权到原来的特征上(第一条路),这样就完成了特征通道的权重分配。作者详细解释可以看这篇文章:专栏 | Momenta详解ImageNet 2017夺冠架构SENet

九、能否让固定大小的卷积核看到更大范围的区域?-- Dilated convolution

标准的3×3卷积核只能看到对应区域3×3的大小,但是为了能让卷积核看到更大的范围,dilated conv使其成为了可能。dilated conv原论文中的结构如图所示:

上图b可以理解为卷积核大小依然是3×3,但是每个卷积点之间有1个空洞,也就是在绿色7×7区域里面,只有9个红色点位置作了卷积处理,其余点权重为0。这样即使卷积核大小不变,但它看到的区域变得更大了。详细解释可以看这个回答:如何理解空洞卷积(dilated convolution)?

十、卷积核形状一定是矩形吗?-- Deformable convolution 可变形卷积核

图来自微软亚洲研究院公众号

传统的卷积核一般都是长方形或正方形,但MSRA提出了一个相当反直觉的见解,认为卷积核的形状可以是变化的,变形的卷积核能让它只看感兴趣的图像区域 ,这样识别出来的特征更佳。

图来自微软亚洲研究院公众号。要做到这个操作,可以直接在原来的过滤器前面再加一层过滤器,这层过滤器学习的是下一层卷积核的位置偏移量(offset),这样只是增加了一层过滤器,或者直接把原网络中的某一层过滤器当成学习offset的过滤器,这样实际增加的计算量是相当少的,但能实现可变形卷积核,识别特征的效果更好。详细MSRA的解读可以看这个链接:可变形卷积网络:计算机新“视”界。

启发与思考

现在越来越多的CNN模型从巨型网络到轻量化网络一步步演变,模型准确率也越来越高。现在工业界追求的重点已经不是准确率的提升(因为都已经很高了),都聚焦于速度与准确率的trade off,都希望模型又快又准。因此从原来AlexNet、VGGnet,到体积小一点的Inception、Resnet系列,到目前能移植到移动端的mobilenet、ShuffleNet(体积能降低到0.5mb!),我们可以看到这样一些趋势:

卷积核方面:

大卷积核用多个小卷积核代替;

单一尺寸卷积核用多尺寸卷积核代替;

固定形状卷积核趋于使用可变形卷积核;

使用1×1卷积核(bottleneck结构)。

卷积层通道方面:

标准卷积用depthwise卷积代替;

使用分组卷积;

分组卷积前使用channel shuffle;

通道加权计算。

卷积层连接方面:

使用skip connection,让模型更深;

densely connection,使每一层都融合上其它层的特征输出(DenseNet)

启发

类比到通道加权操作,卷积层跨层连接能否也进行加权处理?bottleneck + Group conv + channel shuffle + depthwise的结合会不会成为以后降低参数量的标准配置?

如果你有更多的想法或意见,欢迎评论留言,好的idea值得交流传播。另外本人的简书号是:人工智豪 - 简书 ,简书上会发一些比较技术性的文章,如GPU降温等,知乎上会发比较理论性的见解文章,欢迎关注。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。