Numpy 计算TensorFlow中张量中所有向量之间成对欧氏距离的有效方法

Numpy 计算TensorFlow中张量中所有向量之间成对欧氏距离的有效方法,numpy,tensorflow,vectorization,tensorflow2.0,array-broadcasting,Numpy,Tensorflow,Vectorization,Tensorflow2.0,Array Broadcasting,设feature\u-map为带形状的张量:b,h,w,c=feature\u-map.shape 要计算通道(c)轴中所有向量之间的成对欧氏距离,我使用以下代码: 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(so

feature\u-map
为带形状的张量:
b,h,w,c=feature\u-map.shape

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

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
复制张量,然后应用
norm
函数,但由于生成的张量非常大,导致内存错误


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

我从

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)

我使用了欧几里德距离矩阵技巧

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)