使用Python的一维卷积
学习&转载文章:使用Python的一维卷积
背景#
在开发机器学习算法时,最重要的事情之一(如果不是最重要的话)是提取最相关的特征,这是在项目的特征工程部分中完成的。
在CNNs中,此过程由网络自动完成。特别是在早期层中,网络试图提取图像的最重要的特征,例如边缘和形状。
另一方面,在最后一层中,它将能够组合各种特征以提取更复杂的特征,例如眼睛或嘴巴,这在例如我们想要创建人类图像的分类器时可能很有用。
让我们想象一只狗的形象。我们想在这张图片中找到一只耳朵,以确保有一只狗。我们可以创建一个滤波器或核,以查看它是否可以在图像中的各个点找到耳朵。
在图像中,我们有一组紫色的权重(内核),当乘以输入图像的像素值时,它会告诉我们是否存在耳朵或下巴。我们是如何创建这些权重参数的?嗯…随机!网络的训练将慢慢学习正确的权重参数。
生成的输出(橙色)称为特征图。
通常在卷积之后,所以在获得特征图之后,我们有汇集层来汇总更多信息,然后我们将进行另一个卷积等等,但我们在本文中不讨论其他层。
一维卷积#
我们直观地理解了卷积如何从图像中提取特征。但卷积也经常与文本等其他类型的数据一起使用,这是因为卷积只是一个公式,我们需要了解它是如何工作的。
一维卷积是在两个向量之间定义的,而不是像图像中的情况那样在矩阵之间定义的。
所以我们将有一个向量

符号
首先,如果你注意到求和的极端值从
然后我们假设原始输入

从上面的公式中,我们可以注意到一件事:我们所做的是滚动
:表示 填充后的
:表示 旋转后的
让我们直观地看看会发生什么。首先,我们旋转滤波器(旋转

初始公式告诉我们要做的是使两个向量之间的向量积,只考虑初始向量的一部分。这部分被称为局部感受野。然后,我们将向量

padding#
你应该注意,根据我们使用的填充模式,我们或多或少地强调了一些输入单元格。在前面的例子中,当我们计算输出
有3种不同类型的填充:
- 全模式:填充参数
设置为 ,其中 是核大小。这种填充导致输出大于输入,因此很少使用。 - 相同模式:用于确保输出与输入大小相同。例如,在计算机视觉中,输出图像将与输入图像大小相同,因此通常是最常用的。
- 有效模式:当
时,因此我们不使用填充。
如何确定卷积输出大小?
许多人经常对CNN各个层的输入和输出大小感到困惑,并与不匹配的错误作斗争!实际上,计算卷积层的输出大小非常简单。
假设我们有一个输入
要考虑的参数是
符号$⌊⌋
让我们看看如何应用公式和示例:

在第一个示例中,我们看到输出大小与输入大小相同,因此我们推断使用了相同的模式填充。
我们看到另一个例子,我们改变了核大小和步长。

编码#
如果到目前为止你仍然有点困惑,没问题。让我们开始着手编写代码,事情会变得更清楚。
import numpy as np
def conv1D(x,w, p=0 , s=1):
'''
x : input vector
w : filter
p : padding size
s : stride
'''
assert len(w) <= len(x), "x should be bigger than w"
assert p >= 0, "padding cannot be negative"
w_r = np.array(w[::-1]) #rotation of w
x_padded = np.array(x)
if p > 0 :
zeros = np.zeros(shape = p)
x_padded = np.concatenate([zeros, x_padded, zeros]) #add zeros around original vector
out = []
#iterate through the original array s cells per step
for i in range(0, int((len(x_padded) - len(w_r))) + 1 , s):
out.append(np.sum(x_padded[i:i + w_r.shape[0]] * w_r)) #formula we have seen before
return np.array(out)
让我们尝试在一些真实数据上运行此函数并查看结果。让我们将结果与自动计算卷积结果的NumPy内置函数进行比较。
x = [3,6,8,2,1,4,7,9]
w = [4 ,0, 6, 3, 2]
conv1D(x,w,2,1)
'''
>>> array([50., 53., 76., 64., 56., 67., 56., 83.])
'''
np.convolve(x , w, mode = 'same')
'''
>>> array([50., 53., 76., 64., 56., 67., 56., 83.])
'''
最后#
正如你所看到的,我们开发的函数和NumPy的卷积方法的结果是相同的。卷积是卷积神经网络以及现代计算机视觉的基本元素。我们经常在不了解其组成的构建块的情况下立即开始实现复杂的算法。
作者:Hang Shao
出处:https://www.cnblogs.com/pam-sh/p/17059497.html
版权:本作品采用「知识共享」许可协议进行许可。
声明:欢迎交流! 原文链接 ,如有问题,可邮件(mir_soh@163.com)咨询.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)