2017-06-22 100 views
2

我沿着第二维有两个相同大小的等级-2 Tensor s,但沿着第一维不等。例如形状[a, n]的张量A和形状[b, n]的张量B。它们可以被看作是包含长度为n的矢量的两个阵列。在Tensorflow中的两个张量中的每对元素上应用函数

我有一个函数f它需要两个输入,每个形状张量[n],并返回一个标量。我想将这个函数应用于AB中的每对载体,其结果是形状为[a, b]的张量C,使得对于C,C[i, j] = f(A[i], B[j])中的每个位置(i, 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完全并行化。只要最终的结果是一样的。

我发现solution to this problem专门为f计算每对载体之间的欧氏距离。我想扩展到其他功能,如余弦距离或曼哈顿(L1)距离。

+0

它实际上可能是在可扩展性和性能方面更好地使'上尺寸的张量F'工作'[a,n]'和'[b,n]'直接。 –

+0

我想我应该澄清,我不一定需要'f'作为一个单独的函数。我只想应用可实现指定结果的_some_操作。正如你所说,它直接在整个张量上运行将是首选解决方案。我现在要澄清一下。 – ItsTimaiFool

+1

我发现了这个类似的问题,我现在正在研究它,看看我是否可以将它扩展到除欧几里德距离以外的函数:https://stackoverflow.com/questions/37009647/compute-pairwise-distance-in-a-批量 - 无复制 - 张量张量?rq = 1 – ItsTimaiFool

回答

2
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 summs过去轴):

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

大功告成:

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

谢谢,这很有帮助!这与曼哈顿的距离很小,修改很少,我想我可以为我的其他需求做类似广播的使用。 – ItsTimaiFool

相关问题