使用Python的一维卷积

使用,python,一维,卷积 · 浏览次数 : 590

小编点评

**一维卷积背景在机器学习算法开发中的重要性** 在机器学习算法中,提取最相关的特征是提取最重要的特征非常重要的步骤。这在 CNNs 中非常重要,因为在早期层中,它将能够提取图像中最重要的特征,例如边缘和形状。另一方面,在最后一层中,它将能够组合各种特征以提取更复杂的特征,例如眼睛或嘴巴,这在例如我们想要创建人类图像的分类器时可能很有用。 一维卷积是一种在两个向量之间定义的线性运算,用于从图像中提取特征。它的核心原理是在对输入图像进行滑动窗口操作,并计算窗口内每个像素的与核中每个像素的积和。通过累加所有积和,我们可以得到特征图。 在图像处理中,卷积是一种非常常用的操作。它在计算机视觉、自然语言处理和其他领域中广泛应用于图像分类、物体检测、特征提取等任务中。 **一维卷积的步骤** 1. **输入**:输入图像的向量 \\(x\\)。 2. **核**:核是一个方形矩阵,大小与输入图像大小相同。 3. **卷积**:对输入图像的每个像素执行核与核的点积,并累加所有积和得到特征值。 4. **输出**:卷积后结果的向量。 **卷积的应用** * **图像分类**:通过在每个像素上计算特征值来对图像进行分类。 * **物体检测**:通过在图像中寻找具有特定形状和大小的物体来进行物体检测。 * **特征提取**:通过在图像中找到具有特定特征的区域来提取特征。

正文

学习&转载文章:使用Python的一维卷积

背景

在开发机器学习算法时,最重要的事情之一(如果不是最重要的话)是提取最相关的特征,这是在项目的特征工程部分中完成的。

在CNNs中,此过程由网络自动完成。特别是在早期层中,网络试图提取图像的最重要的特征,例如边缘和形状

另一方面,在最后一层中,它将能够组合各种特征以提取更复杂的特征,例如眼睛或嘴巴,这在例如我们想要创建人类图像的分类器时可能很有用。

让我们想象一只狗的形象。我们想在这张图片中找到一只耳朵,以确保有一只狗。我们可以创建一个滤波器或核,以查看它是否可以在图像中的各个点找到耳朵。

图片

在图像中,我们有一组紫色的权重(内核),当乘以输入图像的像素值时,它会告诉我们是否存在耳朵或下巴。我们是如何创建这些权重参数的?嗯…随机!网络的训练将慢慢学习正确的权重参数。

生成的输出(橙色)称为特征图

通常在卷积之后,所以在获得特征图之后,我们有汇集层来汇总更多信息,然后我们将进行另一个卷积等等,但我们在本文中不讨论其他层。

一维卷积

我们直观地理解了卷积如何从图像中提取特征。但卷积也经常与文本等其他类型的数据一起使用,这是因为卷积只是一个公式,我们需要了解它是如何工作的。

一维卷积是在两个向量之间定义的,而不是像图像中的情况那样在矩阵之间定义的。

所以我们将有一个向量\(x\)作为我们的输入,一个核\(w\)作为第二个向量。

图片

符号\(*\)表示卷积(不是乘法)。\(Y[i]\)是合成向量\(Y\)的元素\(i\)

首先,如果你注意到求和的极端值从\(-inf\)\(+inf\),但这在机器学习中没有太大意义。我们通常给某个大小加前缀。假设输入向量的大小必须为12。但是如果向量小于前缀大小会发生什么?嗯,我们可以在向量的开头和结尾添加零,以使其大小正确,这种技术称为填充

图片

然后我们假设原始输入\(x\)和滤波器\(w\)分别具有大小\(n\)\(m\),其中\(n≤ m\)、 然后,带有填充的输入将具有大小\(n+2p\),原始公式如下。

图片

从上面的公式中,我们可以注意到一件事:我们所做的是滚动\(x^p\)向量和\(w\)向量的单元格。然而,向量\(x^p\)从右向左滚动,\(w\)从左向右滚动。但是,我们可以简单地反转向量\(w\),并执行\(x^p\)\(w^{rotated}\)之间的向量积。

\(x^p\):表示\(x\)填充后的

\(w^{rotated}\):表示\(x\)旋转后的

让我们直观地看看会发生什么。首先,我们旋转滤波器(旋转\(w\))。

图片

初始公式告诉我们要做的是使两个向量之间的向量积,只考虑初始向量的一部分。这部分被称为局部感受野。然后,我们将向量\(w^R\)每次滑动两个位置,在这种情况下,我们将说我们使用的是步幅=2。后者也是我们需要优化的网络的超参数。

图片

padding

你应该注意,根据我们使用的填充模式,我们或多或少地强调了一些输入单元格。在前面的例子中,当我们计算输出\(y[0]\)时,单元格\(x[0]\)只考虑了一次。相反,在\(y[1]\)\(y[2]\)的计算中都考虑了\(x[2]\)单元,因此它更重要。我们还可以通过使用填充来处理向量边界处的单元格的这种重要性。

