深度学习-conv卷积

卷积

卷积是一种定义在两个函数((f) 和 (g))上的数学操作,旨在产生一个新的函数。(f) 和 (g) 的卷积可以写成 (f\ast g),数学定义如下:

[\begin{align} (fg)(t) &={\int}_{-\infty}^{\infty}f(\tau)g(t-\tau) \tag{连续形式} \ (fg)(t) &={\sum}_{\tau=-\infty}^{\infty}f(\tau)g(t-\tau) \tag{离散形式} \end{align} ]

举例说明:掷骰子问题[1]

假设有两个骰子,这两个骰子分别是(f)和(g)。(F(1))表示骰子上边是数字1的概率。如果你同时掷这两个骰子,它们朝上并得到4的概率是多少?很容易想到三种情况,即:

[En]

Suppose there are two dice, and the two dice are (f) and (g), respectively. (f (1)) represents the probability that the upward side of the dice is the number 1. If you throw these two dice at the same time, what is the probability that they will face up and have a sum of 4? It is easy to think of three situations, namely:

  • (f) 向上为1,(g) 向上为3;
  • (f) 向上为2,(g) 向上为2;
  • (f) 向上为3,(g) 向上为1;

这三种情况出现的概率和即问题的答案,如果写成公式就是 $ (f \ast g)(4)=\sum \limits_{\tau = 1}^{3}f(\tau )g(4−\tau ) $。

写成内积的形式为:([…,f(1),f(2),f(3),…]\cdot […,g(3),g(2),g(1),…]) ,
你可以看到,卷积实际上是翻转一个函数的输入体积,并求出另一个函数的内积。

[En]

You can see that convolution is actually turning over the input volume of one function and finding the inner product with another function.

对应到不同方面,卷积可以有不同的解释:(g) 既可以看作我们在深度学习里常说的 (Kernel),也可以对应到信号处理中的 滤波器(Filter)。而 (f) 可以是我们所说的机器学习中的 特征(Feature),也可以是信号处理中的 信号(Signal)。卷积 ((f\ast g)) 就可以看作是对 (f) 的加权求和。[2]

图像滤波器

传统的图像滤镜操作符如下:

[En]

The traditional image filter operators are as follows:

  • blur kernel:减少相邻像素的差异,使图像变平滑。
  • sobel:显示相邻元素在特定方向上的差异。
  • sharpen :强化相邻像素的差异,使图片看起来更生动。
  • outline:也称为edge kernel,相邻像素相似亮度的像素点设成黑,有较大差异的设为白。

更多可参考 image-kernels 在线演示不同的卷积过滤器。

CNN 卷积层

CNN做的事情不是提前决定好过滤器,而是把过滤器当成参数不断调整学习,学出合适的过滤器。卷积网络的第一层执行的通常都是边缘检测,后面的层得到的都是更抽象的特征。CNN 的卷积核可以看作是局部区域内的全连接. 卷积层的一个重要特性是权值共享.

权值共享: 不同的感受域共享同一权值,因此也称为filter,能够大大减少权重的数量(所占的内存),这通常是有效的,因为filter过滤某一特征与具体的空间位置无关.但无独有偶,人脸图片通常是中心化的,即人的脑袋比较靠近中间,如此可以看出位置信息是有用的.对于这种情形我们可以取消权值共享机制,此时称这一层为 Locally-Connected Layer.这在人脸识别的论文中比较常用.

参数量: C_in × C_out × kernel_h × kernel_w

误区: 我之前误认为卷积的参数量是 C_out × kernel_h × kernel_w, 如果将卷积层设计为输入的所有channel的特征图共享一个filter, 那么相当于将输入的channel压缩成1个(特征图相加)再与C_out个filter卷积. 这种方式参数量和计算量比较小,但网络性能可能较低.

有时候提到filter的长和宽大小而不提到深度,则深度是输入数据的整个深度(因此1×1的卷积核也是有意义的).如前一层的输入是 [16x16x20],感知域大小是3×3,那么卷积层中每个神经元将有3x3x20 = 180个到前一层的连接.

小卷积核

目前,大多数流行的网络结构设计都遵循小卷积核的设计原则。小卷积内核的优势

[En]

