numpy手搓卷积

numpy实现卷积

1 卷积本质

  • 设计这样的一个 滤波器(filter,也称为kernel),用这个filter,往我们的图片上“盖”,覆盖一块跟filter一样大的区域之后,对应元素相乘,然后求和。计算一个区域之后,就向其他区域挪动,接着计算,直到把原图片的每一个角落都覆盖到了为止。这个过程就是 “卷积”。
  • 可以通过设计特定的filter,让它去跟图片做卷积,就可以识别出图片中的某些特征。
  • CNN(convolutional neural network),主要就是通过一个个的filter,不断地提取特征,从局部的特征到总体的特征,从而进行图像识别等等功能
  • filter中的参数是通过大量的数据,让机器自己去“学习”这些参数。

2 Padding方式

  • 每次卷积,图像都缩小,采用padding的方法。每次卷积前,先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。
  • “让卷积之后的大小不变”的padding方式,称为 “Same”方式, 把不经过任何填白的,称为 “Valid”方式。
2.1 “Valid”方式

2.1 “Same”方式

2.3 Padding计算公式

3 多卷积核多通道

  • 在单核单通道的基础上执行多遍,然后把结果累加。
  • (1)一个循环是输入通道数对循环:把卷积核在每个通道数据上卷积,然后结果累加
  • (2)一个循环是核个数对循环:每个卷积核执行步骤(1),然后把结果累加,如下图

4 代码实现(循环计算实现和矩阵计算实现)

4.1 一维卷积

在 NumPy 中实现卷积操作可以通过使用 numpy.convolve 函数或手动编写卷积操作的代码来完成。以下是两种方法的示例:

方法一:使用 numpy.convolve 函数

numpy.convolve 函数用于执行一维卷积操作。首先,您需要定义一个卷积核(滤波器),然后将它应用于输入信号。下面是一个示例:

import numpy as np

# 定义输入信号
signal = np.array([1, 2, 3, 4, 5])

# 定义卷积核(滤波器)
kernel = np.array([0.5, 1, 0.5])

# 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卷积定理是指信号处理中的一种重要定理,它描述了在时域与频域之间的卷积关系。在数学中,卷积定理可以表示为: $$ \mathcal{F}^{-1}\{\mathcal{F}\{f(x)g(x)\}\} = f(x) * g(x) $$ 其中,$f(x)$ 和 $g(x)$ 是两个函数,$\mathcal{F}\{f(x)\}$ 和 $\mathcal{F}\{g(x)\}$ 分别是它们的傅里叶变换,$*$ 表示卷积运算,$\mathcal{F}^{-1}\{F(k)\}$ 表示 $F(k)$ 的傅里叶反变换。 在使用卷积定理时,我们可以先将 $f(x)$ 和 $g(x)$ 分别进行傅里叶变换,然后将它们的乘积取反变换,得到的结果即为 $f(x)$ 和 $g(x)$ 的卷积。 下面我们使用 numpy 来验证卷积定理。假设我们有两个函数 $f(x)$ 和 $g(x)$,它们分别为: $$ f(x) = \begin{cases} 1, & 0 \leq x \leq 1 \\ 0, & \text{otherwise} \end{cases} $$ $$ g(x) = \begin{cases} 2, & 0 \leq x \leq 2 \\ 0, & \text{otherwise} \end{cases} $$ 首先,我们可以用 numpy 来生成这两个函数的离散数据: ```python import numpy as np x = np.linspace(0, 5, 50) f = np.zeros_like(x) f[(x >= 0) & (x <= 1)] = 1 g = np.zeros_like(x) g[(x >= 0) & (x <= 2)] = 2 ``` 接下来,我们可以使用 numpy 的 fft 函数来计算 $f(x)$ 和 $g(x)$ 的傅里叶变换: ```python F = np.fft.fft(f) G = np.fft.fft(g) ``` 然后,我们可以将 $F(k)$ 和 $G(k)$ 相乘,得到它们的乘积: ```python FG = F * G ``` 最后,我们可以使用 numpy 的 ifft 函数来计算 $FG(k)$ 的傅里叶反变换,得到 $f(x)$ 和 $g(x)$ 的卷积: ```python fg = np.fft.ifft(FG).real ``` 我们还可以使用 numpyconvolve 函数来计算 $f(x)$ 和 $g(x)$ 的卷积,用于验证卷积定理的正确性: ```python conv_fg = np.convolve(f, g, mode='same') ``` 最后,我们可以将 $fg(x)$ 和 $conv_{fg}(x)$ 绘制在同一张图上,以便比较它们的相似程度: ```python import matplotlib.pyplot as plt plt.plot(x, fg, label='FFT Convolution') plt.plot(x, conv_fg, label='Numpy Convolution') plt.legend() plt.show() ``` 完整代码如下: ```python import numpy as np import matplotlib.pyplot as plt # 生成函数 f(x) 和 g(x) 的离散数据 x = np.linspace(0, 5, 50) f = np.zeros_like(x) f[(x >= 0) & (x <= 1)] = 1 g = np.zeros_like(x) g[(x >= 0) & (x <= 2)] = 2 # 计算傅里叶变换 F = np.fft.fft(f) G = np.fft.fft(g) # 计算傅里叶变换的乘积 FG = F * G # 计算傅里叶反变换,得到卷积结果 fg = np.fft.ifft(FG).real # 使用 numpyconvolve 函数计算卷积结果,用于比较 conv_fg = np.convolve(f, g, mode='same') # 绘制卷积结果的图像 plt.plot(x, fg, label='FFT Convolution') plt.plot(x, conv_fg, label='Numpy Convolution') plt.legend() plt.show() ``` 运行以上代码,可以得到如下的图像: ![image.png](attachment:image.png) 从图像中可以看出,使用傅里叶变换得到的卷积结果与使用 numpyconvolve 函数得到的卷积结果非常相似,这验证了卷积定理的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值