Python关于维卷积的理解

目录
  • 关于维卷积的理解
    • 功能
    • 定义
    • 参数
    • 举例
  • Python编写一维数组的卷积
    • 实现思路如下
  • 总结

关于维卷积的理解

功能

一维卷积一般用于处理文本数据,常用语自然语言处理中,输入一般是文本经过embedding的二维数据。

定义

tf.layers.conv1d(
inputs,
filters,
kernel_size,
strides=1,
padding='valid',
data_format='channels_last',
dilation_rate=1,
activation=None,
use_bias=True,
kernel_initializer=None,
bias_initializer=tf.zeros_initializer(),
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
trainable=True,
name=None,
reuse=None
)

参数

重要参数介绍:

  • inputs:输入tensor, 维度(batch_size, seq_length, embedding_dim) 是一个三维的tensor;其中,batch_size指每次输入的文本数量;seq_length指每个文本的词语数或者单字数;embedding_dim指每个词语或者每个字的向量长度;例如每次训练输入2篇文本,每篇文本有100个词,每个词的向量长度为20,那input维度即为(2, 100, 20)。
  • filters:过滤器(卷积核)的数目
  • kernel_size:卷积核的大小,卷积核本身应该是二维的,这里只需要指定一维,因为第二个维度即长度与词向量的长度一致,卷积核只能从上往下走,不能从左往右走,即只能按照文本中词的顺序,也是列的顺序。

举例

代码

# coding: utf-8
import tensorflow as tf

num_filters = 2
kernel_size = 2
batch_size = 1
seq_length = 4
embedding_dim = 5

embedding_inputs = tf.constant(-1.0, shape=[batch_size, seq_length, embedding_dim], dtype=tf.float32)

with tf.name_scope("cnn"):
    conv = tf.layers.conv1d(embedding_inputs, num_filters, kernel_size, name='conv')

session = tf.Session()
session.run(tf.global_variables_initializer())

print (session.run(conv).shape)

输出为(1, 3, 2)

原理

首先,batch_size = 1即为一篇文本,seq_length = 4定义文本中有4个字(假设以字为单位),embedding_dim = 5定义一个字的向量长度为5,这里初始化每个字的向量都为[1, 1, 1, 1, 1]num_filters = 2定义有两个过滤器,kernel_size = 2定义每个卷积核的宽度为2,长度即为字向量长度5。

一个卷积核通过卷积操作之后得到(4-2+1)*1(seq_length - kernel_size + 1)即3*1的向量,一共有两个卷积核,所以卷积出来的数据维度(1, 3, 2)其中1指一篇文本。

图解

后续

经过卷积之后得到2个feature maps,分别经过pooling层之后,两个3*1的向量就变成两个1*1的常数,在把这两个1*1的常数拼接在一起变成2*1向量,之后就可以进行下一步比如全连接或者softmax操作了。

Python编写一维数组的卷积

之前在网上查阅关于数组卷积的代码时,发现有很多C++代码,但并没有多少关于python的代码,故在此将自己所编写的代码分享出来,希望能一起探讨研究。

实现思路如下

1、先将短数组反转

2、第一阶段,此时只有短数据的(前)部分元素与长数据相乘求和

3、第二阶段,此时短数据的所有元素与长数据相乘求和

4、第三阶段,此时短数据的(后)部分数据与长数据相乘求和

具体应用公式网上有很多,计算过程并不复杂,但比较麻烦的是关于循环变量的边界值的设置,稍有不慎就有可能超出索引值。我的办法是先在草稿纸上写两个数组,元素可以少取几个,然后写出具体卷积的过程数据,尤其不同阶段的过渡的位置,细心找出规律,然后就可以编写具体代码了。

代码入下:

    import matplotlib.pyplot as plt
    import numpy as np

#阶跃信号
def up(x):
    for i in range(len(x)):
        if x[i] < 0:
            y[i] = 0
        else:
            y[i] = 1
    return y

x= np.arange(-10,10,0.1)
y = np.zeros(len(x))

y = up(x)

plt.plot(y)
plt.show()

#高斯滤波器
def gauss(x,s):

    g=1/(((2*np.pi)**0.5)*s)*np.exp(-x**2/2/(s**2))
    return g

sample = np.arange(-10,10,1)
g = gauss(sample,10/3)

plt.plot(g)
plt.show()