At present, most popular network structure designs follow the design principles of small convolution kernels. * the advantages of small convolution kernels * :

3个3×3的卷积核的累加相当于1个7×7的卷积核,但是参数更少,计算量更小,有更多的非线性层计算.还可以通过加入1×1的”bottleneck”卷积核进一步减少计算(GoogLeNet等大量运用这种方式加深层次).如输入 HxWxC经过下列步骤输出的维数不变:

[\require{AMScd} \begin{CD} H\times W\times C @>{\text{Conv 1×1 x C/2}}>> H\times W\times C/2 \ @. @V {\text{Conv 3×3 x C/2}} VV \ H\times W\times C @< \text{Conv 1×1 x C} << H\times W\times C/2 \end{CD} ]

但是,在上述步骤中仍然使用3×3卷积核,可以将其转换为1×3和3×1之间的连接。

[En]

However, the 3×3 convolution kernel is still used in the above steps, which can be converted into a connection between 1×3 and 3×1.

投入产出规模关系:

[En]

Input and output scale relationship:

[o=\lfloor{i+2p-k\over s}\rfloor+1 ]

孔洞卷积/膨胀卷积

deeplab 论文 Rethinking Atrous Convolution for Semantic Image Segmentation 中提到 “Atrous convolution, also known as dilated convolution”.

Dilated/Atrous Convolution 或者是 Convolution with holes 从字面上就很好理解,是在标准的 convolution 中注入空洞,以此来增加感受野。相比没有孔洞的卷积,dilated convolution 多了一个 dilation rate 超参数, 指的是 kernel 的间隙(无孔洞的卷积 dilation rate 是 1)。

深度学习-conv卷积

孔卷积投入产出比例关系:

[En]

Hole convolution input-output scale relationship:

[o=\lfloor{i+2p-[(k-1)d+1] \over s}\rfloor+1 ]

d是 dilation rate, 在kernel中加入了d-1个孔,相当于扩大了卷积核的覆盖面积,k’=k+(k-1)(d-1).

孔洞卷积应用

在 R-FCN 和 SSD 等目标检测网络中也用到了 atrous conv, R-FCN 将原本的ImageNet的预训练模型的某层stride=2的卷积改为stride=1使得输出尺度不进行缩小,由于stride=1的感受野较小,因此使用atrous来增大感受野. 同时能够继续使用ImageNet预训练分类模型.SSD将全连接层fc6和fc7改成了卷积层,并从fc6和fc7参数中下采样.将pool5从2×2-s2改成3×3-s1,同样使用atrous conv来填充孔洞,增加感受野.

atrous conv 能够使用原来的参数初始化是因为 atrous conv 的神经元连接和原来的仍然一样,如下图所示[3], 红色的输出神经元对应的输入(第一层)的神经元在(a)(b)中相同:

深度学习-conv卷积

卷积实现

计算卷积的方法主要有三种:变换为矩阵乘法、Winograd和FFT。

[En]

There are three main ways to calculate convolution: transform to matrix multiplication, winograd, and FFT.

三种计算方式在 CuDNN 中均做了实现[4]

深度学习-conv卷积

在现代的 DL 框架中对卷积计算通常采用矩阵乘法的方式,使用 im2col操作将输入数据与权重展开成二维矩阵(使得图像矩阵和卷积核能够直接相乘, 转换的反向操作为col2im),运用 BLAS API进行高效计算, 缺点是占用许多内存.这种思想也可以用在pooling操作中.

没有广泛使用FFT的原因:
FFT 在卷积核比较大的时候有明显速度优势, 但是FFT卷积没有被广泛应用。因为通用平台上有更合适的Winograd卷积的存在,而专用平台上直接降低运算精度是更合适的方案。而且,随着CNN里面越来越多的1×1卷积和depthwise卷积被加入,Winograd卷积的价值也越来越小了。CNN的卷积核一般都小于5,所以深度学习中一般不用FFT。[5]

下面是对快速傅里叶变换的简要介绍。

[En]

The following is a brief introduction to the fast Fourier transform.

卷积定理(convolution theorem) [6] [7]

快速傅立叶变换被认为是20世纪最重要的算法之一,卷积定理是其中的一个重要因素。

[En]

