1

私は同じサイズの2つの正方行列と正方形のパッチの寸法を持っています。私はパッチの各ペアの間にドット積を計算したいと思います。基本的には、次の操作を実装したいと考えています。テンソルフローのパッチのドット積

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.map_fnを用いてAにtf.nn.conv2D機能及び各Bサブパッチを適用するために、tf.extract_image_patchesを用いた行列Bの画像パッチと重なる第一抽出することです。あなたがtf.reshapeを使用して形状[1, width, height, 1]の4Dテンソルとしてあなたの行列を再構築する必要が

tf.extract_image_patchesを使用することを注意してtf.nn.conv2D

はまた、tf.map_fnを使用する前に、あなたはまた、Bサブパッチはあなたがtf.map_fnelems引数として使用テンソルの最初の次元でインデックス化されるようにtf.transposeオペアンプを使用する必要があります。

関連する問題