卷积通俗解释以及应用

1,350 阅读7分钟

1卷积是什么

首先,卷积是一种数学运算,本质和数学中的加减乘除运算没有区别,只不过比较复杂而已

卷积,顾名思义,就是又“卷”又“积”,积是积分的意思,那卷是什么呢?简单说,“卷”包括翻折和滑动 image.png

在卷积运算中,一个函数(通常称为卷积核或滤波器)会先被翻折(或称为反褶),然后在另一个函数(通常称为输入或信号)上进行滑动。在每次滑动到新的位置时,两个函数在该位置的对应点相乘,然后将这些乘积进行累加(在连续情况下是积分,在离散情况下是求和)。这个过程反复进行,从而得到卷积的结果。

好了,上面是卷积的形象化解释,下面我们看卷积的严格数学定义,卷积公式

如果卷积的变量是函数 ,则卷积的计算变为

其中p是积分变量,积分也是求和,t是使函数h(-p)位移的量,星号*表示卷积。

我们一起来分析一下这个公式

卷积是一种积分运算,它涉及到两个函数的相乘,并对结果进行积分。每个相乘的结果实际上代表了在某一时间点或位置上,两个函数值的乘积。这个乘积可以被视为一个权重,反映了两个函数在该时间点或位置上的相对重要性。

卷积运算涉及以下步骤:

  1. 函数翻转:首先,其中一个函数(在此为)需要进行翻转。在数学上,这通常意味着将其关于y轴对称。
  2. 滑动:翻转后的函数h(t-p)在另一个函数x(p)上进行滑动。这里,p是积分变量,表示当前滑动的位置。
  3. 相乘与积分:在每次滑动中,函数f(p)和g(t-p)在相同位置的点上进行相乘,并对所有位置的结果进行积分。积分是对相乘结果的累加,反映了两个函数在重叠区域的相互作用

2卷积的离散数值运算

例一 假设有两枚骰子, 点数i出现的概率分别是f(i),g(i) 其中i=1,2,3,4,5,6, 求同时投掷这两枚骰子得到的点数和为h(i)的概率.

由题意可知, 两枚骰子的点数和有2,3,⋯,12共11种情况. 对应的概率分别为

ℎ(2)=f(1)g(1)

ℎ(3)=f(1)g(2) + f(2)g(1)

ℎ(4)=f(1)g(3) + f(2)g(2) + f(3)g(1)

ℎ(5)=f(1)g(4) + f(2)g(3) + f(3)g(2) + f(4)g(1)

以此类推...... 如果将所有的点数和的概率一一计算, 可以发现, 就是将下面两个向量

(f(1),f(2),⋯,f(6)) 和 (g(1),g(2),⋯,g(6))

进行“翻转平移相乘”运算.

例二 小明每年年初都往某银行存入100+50x元(x=1,2,3,4,5), 假设银行年化利率为r, 其中每年存入的钱到年底结算一年利息后, 本息和自动存入下一年. 那么第1,2,3,4,5年年底小明能拿到多少钱?

第1年年底有150(1+r)

第2年年底有150(1+r)^2+200(1+r)

第3年年底有150(1+r)^3+200(1+r)^2+250(1+r)

⋯以此类推

如果记f(x)=100+50x, g(x)=(1+r)^x, 那么第1到5年年底能拿到的钱就是将下面两个向量

(f(1),f(2),⋯,f(5)) 和 (g(1),g(2),⋯,g(5))

进行“翻转平移相乘”运算

3卷积的连续数值运算

例一 假设有两个函数 f(t) = t(在区间 [0, 1] 上)和 g(t) = 1(在区间 [0, 2] 上)。我们要求这两个函数的卷积。

首先,确定积分范围。由于 f(t) 在 [0, 1] 上有定义,g(t - τ) 在 [τ, τ+2] 上有定义,因此积分范围应为这两个区间的交集,即 [max(0, τ), min(1, τ+2)]。

