hao同学的技术博客

  • 首页
  • Java
    • Java
    • JVM教程
    • Java面试
    • Java并发入门
    • Java并发进阶
  • 项目
    • 从零打造项目
  • Python
    • Python
    • Python爬虫
    • 算法
  • Java框架
    • Spring
    • SpringBoot
  • 前端
    • Angular
  • 其他
    • Linux
    • SQL
  • 随笔
分享技术,记录人生
一个痴迷于技术的厨艺爱好者
  1. 首页
  2. Python爬虫
  3. 正文

矩阵卷积运算过程讲解

2022年5月19日 306点热度 0人点赞 0条评论

矩阵卷积运算过程讲解

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

理论知识

在讲述卷积过程前,我们来了解一下卷积公式。根据离散二维卷积公式:

离散二维卷积公式

其中A为被卷积矩阵,K为卷积核,B为卷积结果,该公式中,三个矩阵的排序均从0开始。

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

被卷积矩阵

卷积核

  1. 卷积核 K 矩阵翻转 180°,得到:

    卷积核 K 矩阵

  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 矩阵扩充时,扩充结果如下:

卷积运算

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: Python 爬虫
最后更新:2022年5月19日

hresh

这是一个专注于IT技术学习交流的个人技术博客网站,包括Java学习、Python爬虫、Web开发实践等领域,深耕Java领域,内容涵盖Java基础、Java并发编程、Java虚拟机、Java面试等核心知识点。

点赞
< 上一篇
下一篇 >

文章评论

取消回复

hresh

这是一个专注于IT技术学习交流的个人技术博客网站,包括Java学习、Python爬虫、Web开发实践等领域,深耕Java领域,内容涵盖Java基础、Java并发编程、Java虚拟机、Java面试等核心知识点。

文章目录
  • 理论知识
  • 实际应用
最新 热点 随机
最新 热点 随机
后端必知:遵循Google Java规范并引入checkstyle检查 Spring Security结合Redis实现缓存功能 Spring Security结合JWT实现认证与授权 Spring Security自定义认证逻辑实现图片验证码登录 Spring Security进阶学习 Spring Security入门学习
GC调优基础以及初识jstat命令 基于SpringBoot将Json数据导入到数据库 Java并发编程入门学习之线程池 Java面试准备之Java 基础(理论篇) Scrapy 爬取今日头条街拍图片 深入学习方法内联

COPYRIGHT © 2022 hao同学的技术博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

鄂ICP备2022007381号

鄂公网安备 42010302002449号