为Tensorflow中两个张量中的每对元素应用函数



我有两个等级 2Tensor,在第二个维度上大小相等,但在第一个维度上不相等。例如,形状[a, n]的张量A和形状[b, n]的张量B。它们可以被视为包含长度为n的向量的两个数组。

我有一个函数f它接受两个输入,每个输入都是形状为[n]的张量,并返回一个标量。我想将此函数应用于AB中的每对向量,结果是形状[a, b]的张量C,对于每个位置(i, j)CC[i, j] = f(A[i], B[j])

如果这些只是常规的 Numpy 数组,我可以使用以下代码完成此操作:

# Assume a, b, and n are integers, and A and B are Numpy arrays
C = numpy.zeros((a, b))
for i in range(0, a):
for j in range(0, b):
C[i, j] = f(A[i], B[j])
return C

如果这可以以这样一种方式实现,即f简单地将AB作为输入并返回C,那将是首选的解决方案,以便一切都作为适当的张量运算发生,以便它都可以由 Tensorflow 正确并行化。只要最终结果是一样的。

我找到了这个问题的解决方案,专门用于f计算每对向量之间的欧氏距离。我想将其扩展到其他函数,例如余弦距离或曼哈顿 (L1) 距离。

a = tf.random_normal([10,5])
b = tf.random_normal([20,5])

我将首先像这样重新定向两个数组:

a = a[:,tf.newaxis,:]
b = b[tf.newaxis,:,:]

现在形状是 [a,1,n] 和 [1,b,n],因此我们可以宽广地减去计算每对的增量:

delta = (a-b)

它的形状为 [a,b,n]。

现在欧几里得距离是直截了当的。 (axis=-1最后一个轴的总和):

distance = tf.reduce_sum(delta**2,axis = -1)**0.5

您已完成:

print(distance)
<tf.Tensor 'pow_3:0' shape=(10, 20) dtype=float32>

最新更新