2016-04-08 1 views
0

J'ai deux tenseurs et une matrice de poids dans Theano. Le tensiomètre A a une dimension (k, 5, 40). Le tenseur B a une dimension (k, 5, 40). La matrice de poids W a une dimension (40, 40). Je voudrais calculer A W B. Quelle est la séquence correcte des opérations de tenseurs Theano pour y parvenir? Notez que k peut varier pendant l'exécution mais que les autres dimensions sont fixes. La sémantique nous voulons de A W B est le suivant:Comment multiplier les tenseurs dans Theano

de A comme Pensez une collection de matrices k() 5,40. Appelez-les A_1, ..., A_k Pensez à B comme une collection de k (5,40) matrices. Appelez-les B_1, ..., B_k. Nous voulons trouver A_ {i} * W * B_ {i}^{T} pour tout i de 1 à k. J'ai essayé d'utiliser theano.tensor.dot mais cela semble assez déroutant.

Notez qu'une méthode non efficace consiste à utiliser la fonction de numérisation. Mais cela rendrait un code parallèle intrinsèquement séquentiel.

Répondre

1

Je suis désolé, mais je ne sais pas ce que vous vouliez dire "confus"?

J'ai essayé d'utiliser un petit boîtier, j'espère qu'il peut représenter votre cas. Dot-produit en utilisant theano.tensor.dot entre trois tenseur dimensions et matrice à deux dimensions:

import numpy as np 
import theano 
import theano.tensor as T 

a = T.tensor3('a', dtype='int64') 
c = T.matrix('c',dtype='int64') 
d = T.dot(a,c) 

g = theano.function([a,c],d) 

x = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int) 
y = np.array([[1,2],[1,3]], dtype=int) 
print g(x,y) 

la sortie:

[[[ 3 8] 
    [ 4 11]] 

[[ 4 10] 
    [ 2 5]]] 

Il fonctionne comme votre logique, la matrice c ne font que point produit dans la deuxième et la troisième dimension .

MISE À JOUR

que le premier code ci-dessus, vous pouvez utiliser pour la première opération dans votre cas (A * W). Désolé, je ne calcule pas soigneusement, bien sûr, après cette opération, la sortie devient tenseur en trois dimensions. Donc, pour effectuer (AW) * B, vous devez utiliser une approche différente. Pour effectuer une multiplication entre deux trois dimensions tenseurs I habituellement à l'aide d'analyse:

import numpy as np 
import theano 
import theano.tensor as T 

a = T.tensor3('a', dtype='int64') 
c = T.tensor3('c',dtype='int64') 
d, b = theano.scan(lambda i: T.dot(a[i,:], c[i,:]),sequences=T.arange(2)) 
g = theano.function([a,c],d) 

x = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int) 
y = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int) 
print g(x,y) 

mais Je sais qu'il ya une autre approche à l'aide theano.tensor.batched_dot (theano.tensor.dot je pense que pour le tableau 2D et 1D). Dans votre cas, il est simple à coder comme ceci:

e = T.batched_dot(a,c) 
g = theano.function([a,c],e) 

le code ci-dessus donnent les mêmes résultats. J'espère que cela aide.

+0

Salut Malioboro! J'étais capable de faire ça aussi! Le problème vient avec la deuxième multiplication. La question demande une multiplication à trois voies, pas deux. Nous devons multiplier A et W et ensuite (A * W) et (B) pour obtenir (A * W * B). C'est cette étape A * W * B que je n'obtiens pas. Comment allons-nous de A * W, que vous avez généré dans votre réponse à (A * W) * B. Merci! – Sahil

+2

oh désolé @Sahil, j'ai mal calculé la dimension, j'ai mis à jour ma réponse – malioboro

+0

Salut Malioboro, Dans votre exemple ci-dessus, je veux multiplier le tenseur 3D avec un produit de point de matrice. Comme 'c = T.matrix ('c'), y = np.array ([[1,2], [3,4]])'. Il est très bien avec la boucle en utilisant la fonction de balayage. Mais utiliser T.batched_dot (a, c) donne une valeur correcte avec une erreur comme 'ValueError: get_scalar_constant_value détecté déterministe IndexError:'. Pourriez-vous aider ? – Shyamkkhadka