一点就分享系列(理解篇)浅析CV中的1*1卷积的“前世今生”

一点就分享系列(理解篇)——浅析CV中的1*1卷积的“前世今生”

大家好,我是啥都会一点的搬砖工小程,今天第一篇分享下自己平时积累的东西,初来乍到,先来篇入门,白话叙述,加深理解,欢迎大佬指正、交流,纯属分享。后面有空会更新自己的工程篇哈.


前言

DL在CV领域各种成熟应用之余,SOTA级的模型在视觉任务中部署已逐渐成熟,五花八门的部署我想博客上已经有很多了,当然自己后续也会更新 自己的实践篇,为了不让萌新提到CV只会炼丹,特别是现在工程部署和优化大热之余,对于入门者是否应该冷静下回归原点,好好研究其中每一个基础点呢?这也是理论能唯一令我兴奋的地方,针对于1*1卷积操作,因水平有限,出于自身理解从头“解剖”,过程中会尽量解释到涉及的点,篇幅和个人精力有限!主要从卷积在CV的用处和对1x1的操作上来理解,便于大家阅读理解(即使萌新也可以看懂),不当之处接受批评指正


一、卷积理解的“白话”

谈到1*1卷积,我想不少人都会直观想到它在CNN中的作用:featuremap的特征升维或者降维,那么先理解下CNN中的卷积操作(这里抛开信号处理上的解释,容我水一下):
因为数学公式是绝对严谨的,所以先说明白基础的卷积操作!局部连接和参数共享是卷积操作在CNN中的特点,但是我们需要明白图像的"卷积"其实和我们在数学中接触的“卷积”并不完全一样;曾有人在讨论中多次提及为什么Tensorflow等DL库中并没有严格按照书上的公式进行卷积操作?差距就是那个180度翻转?
如下手写图所示,首先,在泛函分析中,通过两个函数f和g生成第三个函数的数学算子,表征函数f与经过翻转和平移的g的重叠部分的累积。实际上,现在大部分的深度学习教程中都把卷积定义为图像矩阵和卷积核的按位点乘“加权求和”。严格说应该是互相关,而真正“卷积”需要把卷积核顺时针旋转180度然后再做点乘,简单来说,数学中的卷积,需要将“卷积核”进行旋转;而卷积神经网络中的卷积核由于参数是需要训练学习的,并不需要反转这个操作,也就是说我们在CNN中的卷积操作其实就是互相关函数,为什么不需要反翻转操作了呢?狠简单,因为CNN核是通过训练学习参数,是未知(在代码中初始参数是我们自定义的初始化);而数学公式的参数是已知求未知!也就是关注于提取特征而迭代得到参数,这也是深度学习的训练目的。

一点就分享系列(理解篇)浅析CV中的1*1卷积的“前世今生”
通过公式分析,那么这个直线其实恰巧说明了卷积是怎么“卷”的!!!!一个复杂的函数沿着这个直线卷,最终实现了降维,也是符合数学的"化繁为简"的转化思想。(对于机器学习来说我个人感悟就是怎么样更好地解决非线性问题,如何更巧妙的转换线性操作)嘿嘿,卷完了呢?当然是为计算啊哈哈,为嘛呢?如果说以上概念不管是特征提取还是“加权求和”都不够让你明白为什么要做卷积和怎样做卷积??真的没关系,杀手锏我都写纸上了!!!!!那么我就来一个不够严谨但助于理解的解释!参考下图~:
一点就分享系列(理解篇)浅析CV中的1*1卷积的“前世今生”
嘿嘿,没错,你可以统称为大饼夹一切!!这就是眼下你要解决的问题,如图所示(熟悉的四个字…),大饼上有各种丰富的吃的嘿嘿,那么问题来了,怎么吃呢?是卷着吃?为什么你要卷着吃呢?好处是什么呢?不卷着吃是什么样子呢?这就让你联想成你对图像为什么要做卷积,只有你卷起来吃,你才能更好地以一个便捷的方式提取味道细节,这就是你要把大饼卷起来吃,并且你开始卷大饼的位置就是那个直线啊(X+Y=Z)!!!!方便且你可以尝到更丰富的加权味道(特征提取),哈哈!!!!!不,不需要总结了,懂得自然懂,不懂去买一套吃!
怎么做呢?CNN是在提取图像的每个局部函数f(感受野)范围和卷积核函数g的互相关函数!自然用于图像处理中的滤波(图像局部区域内的中心像素与局部临近做平均)和边缘提取(图像局部区域内的中心像素复制后,减去局部临近像素,这样差距较大的边缘位置像素值不会为0,边缘就得到了),两者就是矩阵中的值不一样,计算结果不同。

二、1*1卷积“来了”

到此,开始1x1卷积的分析,开篇提到的升维和降维都是直观理解,我第一次知道这个是在谷歌的Inception模块中了解到的,那时候只知道减少参数量…在CNN之前都是全连接的神经网络(卷积就是限定范围的全连接,比如3x3的卷积就是取9个像素的所有通道进行全连接,输出的神经元数量就等于输出的通道数。1x1卷积就是对应像素通道之间的全连接,不加入周围的像素的通道,能提升通道的特征抽象能力。)
首先说改变维度这点,池化负责特征图宽和高;而1x1卷积是对通道改变维度;恰好和刚说的1x1卷积就是对通道的方向做一次全连接对上了!在做通道降维的时候,其实信息也得到了融合(线性计算),这是池化做不到的。
其次,配合非线性**函数Relu以及变体等,保持feature map 尺寸不变的前提下增加非线性特性,把网络深度扩展!这也是和BN层的优化很有关系(这里不展开讨论,不想水了)。好奇小白会问为啥不用全连接?(全连接层的输入尺寸是固定的,因为全连接层的参数个数取决于图像大小。而卷积层的输入尺寸是任意的,因为卷积核的参数个数与图像大小无关。)同理,升维也是同样的通道线性组合,我举个例子呗,以Resnet残差计算来说明:
N层输入为X,那么输出为F(X). 下一层N+1自然是X+F(X).如下所示,输出维度无变化,这时候输入X和输出F(X),可以直接相加!
如下(示例):

一点就分享系列(理解篇)浅析CV中的1*1卷积的“前世今生”
这时候N+1输入和输出维度不同,则就要用到维度上增加,(55x55x64)经过1x1卷积核得到55x55x128,再池化为27x27x128,就可以直接相加!
一点就分享系列(理解篇)浅析CV中的1*1卷积的“前世今生”

总结

没,没有总结了!看到这里的你我不需要总结,你肯定明白。随笔一篇,为分享而分享,也记录下希望能加深理解。第一次写,进行简单直白的解读,希望对读者们有点帮助,看到这里的朋友感谢阅读,后续(啥都会一点的小程)有空会更新自己的一点就分享系列的工程篇以及理解篇!thanks~