什么是卷积?
卷积是一种数学运算,通过两个函数f和g生成第三个函数,其本质是一种特殊的积分变换,表征函数f与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。卷积在泛函分析中扮演重要角色,可以被看作是“滑动平均”的推广。在信号处理和图像处理等领域,卷积常用于描述一个动态过程,用简单的数学形式描述过去作用对当前的影响。
在卷积神经网络中,卷积层的实现方式实际上是数学中定义的互相关 (cross-correlation)运算,与数学分析中的卷积定义有所不同。
卷积核的计算过程可以用下面的数学公式表示,其中代表输入图片, 代表输出特征图,是卷积核参数,它们都是二维数组,表示对卷积核参数进行遍历并求和。
卷积计算过程图解
卷积具体的计算过程如下图所示:
卷积计算代码详解
下面使用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:本人学习笔记,水平有限,如有错误,欢迎指正。