矩阵卷积运算过程讲解

您所在的位置:网站首页 矩阵里提取一个数要×n阶吗 矩阵卷积运算过程讲解

矩阵卷积运算过程讲解

2024-07-16 15:54| 来源: 网络整理| 查看: 265

写了那么久的博客,始于Python爬虫,目前专于Java学习,终于有了属于自己的小窝,欢迎各位访问我的个人网站,未来我们一起交流进步。

在爬虫处理验证码的过程中接触到矩阵卷积运算,关于该类运算,记录一下自己的心得。

理论知识

在讲述卷积过程前,我们来了解一下卷积公式。根据离散二维卷积公式: 在这里插入图片描述 其中A为被卷积矩阵,K为卷积核,B为卷积结果,该公式中,三个矩阵的排序均从0开始。

现在对于上面卷积过程进行分析:我们用来做例子的 A 矩阵为 m×m(3×3)二维矩阵(被卷积矩阵),K 为 n×n(2×2)的二维矩阵(卷积核)。 在这里插入图片描述 在这里插入图片描述

卷积核 K 矩阵翻转 180°,得到: 在这里插入图片描述

被卷积矩阵扩展到(m+n)×(m+n)大小,将扩展部分用 0 代替,将卷积核 K 从左上角顺序地行移动,再换行,继续,直到抵达右下角。将对应元素相乘后相加。

在这里插入图片描述 在这里插入图片描述

依次类推,剔除为 0 的元素,5×5 矩阵结果为 4×4 矩阵,卷积计算结束。 在这里插入图片描述

实际应用

关于卷积计算,在 Python 中存在于 scipy 的 signal 模块,这里需要介绍一下 scipy.signal.convolve2d 函数。

scipy.signal.convolve2d(in1,in2,mode ='full',boundary ='fill',fillvalue = 0 ) in1 : array_like 被卷积矩阵in2 : array_like 卷积核mode : str {‘full’, ‘valid’, ‘same’}, 可选 。其中 full 表示输出是输入的完全离散线性卷积(默认);valid 表示输出仅包含那些不依赖于零填充的元素。在“有效”模式下,in1 或 in2 必须至少与每个维度中的另一个一样大。same 表示输出与 in1 的大小相同,以“完整”输出为中心。boundary : str {‘fill’,‘wrap’,‘symm’},可选,指示如何处理边界的标志。fill 表示使用 fillvalue 填充输入数组(默认);wrap 表示圆形边界条件;symm 表示对称的边界条件。fillvalue : 标量,可选。填充 pad 输入数组的值。默认值为 0。 from scipy import signal import numpy as np x = np.array([[1, 2], [3, 4]]) b = [] a = [] for i in range(1,10): if i%3 == 0: a.append(i) b.append(a) a = [] continue else: a.append(i) print(np.array(b)) h = np.array(b) print(signal.convolve2d(h, x, mode='same')) print(signal.convolve2d(h, x, mode='full')) print(signal.convolve2d(h, x, mode='valid'))

输出结果为:

[[ 1 4 7] [ 7 23 33] [19 53 63]] [[ 1 4 7 6] [ 7 23 33 24] [19 53 63 42] [21 52 59 36]] [[23 33] [53 63]]

结合程序与图片分析,被卷积矩阵(m×m)和卷积核(n×n)做卷积运算时,当 scipy.signal.convolve2d 函数中 mode 参数值为 full(默认值)时,得到是完全卷积结果;当 mode 参数值为 valid 时,输出计算过程中没有扩充的 0 参与计算的值;当 mode 参数值为 same 时,输出与被卷积矩阵大小相同的矩阵,按照我的理解是,当卷积结果矩阵的大小(m+n -1)为偶数时,same 输出的矩阵从左上角按照 m 大小截取。当卷积结果矩阵的大小(m+n -1)为奇数时,same 输出的矩阵从正中间截取大小为 m d的矩阵。 在这里插入图片描述

注意:假如被卷积矩阵(3×3)和卷积核(3×3)做卷积运算时,6×6 矩阵扩充时,扩充结果如下:

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3