这几天在看代码,然后看网上关于一维卷积介绍的文档很多,但是对于tf.nn.conv1d 矩阵运算过程几乎没有介绍,这里我就将刚弄懂的写出来,希望能帮到大家理解这个函数,也为了让自己以后能更好的查阅~~
conv1d(value, filters, stride, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
value: A 3D Tensor
. Must be of type float16
or float32
.
被卷积的矩阵:可以当成是[batch, sample, feature]
filters: A 3D Tensor
. Must have the same type as input
.
卷积核:形状 [filter_width, in_channels, out_channels]
stride: An integer
. The number of entries by which the filter is moved right at each step.
步长:卷积核滑动步长
padding: ‘SAME’ or ‘VALID’
same和valid可以参考这篇文档:深度学习面试题09:一维卷积(Full卷积、Same卷积、Valid卷积、带深度的一维卷积)
废话不多说,咱们今天不讲原理,只讲其中矩阵运算过程~ 帮助大家理解~
卷积核filter 的形状:[filter_width, in_channels, out_channels]
- in_channels 必须等于被卷积的矩阵的第3维数,即列数
- out_channels 表示卷积核数目,类似于图像里,一个卷积核得到一个输出,这里有|out_channels |个卷积核,则输出必定有|out_channels| 列。
- filter_width 表示与 value 进行卷积的 个数/每次 (这里不懂可以以往后看例子)
例一:filter_width=1时:
举例,令被一维卷积的value维度是:(2,3,4)
令卷积核的filter维度是:(1,4,5)
即 [filter_width, in_channels, out_channels] = (1,4,5)
filter_width =1 说明每次对value里的一行进行卷积:
以value第一个batch里为例:
第一个batch中第1行的计算过程是:
第一个batch中第2行的计算过程是:
tf.nn.conv1d 一次对一个batch进行卷积处理,batch之间互不影响。
以此类推,完成一个batch的计算后,第二个batch的计算过程也如此。
所以value整体卷积的结果是:
以上filter_width=1时的代码如下:
sess= tf.Session()
a = tf.Variable(np.random