我需要在一批特征映射中执行二维交叉卷积(例如MATLAB' https://www.mathworks.com/help/signal/ref/xcorr2.html)。
澄清:
让X
为B x W1 x H1 x C
而Y
为B x W2 x H2 x C
。
我想要的输出形状B x W2 x H2 x 1
(假设我们将X
视为"过滤器"我们通过Y
传递SAME填充)i
1}} - 输出的1 x W2 x H2 x 1
切片是X[i,:,:,:]
和Y[i,:,:,:]
之间的互相关,例如
tf.nn.conv2d(Y[i,:,:,:], X[i,:,:,:], [1,1,1,1], padding='SAME')
是否有有效的方法来实施此操作?
注意:如果X
为1 x W1 x H1 x C
且我们希望在每个切片Y
与B
进行交叉关联,则很容易:
cross_corr = tf.nn.conv2d(
Y, tf.transpose(X, perm[1,2,3,0], [1,1,1,1], padding='SAME')
利用了Tensorflow实现conv2d
作为互相关的事实以及我们可以在转置后将较小的张量视为过滤器这一事实。这不能解决我的问题,因为我需要对B
个不同的过滤器进行交叉卷积。
也许conv3d有可能吗?
注意2:如果过滤器通道划分输入通道,matconvnet的vl_nnconv
会执行此操作。 Tensorflow是否具有等价物?
答案 0 :(得分:1)
您可以像我展示here一样使用tf.map
功能。
我曾尝试使用conv3d
,但没有办法让它发挥作用。
答案 1 :(得分:0)
[TensorFlow 2.x版本]
我不确定在问这个问题时是否使用了这种方法,但是您可以尝试tf.nn.convolution
:
https://www.tensorflow.org/api_docs/python/tf/nn/convolution
该方法似乎支持多个过滤器,并处理N-D卷积,其中N必须为1、2或3。