一、conv1d
在NLP領域,甚至圖像處理的時候,我們可能會用到一維卷積(conv1d)。所謂的一維卷積可以看作是二維卷積(conv2d)的簡化,二維卷積是將一個特征圖在width和height兩個方向上進行滑窗操作,對應位置進行相乘並求和;而一維卷積則是只在width或者說height方向上進行滑窗並相乘求和。
tensorflow中的conv1d和conv2d的區別:conv1d是單通道的,conv2d是多通道,所以conv1d適合處理文本序列,conv2d適合處理圖像。
二、詳解
conv1d的參數含義:(以NHWC格式為例,即,通道維在最后)
1、value:在注釋中,value的格式為:[batch, in_width, in_channels],batch為樣本維,表示多少個樣本,in_width為寬度維,表示樣本的寬度,in_channels維通道維,表示樣本有多少個通道。
事實上,也可以把格式看作如下:[batch, 行數, 列數],把每一個樣本看作一個平鋪開的二維數組。這樣的話可以方便理解。
2、filters:在注釋中,filters的格式為:[filter_width, in_channels, out_channels]。按照value的第二種看法,filter_width可以看作每次與value進行卷積的行數,in_channels表示value一共有多少列(與value中的in_channels相對應)。out_channels表示輸出通道,可以理解為一共有多少個卷積核,即卷積核的數目。
3、stride:一個整數,表示步長,每次(向下)移動的距離(TensorFlow中解釋是向右移動的距離,這里可以看作向下移動的距離)。
4、padding:同conv2d,value是否需要在下方填補0。
5、name:名稱。可省略。
# tensorflow2.1.0+win10 import tensorflow.compat.v1 as tf tf.disable_v2_behavior() import numpy as np # 定義一個矩陣a,表示需要被卷積的矩陣。[batch, 行數, 列數],把每一個樣本看作一個平鋪開的二維數組。 # 在注釋中,value的格式為:[batch, in_width, in_channels],batch為樣本維,表示多少個樣本,in_width為寬度維,表示樣本的寬度,in_channels維通道維,表示樣本有多少個通道。 # 事實上,也可以把格式看作如下:[batch, 行數, 列數],把每一個樣本看作一個平鋪開的二維數組。這樣的話可以方便理解。 a = np.array(np.arange(1, 1 + 20).reshape([1, 10, 2]), dtype=np.float32) # 卷積核,此處卷積核的數目為1,filters:在注釋中,filters的格式為:[filter_width, in_channels, out_channels]。 # 按照value的第二種看法,filter_width可以看作每次與value進行卷積的行數,in_channels表示value一共有多少列(與value中的in_channels相對應)。 # out_channels表示輸出通道,可以理解為一共有多少個卷積核,即卷積核的數目。 kernel = np.array(np.arange(1, 1 + 4), dtype=np.float32).reshape([2, 2, 1]) # 進行conv1d卷積 conv1d = tf.nn.conv1d(a, kernel, 1, 'VALID') with tf.Session() as sess: # 初始化 sess.run(tf.global_variables_initializer()) print(sess.run(conv1d))
輸出:
卷積層輸出維度計算:
outlength = 向上取整((inlength-filterlength+1)/ stridelength)
10-2+1/1=9,卷積的輸出維度是9
參考: