我有两个等级 2Tensor
,在第二个维度上大小相等,但在第一个维度上不相等。例如,形状[a, n]
的张量A
和形状[b, n]
的张量B
。它们可以被视为包含长度为n
的向量的两个数组。
我有一个函数f
它接受两个输入,每个输入都是形状为[n]
的张量,并返回一个标量。我想将此函数应用于A
和B
中的每对向量,结果是形状[a, b]
的张量C
,对于每个位置(i, j)
C
,C[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
简单地将A
和B
作为输入并返回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>