在TensorFlow中计算张量中所有向量之间成对欧几里得距离的有效方法

时间:2019-11-17 23:18:57

标签: numpy tensorflow vectorization tensorflow2.0 numpy-broadcasting

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: { self.changeImages() }) 为形状为feature_map的张量

要计算通道(c)轴上所有向量之间的成对欧几里得距离,我使用以下代码:

b,h,w,c = feature_map.shape

此过程非常慢。为了避免feature_map = tf.reshape(feature_map,(b,-1,c)) norms = [] for i in range(h*w): norm = tf.norm(feature_map-feature_map[:,i:i+1,:],ord=2,axis=-1) norms.append(sorted_tensor) norms = tf.stack(norms,axis=1) ,我尝试使用for-loop来复制张量,然后应用tf.tile函数,但是由于生成的张量非常大,导致了内存错误。

有没有更有效的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

我使用了here

的欧氏距离矩阵技巧

numpy的适应如下:

feature_map = tf.reshape(feature_map,(b,-1,c))         
G = np.einsum('bik, bjk->bij', feature_map, feature_map)
D = G.diagonal(axis1=1,axis2=2).reshape(b,-1,1)+ np.transpose(G.diagonal(axis1=1,axis2=2).reshape(b,-1,1),axes=(0,2,1)) - 2*G
norms = np.sqrt(D)

和相应的tensorflow改编:

feature_map = tf.reshape(feature_map,(b,-1,c))     
G = tf.einsum('bik, bjk->bij', feature_map, feature_map)
D = tf.reshape(tf.linalg.diag_part(G),(b,-1,1))+ tf.transpose(tf.reshape(tf.linalg.diag_part(G),(b,-1,1)),perm=(0,2,1)) - 2*G
norms = tf.sqrt(D)