有3种不同类型的填充:

  • 全模式:填充参数\(p\)设置为\(p=m-1\),其中\(m\)是核大小。这种填充导致输出大于输入,因此很少使用。
  • 相同模式:用于确保输出与输入大小相同。例如,在计算机视觉中,输出图像将与输入图像大小相同,因此通常是最常用的。
  • 有效模式:当\(p=0\)时,因此我们不使用填充。

如何确定卷积输出大小?

许多人经常对CNN各个层的输入和输出大小感到困惑,并与不匹配的错误作斗争!实际上,计算卷积层的输出大小非常简单。

假设我们有一个输入\(x\),一个核\(w\),并且想要计算卷积\(y=x*w\)

要考虑的参数是\(x\)的大小\(n\)\(w\)的大小\(m\)、填充\(p\)和步幅\(s\)。输出的大小\(o\)将由以下公式给出:

图片

符号$⌊⌋ \(指示向下取整操作。例如\)⌊2.4⌋ = 2$.

让我们看看如何应用公式和示例:

图片

在第一个示例中,我们看到输出大小与输入大小相同,因此我们推断使用了相同的模式填充

我们看到另一个例子,我们改变了核大小和步长。

图片

编码

如果到目前为止你仍然有点困惑,没问题。让我们开始着手编写代码,事情会变得更清楚。

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的卷积方法的结果是相同的。卷积是卷积神经网络以及现代计算机视觉的基本元素。我们经常在不了解其组成的构建块的情况下立即开始实现复杂的算法。

与使用Python的一维卷积相似的内容:

使用Python的一维卷积

学习&转载文章:使用Python的一维卷积 背景 在开发机器学习算法时,最重要的事情之一(如果不是最重要的话)是提取最相关的特征,这是在项目的特征工程部分中完成的。 在CNNs中,此过程由网络自动完成。特别是在早期层中,网络试图提取图像的最重要的特征,例如边缘和形状。 另一方面,在最后一层中,它将能

【pandas基础】--核心数据结构

pandas中用来承载数据的两个最重要的结构分别是: Series:相当于增强版的一维数组 DataFrame:相当于增强版的二维数组 pandas最大的优势在于处理表格类数据,如果数据维度超过二维,一般我们会使用另一个 python的库 numpy。 本篇主要介绍这两种核心数据结构的创建方式。 1

NumPy 数组迭代与合并详解

NumPy 数组迭代 NumPy 数组迭代是访问和处理数组元素的重要方法。它允许您逐个或成组地遍历数组元素。 基本迭代 我们可以使用 Python 的基本 for 循环来迭代 NumPy 数组。 一维数组迭代: import numpy as np arr = np.array([1, 2, 3,

NumPy 数组切片及数据类型介绍

NumPy 数组切片 NumPy 数组切片用于从数组中提取子集。它类似于 Python 中的列表切片,但支持多维数组。 一维数组切片 要从一维数组中提取子集,可以使用方括号 [] 并指定切片。切片由起始索引、结束索引和可选步长组成,用冒号 : 分隔。 语法: arr[start:end:step]

Python数据分析 DataFrame 笔记

08,DataFrame创建 DataFrame是一个【表格型】的数据结构,可以看做是【由Series组成的字典】(共用同一个索引)。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。 行索引:index

Python连接Etcd集群基础教程

1、背景介绍 最近接手了一个项目,项目是使用Python开发的,其中使用到了Etcd,但是项目之前开发的方式,只能够支持单节点连接Etcd,不能够在Etcd节点发生故障时,自动转移。因此需要实现基于现有etcd sdk 开发一个能够实现故障转移的功能,或者更换etcd sdk来实现故障转移等功能。

快速上手python的简单web框架flask

简介 python可以做很多事情,虽然它的强项在于进行向量运算和机器学习、深度学习等方面。但是在某些时候,我们仍然需要使用python对外提供web服务。 比如我们现在有一个用python写好的模型算法,这个模型算法需要接收前端的输入,然后进行模拟运算,最终得到最后的输出。这个流程是一个典型的web

【学习笔记】Python 使用 matplotlib 画图

目录安装中文显示折线图、点线图柱状图、堆积柱状图坐标轴断点参考资料 本文将介绍如何使用 Python 的 matplotlib 库画图,记录一些常用的画图 demo 代码 安装 # 建议先切换到虚拟环境中 pip install matplotlib 中文显示 新版的 matplotlib 已经支持

深度学习(一)——使用Python读取图片

Pytorch处理图像的一些入门,内含os和PIL库相关的图像处理方法

桌面应用打包:pyinstaller

在使用python开发一些小工具时,如果其他人电脑中没有python环境或者没有安装相应的第三方库,是没办法运行的,而要求对方安装又不现实,尤其是对方不是技术人员,因此如何将一个独立的python程序,使它成为成为一个不用考虑环境,双击即可运行的桌面应用呢?使用pyinstaller打包是一个不错的选择。