然后,对于每一个 t 值,计算积分 ∫ f(τ)g(t - τ) dτ。由于 g(t) = 1,积分简化为 ∫ f(τ) dτ。

最后,对于每一个 t 值,在对应的积分范围内计算该积分,得到 h(t)。在这个例子中,由于 f(τ) = τ,积分结果为 h(t) = 0.5t^2(在区间 [0, 1] 上),当 t 在 [0, 1] 之外时,h(t) 为 0。

4卷积核介绍

卷积核(Convolution Kernel)是卷积神经网络(CNN)中的核心组件,它实际上是一个小的矩阵,其大小通常为3x3或5x5。在卷积神经网络中,一个卷积层可以有多个不同的卷积核,而每个卷积核都会在输入数据上进行滑动,以执行卷积操作并产生对应的特征图(Feature Map)。

卷积核的主要作用是提取输入数据(如图像)中的局部特征。这些特征可能包括边缘、角点、纹理等,具体取决于卷积核的设计。通过训练过程,卷积核的参数(即矩阵中的数值)会被优化,以更好地提取对任务有用的特征。

卷积核的滑动过程是通过与输入数据中的局部区域进行点积运算,并加上偏置项后,通过激活函数得到输出。这个过程会在输入数据的所有位置上重复进行,从而生成一个完整的特征图。

不同的卷积核可以提取到不同的特征,因此,在卷积神经网络中,通常会使用多个卷积核来捕捉输入数据的多种特征。这些特征图随后会被送入下一层进行进一步的处理和抽象。

总的来说,卷积核是卷积神经网络中用于提取局部特征的重要工具,通过训练和优化,它们能够帮助网络更好地理解和处理输入数据。

5图片卷积

image.png

图像卷积就是卷积核在图像上按行滑动遍历像素时不断的相乘求和的过程 .

边缘检测

边缘检测的目的就是找到图像中亮度变化剧烈的像素点构成的集合,表现出来往往是轮廓。 上代码

import numpy as np
import torch
from torch import nn
from torch.autograd import Variable
import torch.nn.functional as F
from PIL import Image
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号 #有中文出现的情况,需要u'内容
# https://blog.csdn.net/weixin_40123108/article/details/83510592
file_path = './image.png'
im = Image.open(file_path).convert('L')  # 读入一张灰度图的图片
im = np.array(im, dtype='float32')  # 将其转换为一个矩阵
print(im.shape[0], im.shape[1])
plt.imshow(im.astype('uint8'), cmap='gray')  # 可视化图片
plt.title('原图')
plt.show()

im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
conv1 = nn.Conv2d(1, 1, 3, bias=False)  # 定义卷积

sobel_kernel = np.array([[-1, -1, -1],
                         [-1, 7, -1],
                         [-1, -1, -1]], dtype='float32')  # 定义轮廓检测算子
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3))  # 适配卷积的输入输出
conv1.weight.data = torch.from_numpy(sobel_kernel)  # 给卷积的 kernel 赋值

edge1 = conv1(Variable(im))  # 作用在图片上

x = edge1.data.squeeze().numpy()
print(x.shape)  # 输出大小

plt.imshow(x, cmap='gray')
plt.show()

image.pngimage.png 边缘检测卷积核[[-1, -1, -1], [-1, 7, -1], [-1, -1, -1]]

锐化

图像锐化也称边缘增强。锐化技术用于加强图像中的边界和细节信息。由于边界和细节信息对应频域中的高频部分,所以在频域中通常对图像进行高通滤波,在空间域则进行微分处理。

锐化只需要将上述卷积核变为[[0, -1, 0], [-1, 10, -1], [0, -1, 0]]

image.pngimage.png

模糊

锐化只需要将上述卷积核变为[[1 , 2, 1 ], [2 , 4 ,2 ], [1 , 2 , 1 ]]

image.pngre