卷积计算过程详解(含图示和代码)

什么是卷积?

        卷积是一种数学运算,通过两个函数f和g生成第三个函数,其本质是一种特殊的积分变换,表征函数f与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。卷积在泛函分析中扮演重要角色,可以被看作是“滑动平均”的推广。在信号处理和图像处理等领域,卷积常用于描述一个动态过程,用简单的数学形式描述过去作用对当前的影响。

        在卷积神经网络中,卷积层的实现方式实际上是数学中定义的互相关 (cross-correlation)运算,与数学分析中的卷积定义有所不同。

        卷积核的计算过程可以用下面的数学公式表示,其中a代表输入图片, b代表输出特征图,w是卷积核参数,它们都是二维数组,\sum u,v表示对卷积核参数进行遍历并求和。

b[i,j]=\sum_{u,v}a[i+u,j+v]\cdot w[u,v]

卷积计算过程图解

卷积具体的计算过程如下图所示:

卷积计算代码详解

        下面使用Python代码讲解二维矩阵卷积计算过程。

import numpy as np


def matrix_convolution_2d(matrix: [], kernal: []):
    """
    二维矩阵卷积处理
    :param matrix: 输入二维矩阵
    :param kernal: 输入二维卷积核
    :return: 输出卷积结果
    """
    # 获取矩阵的行数和列数
    _matrix = np.array(matrix)
    _kernal = np.array(kernal)
    rows = len(_matrix)
    cols = len(_matrix[0])
    # 获取卷积核的行数和列数
    kh = len(_kernal)
    kw = len(_kernal[0])
    # 计算卷积结果矩阵的大小
    r_rows = rows - kh + 1
    c_cols = cols - kw + 1
    # 创建一个卷积结果矩阵
    convolution_result = np.empty((r_rows, c_cols))
    for i in range(r_rows):
        for j in range(c_cols):
            # 获取当前子矩阵的切片
            row_slice = slice(i, i + kh)
            col_slice = slice(j, j + kw)
            sub_matrix = _matrix[row_slice, col_slice]
            # 进行卷积操作,卷积核和与子矩阵进行点积后求和
            convolution_result[i][j] = np.sum(_kernal * sub_matrix)
    return convolution_result


if __name__ == '__main__':
    # 定义一个二维矩阵
    matrix = [[1, 2,3],
              [4,5,6],
              [7,8,9]]
    # 定义一个二维卷积核
    kernal = [[0, 1], [2, 3]]
    # 进行二维矩阵卷积处理
    result = matrix_convolution_2d(matrix, kernal)
    # 输出卷积处理结果
    print(result)

计算结果:

[[25. 31.]
 [43. 49.]]

《完》

PS:本人学习笔记,水平有限,如有错误,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追风落叶乔木生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值