学习&转载文章:使用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的一维卷积的更多相关文章

  1. 【转】python中的一维卷积conv1d和二维卷积conv2d

    转自:https://blog.csdn.net/qq_26552071/article/details/81178932 二维卷积conv2d 给定4维的输入张量和滤波器张量来进行2维的卷积计算.即 ...

  2. 卷积神经网络(CNN)之一维卷积、二维卷积、三维卷积详解

    作者:szx_spark 由于计算机视觉的大红大紫,二维卷积的用处范围最广.因此本文首先介绍二维卷积,之后再介绍一维卷积与三维卷积的具体流程,并描述其各自的具体应用. 1. 二维卷积 图中的输入的数据 ...

  3. 深度学习面试题09:一维卷积(Full卷积、Same卷积、Valid卷积、带深度的一维卷积)

    目录 一维Full卷积 一维Same卷积 一维Valid卷积 三种卷积类型的关系 具备深度的一维卷积 具备深度的张量与多个卷积核的卷积 参考资料 一维卷积通常有三种类型:full卷积.same卷积和v ...

  4. Full卷积、Same卷积、Valid卷积、带深度的一维卷积

    转载和参考以下几个链接:https://www.cnblogs.com/itmorn/p/11177439.html; https://blog.csdn.net/jack__linux/articl ...

  5. python conv2d scipy卷积运算

    scipy的signal模块经常用于信号处理,卷积.傅里叶变换.各种滤波.差值算法等. *两个一维信号卷积 >>> import numpy as np >>> x ...

  6. tensorflow 一维卷积 tf.layers.conv1()使用

    在自然语言处理中,主要使用一维的卷积. API tf.layers.conv1d( inputs, filters, kernel_size, strides=1, padding='valid', ...

  7. LeNet - Python中的卷积神经网络

    本教程将  主要面向代码,  旨在帮助您 深入学习和卷积神经网络.由于这个意图,我  不会花很多时间讨论激活功能,池层或密集/完全连接的层 - 将来会有  很多教程在PyImageSearch博客上将 ...

  8. NLP(十八) 一维卷积网络IMDB情感分析

    准备 Keras的IMDB数据集,包含一个词集和对应的情感标签 import pandas as pd from keras.preprocessing import sequence from ke ...

  9. python 实现简单卷积网络框架

    第一步定义卷积核类: class Filter(object): # 滤波器类 对卷积核进行初始化 def __init__(self,width,height,depth): # initializ ...

  10. 【Python】keras卷积神经网络识别mnist

    卷积神经网络的结构我随意设了一个. 结构大概是下面这个样子: 代码如下: import numpy as np from keras.preprocessing import image from k ...

随机推荐

  1. 使用NTP,该如何同步时间?一文详解!

    ​ 一.NTP通信概述 很多场景中,由于业务需要,模块需要保持正确的系统时钟,才能正常工作.但是模块上电后的初试时间戳是946713600(即2000/01/01,16:00:00),所以同步时钟成为 ...

  2. RedisTemplate RedisConfig 序列化方式 fastjson2

    目录 Fastjson2 序列化 Redis.config RedisUtil.java fastjson和fastjson2的区别 Spring Data Redis 为我们提供了下面的Serial ...

  3. Python 潮流周刊#78:async/await 是糟糕的设计(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  4. Docker之基础(一)

    接触Docker有很久一段时间, 但是没有好好总结一下, 借此公司项目全面容器化, 记录一下常用的Docker操作 概况: 本次容器化的项目包括PHP+Python项目,PHP是基于php-fpm的基 ...

  5. Git之常用文件

    git项目中的特殊文件, 常见文件有.gitignore, .gitkeep 1) .gitkeep git默认是不允许提交一个空的目录到版本库上的, 可以在空的文件夹里面建立一个.gitkeep文件 ...

  6. elasticsearch-head插件基本使用

    1. 查看搜索setting信息 mp_index/_settings 2. 设置分片数量 3, 修改数据刷新间隔 { "refresh_interval": "30s& ...

  7. Git学习【1】 -- 基本常用命令

    目录 1.设置用户名 2.设置用户邮箱 3.初始化文件夹 4.如何修改文件 5.如何删除文件 6. 远程github操作 7. 设置密码 安装完Git,如何玩呢?下面是一些初始化和初级的常用命令. 新 ...

  8. 物联网CC2530按键单双击分别控制两灯

    (1)确定思路单击和双击的效果分别是怎样的(此文章采用简单的延时函数不涉及中断).首先可以定义一个普通延时delay和一个标志位count变量,这里需有个延时阈值咱们直接可以宏定义B值(这里需要注意宏 ...

  9. 教你自创工作流,赋予AI助理个性化推荐超能力

    之前,我们已经完成了工作流的基本流程和整体框架设计,接下来的任务就是进入实际操作和实现阶段.如果有同学对工作流的整体结构还不够熟悉,可以先参考一下这篇文章,帮助你更好地理解和掌握工作流的各个部分: 本 ...

  10. R数据分析:潜在转化分析LTA的做法和解释(一)

    之前给大家写了很多潜在类别分析的教程Mplus教程:如何做潜在类别分析LCA R数据分析:用R语言做潜类别分析LCA Mplus数据分析:潜在类别分析(LCA)流程(详细版) R数据分析:再写潜在类别 ...