1

我有两个相同大小的方阵和一个方形补丁的尺寸。我想计算每对补丁之间的点积。本质上我想执行以下操作:张量流中斑点的点积

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?

回答

1

的自然的方式来做到这一点是利用tf.extract_image_patches矩阵B的第一提取物重叠图像块,然后应用A上的tf.nn.conv2D功能和使用tf.map_fn每个B子补丁。

注意,如形状[1, width, height, 1]的四维张量使用tf.reshape使用tf.extract_image_patchestf.nn.conv2D你需要重塑你的矩阵前。

此外,使用tf.map_fn之前,你还需要使用tf.transpose运算以便B子补丁是由你作为tf.map_fnelems参数使用张量的第一个维度索引。