網站首頁 編程語言 正文
關于維卷積的理解
功能
一維卷積一般用于處理文本數據,常用語自然語言處理中,輸入一般是文本經過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()
兩種設置閾值的方式,但思想都是一樣的。
總結
原文鏈接:https://jingliu.blog.csdn.net/article/details/115069025
相關推薦
- 2022-07-19 Linux——磁盤管理與文件系統
- 2022-10-06 Redis中鍵和數據庫通用指令詳解_Redis
- 2022-10-06 Iptables防火墻自定義鏈表實現方式_安全相關
- 2022-06-23 C++11中模板隱式實例化與顯式實例化的定義詳解分析_C 語言
- 2023-12-19 CentOS和Ubuntu中防火墻相關命令
- 2022-03-21 SQL?查詢連續登錄的用戶情況_MsSql
- 2022-07-20 centos 安裝jenkins 實現自動部署到遠程服務器 (樹莓派可用)
- 2023-03-16 Flutter?Zone異常處理方法及基本原理_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支