对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
在用tensorflow做一维的卷积神经网络的时候会遇到tf.nn.conv1d和layers.conv1d这两个函数,但是这两个函数有什么区别呢,通过计算得到一些规律。
1.关于tf.nn.conv1d的解释,以下是TensorFlow中关于tf.nn.conv1d的API注解:
Computesa1-Dconvolutiongiven3-Dinputandfiltertensors.
Givenaninputtensorofshape[batch,in_width,in_channels]ifdata_formatis"NHWC",or[batch,in_channels,in_width]ifdata_formatis"NCHW",andafilter/kerneltensorofshape[filter_width,in_channels,out_channels],thisopreshapestheargumentstopassthemtoconv2dtoperformtheequivalentconvolutionoperation.
Internally,thisopreshapestheinputtensorsandinvokes`tf.nn.conv2d`.Forexample,if`data_format`doesnotstartwith"NC",atensorofshape[batch,in_width,in_channels]isreshapedto[batch,1,in_width,in_channels],andthefilterisreshapedto[1,filter_width,in_channels,out_channels].Theresultisthenreshapedbackto[batch,out_width,out_channels]whereoutwidthisafunctionofthestrideandpaddingasinconv2dwhereoutwidthisafunctionofthestrideandpaddingasinconv2dandreturnedtothecaller.
Args:value:A3D`Tensor`.Mustbeoftype`float32`or`float64`.filters:A3D`Tensor`.Musthavethesametypeas`input`.stride:An`integer`.Thenumberofentriesbywhichthefilterismovedrightateachstep.padding:'SAME'or'VALID'use_cudnn_on_gpu:Anoptional`bool`.Defaultsto`True`.data_format:Anoptional`string`from`"NHWC","NCHW"`.Defaultsto`"NHWC"`,thedataisstoredintheorderof[batch,in_width,in_channels].The`"NCHW"`formatstoresdataas[batch,in_channels,in_width].name:Anamefortheoperation(optional).
Returns:
A`Tensor`.Hasthesametypeasinput.
Raises:
ValueError:if`data_format`isinvalid.
什么意思呢?就是说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的格式,和卷积核的个数,下面我们用例子说明问题:
importtensorflowastf importnumpyasnp 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]) #filterwidth,filterchannelsandoutchannels(numberofkernels) cov1=tf.nn.conv1d(inputs,w,stride=1,padding='VALID') withtf.Session()assess: 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:卷积核的大小,卷积核其实应该是一个二维的,这里只需要指定一维,是因为卷积核的第二维与输入的词向量维度是一致的,因为对于句子而言,卷积的移动方向只能是沿着词的方向,即只能在列维度移动。一个例子:
importtensorflowastf importnumpyasnp 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') withtf.Session()assess: sess.run(tf.global_variables_initializer()) out=sess.run(cov2) print(out)
输出结果:
[[[-1.9953331] [-3.5520997] [-5.108866] [-6.6656327]]]
也许你得到的结果和我得到的结果不同,因为在这个函数里面只是设置了卷积核的尺寸和步长,没有设置具体的卷积核矩阵,所以这个卷积核矩阵是随机生成的,就会出现可能运行上面的程序出现不同结果的情况。
以上这篇对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。