【问题标题】:Dot product of patches in tensorflow张量流中补丁的点积
【发布时间】:2017-01-30 15:58:58
【问题描述】:

我有两个相同大小的方阵和一个正方形补丁的尺寸。我想计算每对补丁之间的点积。本质上我想实现以下操作:

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?

【问题讨论】:

    标签: python machine-learning computer-vision tensorflow linear-algebra


    【解决方案1】:

    这样做的自然方法是首先使用tf.extract_image_patches 提取矩阵B 的重叠图像块,然后使用tf.map_fn 对A 和每个B 子块应用tf.nn.conv2D 函数。

    请注意,在使用 tf.extract_image_patchestf.nn.conv2D 之前,您需要使用 tf.reshape 将矩阵重塑为形状为 [1, width, height, 1] 的 4D 张量。

    此外,在使用 tf.map_fn 之前,您还需要使用 tf.transpose 操作,以便 B 子补丁由您用作 elems 参数的张量的第一个维度索引 @987654329 @。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 2018-05-14
      相关资源
      最近更新 更多