Tensorflow–一维离散卷积
一维离散卷积的运算是一种主要基于向量的计算方式
一.一维离散卷积的计算原理
一维离散卷积通常有三种卷积类型:full卷积,same卷积和valid卷积
1.full卷积
full卷积的计算过程如下:K沿着I顺序移动,每移动一个固定位置,对应位置的值相乘,然后对其求和
其中K称为卷积核或者滤波器或者卷积掩码
2.valid卷积
从full卷积的计算过程可知,如果K靠近I,就会有部分延伸到I之外,valid卷积只考虑能完全覆盖K内的情况,即K在I内部移动的情况
3.same卷积
首先在卷积核K上指定一个锚点,然后将锚点顺序移动到输入张量I的每一个位置处,对应位置相乘然后求和,卷积核锚点的位置一般有以下规则,假设卷积核的长度为FL:
如果FL为奇数,则锚点的位置在(FL-1)/2处
如果FL为偶数,则锚点的位置在(FL-2)/2处
4.full,same,valid卷积的关系
假设一个长度为L的一维张量与一个长度为FL的卷积核卷积,其中Fa代表计算same卷积时,锚点的位置索引,则两者的full卷积与same卷积的关系如下:
Csame=Cfull[FL-Fa-1,FL-Fa+L-2]
full卷积C与valid卷积C的关系如下:
C=C[FL-1,L-1]
same卷积C与valid卷积C的关系如下:
C=C[FL-Fa-2,L-Fa_2]
注意:大部分书籍中对卷积运算的定义分为两步。第1步是将卷积核翻转180;第2步是将翻转的结果沿输入张量顺序移动,每移动到一个固定位置,对应位置相乘然后求和,如Numpy中实现的卷积函数convolve和Scipy中实现的卷积函数convolve,函数内部都进行了以上两步运算。可见,最本质的卷积运算还是在第2步。Tensorflow中实现的卷积函数
tf.nn.conv1d(value,filters,stride,padding,use_cudnn_on_gpu=None,data_format=None,name=None)
其内部就没有进行第1步操作,而是直接进行了第2步操作
import tensorflow as tf
# 输入张量I
I=tf.constant(
[
[[3],[4],[1],[5],[6]]
]
,tf.float32
)
# 卷积核
K=tf.constant(
[
[[-1]],
[[-2]],
[[2]],
[[1]]
]
,tf.float32
)
I_conv1d_K=tf.nn.conv1d(I,K,1,'SAME')
session=tf.Session()
print(session.run(I_conv1d_K))
[[[ 3.]
[ -4.]
[ 10.]
[ 1.]