我有两个相同大小的方形矩阵和一个方形补丁的尺寸。我想计算每对补丁之间的点积。基本上我想实现以下操作:
def patch_dot(A, B, patch_dim):
res_dim = A.shape[0] - patch_dim + 1
res = np.zeros([res_dim, res_dim, res_dim, res_dim])
for i in xrange(res_dim):
for j in xrange(res_dim):
for k in xrange(res_dim):
for l in xrange(res_dim):
res[i, j, k, l] = (A[i:i + patch_dim, j:j + patch_dim] *
B[k:k + patch_dim, l:l + patch_dim]).sum()
return res
显然,这将是一个非常低效的实施。 Tensorflow的tf.nn.conv2d似乎是一个很自然的解决方案,因为我基本上是在进行卷积,但是我的滤波器矩阵并没有固定。在Tensorflow中是否有一个自然的解决方案,或者我应该开始考虑实现我自己的tf-op?
答案 0 :(得分:1)
执行此操作的自然方法是首先使用tf.extract_image_patches提取矩阵B的重叠图像块,然后使用tf.nn.conv2D在A和每个B子补丁上应用tf.map_fn函数
请注意,在使用tf.extract_image_patches和tf.nn.conv2D之前,您需要使用tf.reshape将形状[1, width, height, 1]
的4D张量重塑为矩阵。
此外,在使用tf.map_fn之前,您还需要使用tf.transpose op,以便B子补丁由您用作{{1}的张量的第一维索引。 } tf.map_fn的参数。