2017-02-08 71 views
1

假設我們有兩個張量(AB)具有相同的維數。我們可以將它們與tensordot相乘。例如:Theano中的tensordot和element-wise乘法之間有什麼東西嗎?

T.tensordot(A, B, axes = [[0,3], [0,3]]) 

在這種情況下,我們「配對」與第二張量的一些軸的第一張量的軸,然後我們總結在這些「配對」軸:

C[j, k, a, b ] = sum_{i, l} A[i, j, k, l] * A[i, a, b, l] 

在上面的例子中,第一張量的第一個和最後一個軸分別與第二張量的第一個和最後一個軸配對。

可替代地,我們可以乘兩個張量逐元素:

C[i, j, k, l] = A[i, j, k, l] * B[i, j, k, l] 

在這種情況下,我們「配對」的所有與第二張量的所有相應的軸的第一張量的軸(首先用第一,第二次,第二次等)。

現在,我想要做一些介於上述兩個操作之間的事情。更多細節:

  1. 我想配對第一張量的一些軸與第二張量的某個軸​​(就像在tensordot中做的那樣)。所以,我不想將A的所有軸與B的所有軸配對。
  2. 我不想總結所有成對的座標軸(就像我們在成對乘法中所做的那樣,沒有對成對的求和軸)。

這裏是我想要寫在「數學」形式:

C[a, b, c, i] = sum_d A[a, b, c, d] * B[i, b, c, d] 

什麼是做在theano的最佳方式?

回答

0

解決上述問題的方法是使用成對乘法*。成對乘法將第一個張量的所有軸與第二個張量的相應軸(第一個第一個,第二個第二個,...,最後一個)進行「配對」。因此,我們需要解決兩個問題:(1)對兩張張的軸進行混洗,使適當的軸相互配對;(2)添加「虛擬」軸,以防止不需要的配對。最後,我們總結了我們想要的東西。

的問題

C[a, b, c, i] = sum_d A[a, b, c, d] * B[i, b, c, d] 

按以下方式解決所提到的具體問題:

T.sum(A.dimshuffle(0, 1, 2, 3, 'x') * B.dimshuffle('x', 1, 2, 3, 0), axis=4) 
相關問題