1

我想在 Tensorflow 中形成一个损失函数,它依赖于一个矩阵,该矩阵包含一组嵌入的(平方)欧几里德距离的所有组合。在 numpy 中,像这样:

# E is (batch_size,N,32)
N=100
D = np.zeros((batch_size,N,N))
for x in range(N):
  for y in range(N):
    D[:,x,y] = np.sum(np.square(E[:,x,:]-E[:,y,:]),axis=1)

如何在不使用嵌套 for 循环或根本不使用 for 循环的情况下在 Tensorflow/Keras 中对此进行编码?

4

1 回答 1

1

这应该这样做:

D = tf.reduce_sum((E[:, None, :] - E[:, :, None])**2, axis=-1)

D 将(batch_size, N, N)。这也适用于 numpy (显然是 use np.sum),因此您可以使用它来检查循环版本的等价性以确保。

此解决方案通过广播工作:None用于插入轴,使大小 N 轴与大小 1 轴匹配,后者被广播(重复)以匹配前者。这导致将所有元素与所有其他元素(每个批次元素)进行比较。由于我们在这里处理的是四维张量,因此在文本中描述起来有点困难,也难以形象化......

于 2021-06-24T20:19:05.433 回答