tf.nn.conv1d

一、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

参考:

https://blog.csdn.net/u013337743/article/details/87923618

https://blog.csdn.net/DaVinciL/article/details/81359245

原文地址:https://www.cnblogs.com/GumpYan/p/13523511.html