2017-02-08 1 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 제와 :

다르게, 우리는 소자 현명한 개의 텐서 곱 수 , 두 번째와 두 번째 등등).

이제 위에서 설명한 두 작업 사이에있는 작업을 수행하려고합니다. 자세한 내용은에서 :

  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) 필요하지 않은 곳에서 페어링을 방지하기 위해 "더미"축을 추가한다. 마지막으로, 우리는 원하는 exes에 대한 합계를합니다.

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)