卷积到底是怎么卷的

Posted 冰不语

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卷积到底是怎么卷的相关的知识,希望对你有一定的参考价值。

卷积,这个词大家应该都不陌生,数学中傅立叶变换的时候,物理中信号处理的时候,图像处理中滤波的时候、提取边缘的时候,还有深度学习中卷积神经网络的时候,处处可见卷积的影子。卷积在图像处理中的应用非常广泛,可以说理解了卷积,就可以理解图像处理算法的半壁江山,也不知道这个说法是否夸张了。

但是都说卷积卷积,那卷积到底是怎么个卷法呢?本文尝试解答这一问题。

理解的卷积计算过程

想要理解卷积,一些必要的数学公式是少不了的,放心吧,就下面这一个公式了,所有讨论围绕这一个公式展开。

我们从维基百科中对于卷积的解释引入:

设: f ( x ) f(x) f(x), g ( x ) g(x) g(x) R R R上的两个可积函数,作积分:

∫ − ∞ ∞ f ( τ ) g ( x − τ )   d τ \\displaystyle \\int _-\\infty ^\\infty f(\\tau )g(x-\\tau )\\,\\mathrm d \\tau f(τ)g(xτ)dτ

可以证明,关于几乎所有的 $\\displaystyle x\\in (-\\infty ,\\infty ) $,上述积分是存在的。这样,随着 x \\displaystyle x x 的不同取值,这个积分就定义了一个新函数$ \\displaystyle h(x)$ ,称为函数 f \\displaystyle f f g \\displaystyle g g的卷积,记为 h ( x ) = ( f ∗ g ) ( x ) \\displaystyle h(x)=(f*g)(x) h(x)=(fg)(x)

我们提取下重点公式写在下面,记为公式1:

h ( x ) = ( f ∗ g ) ( x ) = ∫ − ∞ ∞ f ( τ ) g ( x − τ )   d τ (1) \\displaystyle h(x)=(f*g)(x) = \\displaystyle \\int _-\\infty ^\\infty f(\\tau )g(x-\\tau )\\,\\mathrm d \\tau \\tag1 h(x)=(fg)(x)=f(τ)g(xτ)dτ(1)

以上公式1最令人迷惑也是最需要注意的部分在于,在等式的左边,自变量是 x x x,然而等式的右边自变量却变成了 τ \\tau τ,更令人疑惑的是——右边自变量不是 x x x τ \\tau τ也就算了,竟然还出现了一个 x x x

那么问题来了, x x x τ \\tau τ,到底哪个在变?还是两个都在变?如果是都在变,那到底是怎么个变法?

这些问题还是需要慢慢道来。我们先看一个卷积稍微通俗一点的解释。

卷积

(1)即是通过两个函数 f f f g g g生成第三个函数的一种数学算子。

(2)表征函数f与经过翻转和平移的g的乘积函数所围成的的曲边梯形的面积。

上面两句话都非常重要,我们从第二句话开始看,第二句话中包含了以下四个重点信息:

  • 翻转
  • 平移
  • 乘积
  • 积分(函数围成的面积不就是积分么?)

我们一个一个来看。先看右边,我们不妨先令 x = x 0 x=x_0 x=x0, 也就是 x x x不变而 τ \\tau τ变的情况。于是公式1就变成了公式2:

h ( x 0 ) = ( f ∗ g ) ( x 0 ) = ∫ − ∞ ∞ f ( τ ) g ( x 0 − τ )   d τ (2) \\displaystyle h(x_0)=(f*g)(x_0) = \\displaystyle \\int _-\\infty ^\\infty f(\\tau )g(x_0-\\tau )\\,\\mathrm d \\tau \\tag2 h(x0)=(fg)(x0)=f(τ)g(x0τ)dτ(2)

1. 翻转

先看翻转,怎么翻转一个函数呢,想一下最简单的 f ( τ ) = τ f(\\tau)=\\tau f(τ)=τ,不难发现, f ( τ ) f(\\tau) f(τ)翻转之后即为 f ( − τ ) f(-\\tau) f(τ)。我用Python画出了这俩函数的图像,看起来更为直观。

2. 平移