#卷积一
f_1 = np.zeros(len(y)+len(g)-1)

#翻转
g = list(g)
g.reverse()

for i in range(len(f_1)):
    #长数据卷积部分短数据(前半部分)
    if i < (len(g)-1):
        for j in range(i+1):
            f_1[i] = y[j]*g[i-j]+f_1[i]
    #长数据卷积整个短数据
    elif i < (len(y)-1):
        for j in range(i-len(g)+1,i+1):
            f_1[i] = y[j]*g[i-j]+f_1[i]
    #长数据卷积部分短数据(后半部分)
    else:
        for j in range(i-len(g)+1,len(y)):
            f[i] = y[j]*g[i-j]+f[i]

#显示
plt.plot(f_1)
plt.show()

#卷积二

#存放卷积后的结果
f_2 = np.zeros(len(y)+len(g)-1)

#翻转
g = list(g)
g.reverse()

for i in range(len(f_2)):

    #根据卷积的不同阶段设置阈值
    t_left = i-len(g)+1
    t_right = i+1

    #卷积的前半部分j的初始值
    if t_left < 0:
        t_left = 0
    #卷积的后半部分j的上限
    if t_right > len(y):
        t_right = len(y)

    for j in range(t_left,t_right):

        f_2[i] = y[j]*g[i-j] + f_2[i]

#显示
plt.plot(f_2)
plt.show()

