前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >卷积是怎么【卷】的

卷积是怎么【卷】的

作者头像
用户1260737
发布2019-12-10 14:21:54
1K0
发布2019-12-10 14:21:54
举报
文章被收录于专栏:趣谈编程趣谈编程

前言:

现在人工智能很火,但是它的数学门槛让很多人都望而却步,今天这篇文章就以很通俗的语言来讲解了卷积,希望对大家有所帮助。

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

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

理解的卷积计算过程

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

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

设:, 是 上的两个可积函数,作积分: 可以证明,关于几乎所有的 ,上述积分是存在的。这样,随着 的不同取值,这个积分就定义了一个新函数 ,称为函数 与 的卷积,记为 。

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

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

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

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

卷积

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

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

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

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

我们一个一个来看。先看右边,我们不妨先令, 也就是不变而变的情况。于是公式1就变成了公式2:

1. 翻转

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

f(x)-f(-x)

2. 平移

然后看一下一个函数如何平移,仍然以为例,回一下我们中学学过的数学知识,也许还能记起来,就是由向右平移得到的。我们仍然以图说话,用Python作图如下,分别取值为。

f(t-x)

3. 乘积

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

现在我们可以知道就是翻转之后又向右平移了个单位。这时候需要考虑另一个函数了。这里 我们继续举个例子,不妨令。

我们继续用Python画出如下图所示:

fg

4. 积分

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

int

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

不论怎么变化,最后一旦积分,等式右边就成了一个确定的数字,一个常量。

趣谈编程注:积分确定了上下限,面积也就随之确定了。

一个对应一个嘛。此时我们可以继续看公式左边了,我们直接看公式1:

左边换下位置我们也许会更好理解,即。也即之前提到的一句话:卷积即是通过两个函数和生成第三个函数的一种数学算子。

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

卷积为什么叫“卷积”?

1. 卷积之【卷】

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

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

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

卷纸0

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

卷纸1

看到没?翻转!平移!

你肯定还记得上面说的卷积计算的四个过程:翻转、平移、乘积、积分。卷积之“卷”,你明白了吗?

本文完

什么?还不能走?你想要画图的源码?

代码语言:javascript
复制
# coding:utf-8
"""
Author:  CVPy-冰不语
Date:    2019/11/26
"""  
  
import numpy as np
import matplotlib.pyplot as plt


# 定义函数f(x)
def f(x):
    """$f\ (\\tau)$"""
    return x


# 定义函数g(x)
def g(x):
    """$f(x)=sin(x)$"""
    return np.sin(x/10)


# 设置坐标系
def set_ax(ax):
    ax.spines['top'].set_color('none')
    ax.spines['right'].set_color('none')
    ax.spines['bottom'].set_color('deepskyblue')
    ax.spines['left'].set_color('deepskyblue')

    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))

    ax.set_xticks(np.arange(-100,101, 50))
    # ax.set_yticks(np.arange(-100,101, 50))

    return ax


if __name__ == "__main__":
    # x的取值范围
    x = np.arange(-100, 100, 0.1)

    # ---------第一幅图:f(x)和f(-x)----------
    fig = plt.figure(figsize=(6, 6))

    # 左边画f(x)
    ax1 = fig.add_subplot(121)
    ax1 = set_ax(ax1)
    ax1.plot(x, f(x), 'orange', label=f.__doc__)
    plt.legend(loc="upper left", bbox_to_anchor=[0, 1],
               ncol=1, fancybox=True)

    # 右边画f(-x)
    ax2 = fig.add_subplot(122)
    ax2 = set_ax(ax2)
    plt.plot(x, f(-x), 'orange', label="$f\ (-\\tau)$")
    plt.legend(loc="upper right", bbox_to_anchor=[1, 1],
               ncol=1, fancybox=True)
    plt.show()

    # ---------第二幅图:f(t-x)----------
    fig2 = plt.figure(figsize=(6, 6))
    ax3 = fig2.add_subplot(111)

    ax3 = set_ax(ax3)
    ax3.set_xticks(np.arange(-100, 101, 20))
    ax3.set_yticks(np.arange(-100, 181, 20))

    for t in [20, 40, 60, 80]:
        plt.plot(x, f(t-x), label="$f\ (x_0 - \\tau) \ \ x_0={0}$".format(t))
    plt.legend(loc="upper right", bbox_to_anchor=[1, 1], ncol=1, fancybox=True)

    plt.show()

    # ---------第三幅图:g(x) * f(t-x)----------
    t = 80


    def f_mul_g(x, t):
        """$f(\\tau-x)*g(\\tau)$"""
        return f(t-x)*g(x)

    fig3, ax4 = plt.subplots()

    ax4 = set_ax(ax4)
    ax4.set_xticks(np.arange(-100,101, 20))
    # ax4.set_yticks(np.arange(-100,181, 20))

    plt.plot(x, f_mul_g(x, t), label=f_mul_g.__doc__)
    plt.legend(loc="upper right", bbox_to_anchor=[1, 1], ncol=1, fancybox=True)

    plt.show()

    # ---------第四幅图:g(x) * f(t-x)的积分----------
    import matplotlib.patches as mPatches


    def int_fg(x, t, ax5):
        ax5 = set_ax(ax5)

        plt.plot(x,f_mul_g(x, t), 'orange', label="$f\ (\\tau)*g(x_0-\\tau) \ \  x_0={0}$".format(t))
        plt.legend(loc="upper right", bbox_to_anchor=[1, 1],
                   ncol=1, fancybox=True)

        a = -50
        b = 50
        ix = np.linspace(a,b)
        iy = f_mul_g(ix,t)

        verts = [(a,0)] + list(zip(ix, iy)) + [(b,0)]
        poly = mPatches.Polygon(verts,color='deepskyblue')
        ax5.add_patch(poly)
        # plt.plot(x,g(x),label=g.__doc__)

        plt.text(30, 50, '$\int_a^b f\ (\\tau)*g(x_0-\\tau) \ \  x_0={0}$'.format(t), style='oblique',
                 bbox={'facecolor': 'orange', 'alpha': 0.5, 'pad': 5}, fontsize=15)

    fig4, ax5 = plt.subplots()
    int_fg(x, t, ax5)
    plt.legend(loc="upper right", bbox_to_anchor=[1, 1], ncol=1, fancybox=True)

    plt.ion()

    # for i in range(100):

    #     y = np.random.random()

    #     plt.autoscale()

    #     plt.scatter(i, y)

    #     plt.pause(0.01)

    fig4, ax5 = plt.subplots()
    tn = np.arange(-100,100,5)
    for t in tn:
        plt.cla()
        plt.grid(True)
        plt.autoscale()
        int_fg(x, t, ax5)
        plt.pause(0.01)

        plt.legend(loc="upper right", bbox_to_anchor=[1, 1], ncol=1, fancybox=True)

    plt.show()

以上文章来源于CVPy,作者CVPy冰不语

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 趣谈编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 理解的卷积计算过程
    • 1. 翻转
      • 2. 平移
        • 3. 乘积
          • 4. 积分
          • 卷积为什么叫“卷积”?
            • 1. 卷积之【卷】
            相关产品与服务
            图像处理
            图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档