1 功能
一維卷積一般用于處理文本數(shù)據(jù),常用語(yǔ)自然語(yǔ)言處理中阐枣,輸入一般是文本經(jīng)過(guò)embedding的二維數(shù)據(jù)。
2 定義
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
)
3 參數(shù)
重要參數(shù)介紹:
- inputs: 輸入tensor, 維度(batch_size, seq_length, embedding_dim) 是一個(gè)三維的tensor;其中吨岭,batch_size指每次輸入的文本數(shù)量;seq_length指每個(gè)文本的詞語(yǔ)數(shù)或者單字?jǐn)?shù)峦树;embedding_dim指每個(gè)詞語(yǔ)或者每個(gè)字的向量長(zhǎng)度辣辫;例如每次訓(xùn)練輸入2篇文本旦事,每篇文本有100個(gè)詞,每個(gè)詞的向量長(zhǎng)度為20急灭,那input維度即為(2, 100, 20)姐浮。
- filters:過(guò)濾器(卷積核)的數(shù)目
- kernel_size:卷積核的大小,卷積核本身應(yīng)該是二維的葬馋,這里只需要指定一維卖鲤,因?yàn)榈诙€(gè)維度即長(zhǎng)度與詞向量的長(zhǎng)度一致,卷積核只能從上往下走畴嘶,不能從左往右走扫尖,即只能按照文本中詞的順序,也是列的順序掠廓。
4 舉例
- 代碼
# 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è)字的向量長(zhǎng)度為5条摸,這里初始化每個(gè)字的向量都為[1, 1, 1, 1, 1]
悦污,num_filters = 2
定義有兩個(gè)過(guò)濾器,kernel_size = 2
定義每個(gè)卷積核的寬度為2钉蒲,長(zhǎng)度即為字向量長(zhǎng)度5切端。一個(gè)卷積核通過(guò)卷積操作之后得到(4-2+1)*1
(seq_length - kernel_size + 1)即3*1
的向量,一共有兩個(gè)卷積核顷啼,所以卷積出來(lái)的數(shù)據(jù)維度(1, 3, 2)
其中1指一篇文本踏枣。 -
圖解
- 后續(xù)
經(jīng)過(guò)卷積之后得到2個(gè)feature maps,分別經(jīng)過(guò)pooling層之后钙蒙,兩個(gè)3*1
的向量就變成兩個(gè)1*1
的常數(shù)茵瀑,在把這兩個(gè)1*1
的常數(shù)拼接在一起變成2*1
向量,之后就可以進(jìn)行下一步比如全連接或者softmax操作了躬厌。