我需要在一批特征映射中执行2D交叉卷积(例如,像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
视为"filter"我们通过带有SAME填充的 Y
),其中 i
-th 1 x W2 x H2 x 1
切片的输出是 X[i,:,:,:]
和 Y[i,:,:,:]
之间的互相关 . 就像是
tf.nn.conv2d(Y[i,:,:,:], X[i,:,:,:], [1,1,1,1], padding='SAME')
Is there an efficient way to implement this operation?
注意:如果 X
是 1 x W1 x H1 x C
并且我们想在每个切片 B
处将它与 Y
交叉关联,这很容易:
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有同等效力吗?
1 回答
您可以使用
tf.map
函数,就像我显示here一样 .我当时试过使用
conv3d
,但没有办法让它工作 .