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

Its*_*mmy 3 python linear-algebra tensorflow

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

我有一个函数f,需要两个输入,每个输入为shape的张量[n],并返回一个标量。我想在此函数应用到每个对矢量AB与所述结果是一个张量C形状的[a, b],使得对于每个位置(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
Run Code Online (Sandbox Code Playgroud)

如果这可以通过f简单地采用AB作为输入和返回的方式来完成C,那将是首选解决方案,从而使所有事情都以适当的张量操作发生,从而可以通过Tensorflow对其进行适当的并行化。只要最终结果是相同的。

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

mda*_*ust 5

a = tf.random_normal([10,5])
b = tf.random_normal([20,5])
Run Code Online (Sandbox Code Playgroud)

我将从像这样重新定位两个数组开始:

a = a[:,tf.newaxis,:]
b = b[tf.newaxis,:,:]
Run Code Online (Sandbox Code Playgroud)

现在形状为[a,1,n]和[1,b,n],因此我们可以进行减法运算以计算每对的增量:

delta = (a-b)
Run Code Online (Sandbox Code Playgroud)

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

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

distance = tf.reduce_sum(delta**2,axis = -1)**0.5
Run Code Online (Sandbox Code Playgroud)

这样就完成了:

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