Python關(guān)于維卷積的理解
關(guān)于維卷積的理解
功能
一維卷積一般用于處理文本數(shù)據(jù),常用語自然語言處理中,輸入一般是文本經(jīng)過embedding的二維數(shù)據(jù)。
定義
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 )
參數(shù)
重要參數(shù)介紹:
inputs:輸入tensor, 維度(batch_size, seq_length, embedding_dim) 是一個(gè)三維的tensor;其中,batch_size指每次輸入的文本數(shù)量;seq_length指每個(gè)文本的詞語數(shù)或者單字?jǐn)?shù);embedding_dim指每個(gè)詞語或者每個(gè)字的向量長度;例如每次訓(xùn)練輸入2篇文本,每篇文本有100個(gè)詞,每個(gè)詞的向量長度為20,那input維度即為(2, 100, 20)。filters:過濾器(卷積核)的數(shù)目kernel_size:卷積核的大小,卷積核本身應(yīng)該是二維的,這里只需要指定一維,因?yàn)榈诙€(gè)維度即長度與詞向量的長度一致,卷積核只能從上往下走,不能從左往右走,即只能按照文本中詞的順序,也是列的順序。
舉例
代碼
# 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個(gè)字(假設(shè)以字為單位),embedding_dim = 5定義一個(gè)字的向量長度為5,這里初始化每個(gè)字的向量都為[1, 1, 1, 1, 1],num_filters = 2定義有兩個(gè)過濾器,kernel_size = 2定義每個(gè)卷積核的寬度為2,長度即為字向量長度5。
一個(gè)卷積核通過卷積操作之后得到(4-2+1)*1(seq_length - kernel_size + 1)即3*1的向量,一共有兩個(gè)卷積核,所以卷積出來的數(shù)據(jù)維度(1, 3, 2)其中1指一篇文本。
圖解

后續(xù)
經(jīng)過卷積之后得到2個(gè)feature maps,分別經(jīng)過pooling層之后,兩個(gè)3*1的向量就變成兩個(gè)1*1的常數(shù),在把這兩個(gè)1*1的常數(shù)拼接在一起變成2*1向量,之后就可以進(jìn)行下一步比如全連接或者softmax操作了。
Python編寫一維數(shù)組的卷積
之前在網(wǎng)上查閱關(guān)于數(shù)組卷積的代碼時(shí),發(fā)現(xiàn)有很多C++代碼,但并沒有多少關(guān)于python的代碼,故在此將自己所編寫的代碼分享出來,希望能一起探討研究。
實(shí)現(xiàn)思路如下
1、先將短數(shù)組反轉(zhuǎn)
2、第一階段,此時(shí)只有短數(shù)據(jù)的(前)部分元素與長數(shù)據(jù)相乘求和
3、第二階段,此時(shí)短數(shù)據(jù)的所有元素與長數(shù)據(jù)相乘求和
4、第三階段,此時(shí)短數(shù)據(jù)的(后)部分?jǐn)?shù)據(jù)與長數(shù)據(jù)相乘求和
具體應(yīng)用公式網(wǎng)上有很多,計(jì)算過程并不復(fù)雜,但比較麻煩的是關(guān)于循環(huán)變量的邊界值的設(shè)置,稍有不慎就有可能超出索引值。我的辦法是先在草稿紙上寫兩個(gè)數(shù)組,元素可以少取幾個(gè),然后寫出具體卷積的過程數(shù)據(jù),尤其不同階段的過渡的位置,細(xì)心找出規(guī)律,然后就可以編寫具體代碼了。
代碼入下:
import matplotlib.pyplot as plt
import numpy as np
#階躍信號(hào)
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)
#翻轉(zhuǎn)
g = list(g)
g.reverse()
for i in range(len(f_1)):
#長數(shù)據(jù)卷積部分短數(shù)據(jù)(前半部分)
if i < (len(g)-1):
for j in range(i+1):
f_1[i] = y[j]*g[i-j]+f_1[i]
#長數(shù)據(jù)卷積整個(gè)短數(shù)據(jù)
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]
#長數(shù)據(jù)卷積部分短數(shù)據(jù)(后半部分)
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()
#卷積二
#存放卷積后的結(jié)果
f_2 = np.zeros(len(y)+len(g)-1)
#翻轉(zhuǎn)
g = list(g)
g.reverse()
for i in range(len(f_2)):
#根據(jù)卷積的不同階段設(shè)置閾值
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()
兩種設(shè)置閾值的方式,但思想都是一樣的。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python?clip與range函數(shù)保姆級(jí)使用教程
本文主要和大家介紹了詳解Python中clip與range函數(shù)的用法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參,希望能幫助到大家2022-06-06
講解Python中for循環(huán)下的索引變量的作用域
這篇文章主要介紹了講解Python中for循環(huán)下的索引變量的作用域,是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),本文給出了Python3的示例幫助讀者理解,需要的朋友可以參考下2015-04-04
基于opencv實(shí)現(xiàn)手勢控制音量(案例詳解)
這篇文章主要介紹了基于opencv的手勢控制音量和ai換臉,通過定義了一個(gè)名為 handDetector 的類,用于檢測和跟蹤手部,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
Python+OpenCV實(shí)現(xiàn)圖像基本操作的示例詳解
這篇文章主要為大家詳細(xì)介紹了Python通過OpenCV實(shí)現(xiàn)圖像的一些基本處理操作的方法,文中的示例代碼簡潔易懂,具有一定的參考價(jià)值,感興趣的可以學(xué)習(xí)一下2023-04-04
python時(shí)間與Unix時(shí)間戳相互轉(zhuǎn)換方法詳解
這篇文章主要介紹了python時(shí)間與Unix時(shí)間戳相互轉(zhuǎn)換方法詳解,需要的朋友可以參考下2020-02-02
Python如何基于rsa模塊實(shí)現(xiàn)非對稱加密與解密
這篇文章主要介紹了Python如何基于rsa模塊實(shí)現(xiàn)非對稱加密與解密,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01

