tensorflow中tf.nn.conv1d和layers.conv1d的区别

    xiaoxiao2022-07-04  172

    在用tensorflow做一维的卷积神经网络的时候会遇到tf.nn.conv1d和layers.conv1d这两个函数,但是这两个函数有什么区别呢,通过计算得到一些规律。

    1.关于tf.nn.conv1d的解释,以下是Tensor Flow中关于tf.nn.conv1d的API注解:

    Computes a 1-D convolution given 3-D input and filter tensors.

    Given an input tensor of shape   [batch, in_width, in_channels] if data_format is "NHWC", or   [batch, in_channels, in_width] if data_format is "NCHW", and a filter / kernel tensor of shape [filter_width, in_channels, out_channels], this op reshapes the arguments to pass them to conv2d to perform the equivalent convolution operation.

    Internally, this op reshapes the input tensors and invokes `tf.nn.conv2d`. For example, if `data_format` does not start with "NC", a tensor of shape   [batch, in_width, in_channels] is reshaped to   [batch, 1, in_width, in_channels], and the filter is reshaped to   [1, filter_width, in_channels, out_channels]. The result is then reshaped back to   [batch, out_width, out_channels] \(where out_width is a function of the stride and padding as in conv2d\) and returned to the caller.

    Args:   value: A 3D `Tensor`.  Must be of type `float32` or `float64`.   filters: A 3D `Tensor`.  Must have the same type as `input`.   stride: An `integer`.  The number of entries by which     the filter is moved right at each step.   padding: 'SAME' or 'VALID'   use_cudnn_on_gpu: An optional `bool`.  Defaults to `True`.   data_format: An optional `string` from `"NHWC", "NCHW"`.  Defaults     to `"NHWC"`, the data is stored in the order of     [batch, in_width, in_channels].  The `"NCHW"` format stores     data as [batch, in_channels, in_width].   name: A name for the operation (optional).

    Returns:   A `Tensor`.  Has the same type as input.

    Raises:   ValueError: if `data_format` is invalid. 什么意思呢?就是说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:名称。可省略。 首先从参数列表可以看出value指的输入的数据,stride就是卷积的步长,这里我们最有疑问的就是filters这个参数,那么我们对filter进行简单的说明。从上面可以看到filters的格式为:[filter_width, in_channels, out_channels],这是一个数组的维度,对应的是卷积核的大小,输入的channel的格式,和卷积核的个数,下面我们用例子说明问题:

    import tensorflow as tf import numpy as np if __name__ == '__main__': inputs = tf.constant(np.arange(1, 6, dtype=np.float32), shape=[1, 5, 1]) w = np.array([1, 2], dtype=np.float32).reshape([2, 1, 1]) # filter width, filter channels and out channels(number of kernels) cov1 = tf.nn.conv1d(inputs, w, stride=1, padding='VALID') with tf.Session() as sess: sess.run(tf.global_variables_initializer()) out = sess.run(cov1) print(out)

    其输出为:[[[ 5.],         [ 8.],         [11.],         [14.]]] 我们分析一下,输入的数据为[[[1],[2],[3],[4],[5]]],有5个特征,分别对应的数值为1,2,3,4,5,那么经过卷积的结果为5,8,11,14,那么这个结果是怎么来的呢,我们根据卷积的计算,可以得到5 = 1*1 + 2*2, 8=2*1+ 3*2, 11 = 3*1+4*2, 14=4*1+5*2, 也就是W1=1, W2=2,正好和我们先面filters设置的数值相等,

    w = np.array([1, 2], dtype=np.float32).reshape([2, 1, 1])

    所以可以看到这个filtes设置的是是卷积核矩阵的,换句话说,卷积核矩阵我们是可以设置的。

    2. 1.关于tf.layers.conv1d,函数的定义如下

    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, filters, kernel_size,下面分别说明   inputs :  输入tensor, 维度(None,  a, b) 是一个三维的tensor              None  :  一般是填充样本的个数,batch_size              a         :  句子中的词数或者字数              b          :    字或者词的向量维度   filters :  过滤器的个数 kernel_size : 卷积核的大小,卷积核其实应该是一个二维的,这里只需要指定一维,是因为卷积核的第二维与输入的词向量维度是一致的,因为对于句子而言,卷积的移动方向只能是沿着词的方向,即只能在列维度移动。

    一个例子:

    import tensorflow as tf import numpy as np if __name__ == '__main__': inputs = tf.constant(np.arange(1, 6, dtype=np.float32), shape=[1, 5, 1]) cov2 = tf.layers.conv1d(inputs, filters=1, kernel_size=2, strides=1, padding='VALID') with tf.Session() as sess: sess.run(tf.global_variables_initializer()) out = sess.run(cov2) print(out)

    输出结果:[[[-1.9953331]   [-3.5520997]   [-5.108866 ]   [-6.6656327]]]

    也许你得到的结果和我得到的结果不同,因为在这个函数里面只是设置了卷积核的尺寸和步长,没有设置具体的卷积核矩阵,所以这个卷积核矩阵是随机生成的,就会出现可能运行上面的程序出现不同结果的情况。

     

    引用:

    https://blog.csdn.net/u011734144/article/details/84066928

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

    最新回复(0)