矩阵卷积运算过程讲解

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

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

理论知识

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

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

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

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

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

  1. 依次类推,剔除为 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 矩阵扩充时,扩充结果如下:

在这里插入图片描述

卷积(Deconvolution)是卷积的逆运算,也称为转置卷积(Transpose Convolution)或分步卷积(Fractionally Strided Convolution)。在深度学习中,反卷积通常用于图像语义分割、物体定位等任务中。 反卷积的计算过程卷积类似,但是它的输入和输出顺序是相反的。具体来说,反卷积的计算步骤如下: 1. 定义一个反卷积核(Deconvolution Kernel),它通常是一个小的矩阵,例如 $3 \times 3$ 或 $5 \times 5$ 的矩阵。 2. 把反卷积核对准输出图像的一个像素点,然后计算反卷积核和该像素点周围一定范围内像素点的加权平均值。这个范围就是反卷积核的大小。 3. 把步骤2中计算得到的加权平均值赋值给输入图像的对应像素点。重复步骤2和步骤3,直到对整个输出图像都进行了反卷积运算。 与卷积不同的是,反卷积的输入和输出大小关系相反。如果输入图像的大小为 $H \times W$,反卷积核的大小为 $K \times K$,那么输出图像的大小为 $(H+K-1) \times (W+K-1)$。 在实现反卷积运算时,可以使用反卷积运算矩阵形式,也可以使用反卷积运算的逐元素形式。反卷积运算矩阵形式可以用矩阵乘法实现,反卷积运算的逐元素形式可以用循环实现。 需要注意的是,反卷积并不是卷积的逆运算,因为卷积是一种有信息丢失的运算。在卷积运算中,多个输入像素可能会被映射到同一个输出像素上,因此反卷积运算并不能完全恢复原始输入。实际上,反卷积只是一种近似逆运算,它可以在一定程度上恢复原始输入,但是不能完全恢复。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值