2017-06-22 103 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

相關問題