两种设置阈值的方式,但思想都是一样的。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python CNN卷积神经网络实战教程深入讲解

    目录 一.CNN简介 1. 神经网络基础 2. 卷积一下哦 3. 卷积计算 二.CNN实例代码 一.CNN简介 1. 神经网络基础 输入层(Input layer),众多神经元(Neuron)接受大量非线形输入讯息.输入的讯息称为输入向量. 输出层(Output layer),讯息在神经元链接中传输.分析.权衡,形成输出结果.输出的讯息称为输出向量. 隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面.如果有多个隐藏层,则意味着多个激活函数. 2

  • Pytorch之卷积层的使用详解

    1.简介(torch.nn下的) 卷积层主要使用的有3类,用于处理不同维度的数据 参数 Parameters: in_channels(int) – 输入信号的通道 out_channels(int) – 卷积产生的通道 kerner_size(int or tuple) - 卷积核的尺寸 stride(int or tuple, optional) - 卷积步长 padding (int or tuple, optional)- 输入的每一条边补充0的层数 dilation(int or tu

  • Python使用scipy模块实现一维卷积运算示例

    本文实例讲述了Python使用scipy模块实现一维卷积运算.分享给大家供大家参考,具体如下: 一 介绍 signal模块包含大量滤波函数.B样条插值算法等等.下面的代码演示了一维信号的卷积运算. 二 代码 import numpy as np import scipy.signal x = np.array([1,2,3]) h = np.array([4,5,6]) print(scipy.signal.convolve(x, h))#一维卷积运算 三 运行结果 [ 4 13 28 27 1

  • Python关于维卷积的理解

    目录 关于维卷积的理解 功能 定义 参数 举例 Python编写一维数组的卷积 实现思路如下 总结 关于维卷积的理解 功能 一维卷积一般用于处理文本数据,常用语自然语言处理中,输入一般是文本经过embedding的二维数据. 定义 tf.layers.conv1d( inputs, filters, kernel_size, strides=1, padding='valid', data_format='channels_last', dilation_rate=1, activation=N

  • Tensorflow卷积实现原理+手写python代码实现卷积教程

    从一个通道的图片进行卷积生成新的单通道图的过程很容易理解,对于多个通道卷积后生成多个通道的图理解起来有点抽象.本文以通俗易懂的方式讲述卷积,并辅以图片解释,能快速理解卷积的实现原理.最后手写python代码实现卷积过程,让Tensorflow卷积在我们面前不再是黑箱子! 注意: 本文只针对batch_size=1,padding='SAME',stride=[1,1,1,1]进行实验和解释,其他如果不是这个参数设置,原理也是一样. 1 Tensorflow卷积实现原理 先看一下卷积实现原理,对于

  • python多维数组切片方法

    1.数组a第0个元素(二维数组)下的所有子元素(一维数组)的第一列 import numpy as np b=np.arange(24) a=b.reshape(2,3,4) print a print a[0,:,0] 2.取所有二维数组下的每个二维数组的第0个元素(一维数组) b=np.arange(24) a=b.reshape(2,3,4) print a print '--------------------' print a[:,0] 结果: [[ 0 1 2 3] [12 13 1

  • python 多维切片之冒号和三个点的用法介绍

    初学python和numpy,对在学习多维切片的过程中遇到的问题做个总结. 一维切片就不说了,比较简单,先说下二维的,二维的理解了多维的就简单了.举个例子先建立一个5x5的二维数组 多维的切片是按照各个维度分别取 这里就分别输出第一维的2-3和第二维的3-5(索引从0开始). 这里是行取全部,列取第3-5. 这里应该是大家最疑惑的地方了,为什么列的参数改成None,输出的shape都变了,这里大家要知道,None代表新增加一个维度,它有一个别称叫newaxis,大家可以输出一下numpy.new

  • python入门for循环嵌套理解学习

    目录 for循环的格式 for循环语句格式 1.通过for循环遍历字符串 2.通过for循环遍历列表 3.通过for循环计算1-100的和 4.通过for循环打印九九乘法表 上一一节我们讲了while循环,while循环主要用于重复程序的运行,for循环更加倾向于遍历一个项目,即将特定内容(比如一个列表.一个字符串.一个字典的内容)通过for循环依次展现. for循环的格式 for循环语句格式 接下来我们通过实例来具体讲解for循环的使用: 1.通过for循环遍历字符串 通过for循环遍历字符串

  • python入门while循环语句理解学习

    目录 while循环公式 while循环格式 while-else执行结果 while-break执行结果 while-continue执行结果 循环是我们经常用到的一个概念,比如,循环计算数字叠加.循环输出文字内容等.循环是运行重复内容的一个最简单的方法,简化了代码流程,增加了时效性.因此本章重点讲解下循环的操作流程以及应用. while循环公式 while循环格式 当while后的判断条件成立时,执行循环内容,直到不满足条件为止.下面举个简单的小例子: 比如要计算1+2+3+4+5+-+10

  • Python算法思想集结深入理解动态规划

    目录 1. 概述 什么是重叠子问题 动态规划与分治算法的区别 什么最优子结构 2. 流程 2.1 是否存在子问题 2.2 是否存在重叠子问题 怎么解决重叠子问题 2.3 状态转移 3.总结 1. 概述 动态规划算法应用非常之广泛. 对于算法学习者而言,不跨过动态规划这道门,不算真正了解算法. 初接触动态规划者,理解其思想精髓会存在一定的难度,本文将通过一个案例,抽丝剥茧般和大家聊聊动态规划. 动态规划算法有 3 个重要的概念: 重叠子问题. 最优子结构. 状态转移. 只有吃透这 3 个概念,才叫

  • Python多维/嵌套字典数据无限遍历的实现

    最近拾回Django学习,实例练习中遇到了对多维字典类型数据的遍历操作问题,Google查询没有相关资料-毕竟是新手,到自己动手时发现并非想象中简单,颇有两次曲折才最终实现效果,将过程记录下来希望对大家有用. 实例数据(多重嵌套): person = {"male":{"name":"Shawn"}, "female":{"name":"Betty","age":23

  • python中二维阵列的变换实例

    本文实例讲述了python中二维阵列的变换方法.分享给大家供大家参考.具体方法如下: 先看如下代码: arr = [ [1, 2, 3], [4, 5, 6], [7, 8,9], [10, 11, 12]] print map(list, zip(*arr)) print '_-------------------------------------------------' print [[r[col] for r in arr] for col in range(len(arr[0]))]

  • 15行Python代码带你轻松理解令牌桶算法

    在网络中传输数据时,为了防止网络拥塞,需限制流出网络的流量,使流量以比较均匀的速度向外发送,令牌桶算法就实现了这个功能, 可控制发送到网络上数据的数目,并允许突发数据的发送. 什么是令牌 从名字上看令牌桶,大概就是一个装有令牌的桶吧,那么什么是令牌呢? 紫薇格格拿的令箭,可以发号施令,令行禁止.在计算机的世界中,令牌也有令行禁止的意思,有令牌,则相当于得到了进行操作的授权,没有令牌,就什么都不能做. 用令牌实现限速器 我们用1块令牌来代表发送1字节数据的资格,假设我们源源不断的发放令牌给程序,程

随机推荐