Fast Fourier transform is regarded as one of the most important algorithms in the 20 th century, and one factor is convolution theorem.

傅里叶变换可以看作是对图像或音频数据的重组,它将时间域和空间域的复卷积对应为频域元素的简单乘积。

[En]

Fourier transform can be regarded as the reorganization of image or audio data, which corresponds the complex convolution in time domain and space domain to the simple product of elements in frequency domain.

一维连续域上两个连续函数的卷积:

[En]

The convolution of two continuous functions over an one-dimensional continuous field:

[h(x)=f\bigotimes g=\int_{-\infty}^\infty f(x-u)g(u)du=\mathcal F^{-1}(\sqrt{2\pi}\mathcal F[f]\mathcal F[g]) ]

从卷积定理可以看出,两个矩阵的卷积结果等价于傅里叶变换(F),两个矩阵的元素级乘法,然后是逆傅立叶变换(F^-1)。(Sqrt{2pi})是正规化子。

[En]

From the convolution theorem, we can know that the result of the convolution of two matrices is equivalent to the Fourier transform ( ( mathcal F)), the element-level multiplication of the two matrices, and then the inverse Fourier transform ( ( mathcal F ^ {- 1})). ( sqrt {2 pi}) is a normalizer.

二维离散域(图像)上的卷积:

[En]

Convolution on two-dimensional discrete domain (image):

[\begin{align} \text{feature map}=&\text{intput}\bigotimes\text{kernel} \ =&\sum_{y=0}^M \sum_{x=0}^N \text{intput}(x-a,y-b)\cdot \text{kernel}(x,y) \ =&\mathcal F^{-1}(\sqrt{2\pi}\mathcal F[\text{intput}]\mathcal F[\text{kernel}]) \end{align} ]

快速傅立叶变换(FFT)是一种将时间域和空间域的数据转换到频域的算法。傅里叶变换使用一些正弦波和余弦波的和来表示原始函数。必须注意的是,傅里叶变换通常涉及复数,即将实数变换为具有实部和虚部的复数。通常虚部只在某些领域有用,例如将频域变换回时间域和空间域。

[En]

Fast Fourier transform (FFT) is an algorithm that converts data in time domain and spatial domain to frequency domain. The Fourier transform uses the sum of some sine and cosine waves to represent the original function. It must be noted that Fourier transform generally involves complex numbers, that is, a real number is transformed into a complex number with real and imaginary parts. Usually the imaginary part is only useful in some fields, such as transforming the frequency domain back to time domain and space domain.

傅里叶变换图示[8]

深度学习-conv卷积

方向信息可以从傅里叶变换中看到:

[En]

The direction information can be seen from the Fourier transform:

深度学习-conv卷积
Images by Fisher & Koryllos (1998). Source

Caffe 框架中的卷积实现

卷积操作示意图如下,输入图片的维数为[c0,h0,w0];卷积核的维数为[c1,c0,hk,wk],其中c0在图中没有表示出来,一个卷积核可以看成由c1个维数为[c0,hk,wk]的三维滤波器组成,输出特征的维数为[c1,h1,w1], 其中(h1,w1)根据输入尺寸(h0,w0)及卷积核尺寸(hk,wk),卷积核步长stride计算得出.

深度学习-conv卷积

转换为二维矩阵乘法的高效计算:

[En]

Efficient calculation of converting to two-dimensional matrix multiplication:

深度学习-conv卷积

Im2ol的更详细的插图:

[En]

A more detailed illustration of im2col:

深度学习-conv卷积

卷积-反向传播

卷积层的反向传播依然可以用到卷积. [9]
设卷积层为 (Y=X\odot W), im2col 的形式是 (Y=X’\odot W’) , 那么

[\begin{align} {\partial L\over \partial W} &=X\odot{\partial L\over \partial Y} \ {\partial L\over \partial X} &=\rm{Full Conv}(180^\circ\text{rotated W},{\partial L\over \partial Y}) \ {\partial L\over \partial X’} &={\partial L\over \partial Y}\odot W’ \ {\partial L\over \partial X} &=\text{col2im}({\partial L\over \partial X’}) \end{align} ]

Original: https://www.cnblogs.com/makefile/p/conv.html
Author: 康行天下
Title: 深度学习-conv卷积

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/6529/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总