使用Tensorflow卷积滑动内部产品

时间:2016-12-20 11:39:41

标签: python tensorflow

我有两个形状为N x D1和M x D2的张量,其中D1> 0。 D2,分别称为X和Y.对于我的任务,X充当输入,Y充当过滤器。

我想计算一个形状为N x M x(D1-D2 + 1)的矩阵P,以便:

P[0,0,0] = dot(X[0,0:D2], Y[0,:]) 
P[0,0,1] = dot(X[0,1:D2+1], Y[0,:]) 
... 
P[N-1,M-1,D1-D2] = dot(X[N-1,D1-D2:D1], Y[M-1,:])

我可以创建一个for循环并手动滑动Y并计算点积。 但是我更喜欢使用关联运算符。 据我所知,tensorflow已经实现了相关运算符(https://www.tensorflow.org/versions/master/api_docs/python/nn/convolution),但我不知道如何使用我的张量作为输入和过滤器。

2 个答案:

答案 0 :(得分:0)

tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on_gpu = None,data_format = None,name = None)

在您的情况下,我将步幅设置为1,并填充为SAME。

tf.nn.conv2d(X,Y,strides = 1,padding = SAME)

答案 1 :(得分:0)

是的,您确实可以使用tf.nn.conv2d(),但您应该同时添加批量和渠道维度:

X = tf.expand_dims(tf.expand_dims(X,0),-1) 
# X.shape [batch=1, in_height, in_width, in_channels=1] 
Y = tf.expand_dims(tf.expand_dims(Y,-1),-1)
# Y.shape = [filter_height, filter_width, in_channels=1, out_channels=1]

# Convolution (actually correlation, see doc of conv2d) 
xcorr = tf.nn.conv2d(X, Y, padding="VALID", strides=[1, 1, 1, 1])
# Padding should be VALID, since you've already padded your input

CAVEAT:但是,您不能为批量信号推断这种方法,因为tf.nn.conv2d在批量维度上始终使用相同的过滤器,根据我的理解,您确实想要更改它。