卷积的计算

什么是卷积?

TensorFlow中的卷积可以算在高级图像处理部分。主要目的是对信号进行变换处理,得到特征。卷积也可以叫滤波(filter),在整个特征处理中,位置如下图。

图1特征处理

 

卷积的作用就是求特征,具体应用例如传统的双边滤波进行磨皮到深度学习进行人脸识别等都是的。这里我们讲一下具体卷积的计算方法。

图2 卷积的作用图

图3 手工卷积核的效果图(锐化)

注:传统关于图像处理,是为了通过某个点周围的环境对这个点的影响而获得的特征(也就是卷积核),因而出现了锐化(减少环境的影响)和模糊(增加周围的影响)。

而在深度学习中,关于卷积核也是采用数学公式求得周围环境对某个点的影响,进而求特征,识别人脸等。因此,卷积核相关的一个名词叫视野域(field-of-view)即考虑多少周围的环境,如何参照周围的环境,进而从这方面考虑可以得出Atrous卷积。因为一个图片某个点周围的环境是不确定的,那么周围环境的对这个点的共享程度是多少,我们无法确定,因而一般一视同仁,即很常见,卷积核是一个对称矩阵,这个时候卷积就蜕化成了互相关 cross-correlation。(现在大部分的深度学习教程中都把卷积定义为图像矩阵和卷积核的按位点乘。实际上,这种操作亦应该是互相关,而卷积需要把卷积核顺时针旋转180度然后再做点乘。)

 

 

卷积的计算方法:

  1.TensorFlow中的Toeplitz matrix做卷积就是矩阵相乘,也就是GeMM。

  2.利用傅里叶变换

 

第一种方法(即把卷积转化为矩阵乘法,GeMM):

我们这里以一张图片为例,假设输入一张图片(单通道)他的矩阵shape(4,4,1);卷积核设kernel=(3,3),步长为1.padding方式为VALID。(这样特征图大小保持不变)

TensorFlow卷积是

1、把(4,4,1 )reshape为(9,4)的矩阵。(效果如下图)

2、卷积核filter reshape为(1,9)

3、采取矩阵相乘的方法:(1,9)*(9,4)=(1,4)得到卷积后的特征图像,然后reshape为(2,2)即可。

图4  图片reshape

 

 因为计算机一次性读取相近的内存是最快的,尤其是当需要把数据送到GPU去计算的时候,这样可以节省访存的时间,以达到加速的目的。不同框架的访存机制不一样,所以会有行列相反这样的区别。我们可以从tf.nn.con2d的data_format=NHWC,可以侧面猜测TensorFlow底层采用的是im2col的方法优化卷积运算(同caffe),因为NHWC的方式进行矩阵相乘访存命中率高于NCWH的方式,这样可以提高卷积的计算速度。参考PPT最后几页。

另外,根据这个方法,DCGAN把上面的矩阵乘法转置,则可以得到转置卷积,也叫反卷积。

 

第二种方法(利用傅里叶变换):

简而言之即一句话 时域卷积,频域相乘。

1、利用快速傅里叶变换把图片和卷积核变换到频域;

2、频域把两者相乘

3、把结果利用傅里叶逆变换得到特征图

这种方法更多使用于信号检测等方面,因为信号具有天然的属性——时间。这是图像所有没的,如果硬要和信号对应的应该是视频和音频吧。

所以在CV中常用的方法是第一种方法,时间复杂度和空间复杂度都低。

另外卷积其实就是为冲激函数诞生的。“冲激函数”是狄拉克为了解决一些瞬间作用的物理现象而提出的符号。古人曰:“说一堆大道理不如举一个好例子”,冲量这一物理现象很能说明“冲激函数”。在t时间内对一物体作用F的力,倘若作用时间t很小,作用力F很大,但让Ft的乘积不变,即冲量不变。于是在用t做横坐标、F做纵坐标的坐标系中,就如同一个面积不变的长方形,底边被挤的窄窄的,高度被挤的高高的,在数学中它可以被挤到无限高,但即使它无限瘦、无限高、但它仍然保持面积不变(它没有被挤没!),为了证实它的存在,可以对它进行积分,积分就是求面积嘛!于是“卷积”这个数学怪物就这样诞生了。傅里叶变换也是为这个概念的最原始的方法。

 

结论:在数字图像处理上,卷积更多的可以认为是互相关,而不必使用复杂的傅里叶变换,而信号处理方面,既然要对频域进行分析,则可以在频域计算卷积结果。

 

 参考:

卷积(convolution)和互相关(cross-correlation):https://blog.csdn.net/u013498583/article/details/79481144

图2:https://www.jianshu.com/p/abb7d9b82e2a(如有侵权,请联系删除)

TensorFlow的卷积层C++源码(笔者其实没看):https://github.com/tensorflow/tensorflow/blob/9590c4c32dd4346ea5c35673336f5912c6072bf2/third_party/eigen3/unsupported/Eigen/CXX11/src/NeuralNetworks/SpatialConvolutions.h

WIKI:https://en.wikipedia.org/wiki/Toeplitz_matrix#Discrete_convolution

im2col的原理和实现(图4):https://blog.csdn.net/dwyane12138/article/details/78449898

DCGAN-深度卷积生成对抗网络-转置卷积:https://blog.csdn.net/weixin_39059031/article/details/81303734

推荐阅读:

语义分割——Deeplab:https://www.cnblogs.com/SsoZhNO-1/p/10962267.html

卷积与傅里叶变换:https://blog.csdn.net/Augusdi/article/details/12438011?utm_source=blogxgwz2

卷积网络加速:https://blog.csdn.net/shuzfan/article/details/70172346?utm_source=blogxgwz0

通用矩阵乘(GEMM)优化与卷积计算:https://zhuanlan.zhihu.com/p/66958390

posted @ 2019-07-17 16:48  SsoZh  阅读(15716)  评论(2编辑  收藏  举报