我有两个形状为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),但我不知道如何使用我的张量作为输入和过滤器。
答案 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在批量维度上始终使用相同的过滤器,根据我的理解,您确实想要更改它。