然后看一下一个函数如何平移,仍然以 f ( τ ) = τ f(\\tau)=\\tau f(τ)=τ为例,回一下我们中学学过的数学知识,也许还能记起来, f ( x 0 − τ ) f(x_0-\\tau) f(x0τ)就是由 f ( − τ ) f(-\\tau) f(τ)向右平移 x 0 x_0 x0得到的。我们仍然以图说话,用Python作图如下, x 0 x_0 x0分别取值为 20 , 40 , 60 , 80 20,40,60,80 20,40,60,80

3. 乘积

现在我们只看公式的右边部分:

KaTeX parse error: \\tag works only in display equations

现在我们可以知道 g ( x 0 − τ ) g(x_0-\\tau) g(x0τ)就是 g ( τ ) g(\\tau) g(τ)翻转之后又向右平移 x 0 x_0 x0个单位。这时候需要考虑另一个函数 f ( τ ) f(\\tau) f(τ)了。这里 我们继续举个例子,不妨令 f ( τ ) = s i n ( τ 10 ) f(\\tau)=sin(\\frac\\tau10) f(τ)=sin(10τ)

我们继续用Python画出 f ( τ ) g ( x 0 − τ ) f(\\tau )g(x_0-\\tau ) f(τ)g(x0τ)如下图所示:

4. 积分

现在是较为完整的公式3的样子了,这里为了能够更好地表达,我们把区间从 ( − ∞ , ∞ ) (-\\infty ,\\infty ) (,)改为 ( − 50 , 50 ) (-50,50) (50,50),即画出

KaTeX parse error: \\tag works only in display equations

注意了,在上面的所有过程中, x x x一直是不变的,变的是 τ \\tau τ。即我们上面一直是在做的是公式2右边的计算,公式2如下:

h ( x 0 ) = ( f ∗ g ) ( x 0 ) = ∫ − ∞ ∞ f ( τ ) g ( x 0 − τ )   d τ (2) \\displaystyle h(x_0)=(f*g)(x_0) = \\displaystyle \\int _-\\infty ^\\infty f(\\tau )g(x_0-\\tau )\\,\\mathrm d \\tau \\tag2 h(x0)=(fg)(x0)=f(τ)g(x0τ)dτ(2)

不论 τ \\tau τ怎么变化,最后一旦积分,等式右边就成了一个确定的数字,一个常量。一个 x x x对应一个 y y y嘛。此时我们可以继续看公式左边了,我们直接看公式1:

h ( x ) = ( f ∗ g ) ( x ) = ∫ − ∞ ∞ f ( τ ) g ( x − τ )   d τ (1) \\displaystyle h(x)=(f*g)(x) = \\displaystyle \\int _-\\infty ^\\infty f(\\tau )g(x-\\tau )\\,\\mathrm d \\tau \\tag1 h(x)=(fg)(x)=f(τ)g(xτ)dτ(1)

左边换下位置我们也许会更好理解,即 ( f ∗ g ) ( x ) = h ( x ) \\displaystyle (f*g)(x) = h(x) (fg)(x)=h(x)。也即之前提到的一句话:卷积即是通过两个函数 f f f g g g生成第三个函数的一种数学算子。

总结一下,卷积计算过程可以分解为四步:翻转、平移、乘积、积分

卷积为什么叫“卷积”?

1. 卷积之【卷】

那么问题来了?卷积为什么要叫“卷积”呢?换言之,卷积之“卷”和卷积之“积”分别是什么含义?

这里想像一下如果我们要卷起一张A4纸,需要怎么做?

(1)首先我们需要提起对着自己一条边,向上翻转使之对着自己身体前方——翻转!

(2)然后继续向下打个圈之后,就可以向前推了——平移!

看到没?翻转!平移!

你肯定还记得上面说的卷积计

以上是关于卷积到底是怎么卷的的主要内容,如果未能解决你的问题,请参考以下文章

计算离散卷积“乘积”的有效方法

连载6:利用卷积计算两个信号的乘积

caffe的卷积层的乘积运算的优化

卷积运算是什么

空间域的卷积可以变换为频率域的乘积,证明

二维卷积运算tf.conv2d介绍