2015-12-04 2 views
0

dans l'exemple ci-dessous, il y a une matrice 3d numérique de taille (4, 3, 3) + une solution sur la façon de calculer pinv de chacune de 4 de ces 3 * 3 matrices en numpy. J'ai aussi essayé d'utiliser la même fonction en numpy, en espérant que c'est la même chose, mais ça a échoué. Une idée de comment le faire en theano?diffusion linalg.pinv sur un tenseur theano 3D

dt = np.dtype(np.float32) 

a=[[[12,3,1], 
    [2,4,1], 
    [2,4,2],], 
    [[12,3,3], 
    [2,4,4], 
    [2,4,5],], 
    [[12,3,6], 
    [2,4,5], 
    [2,4,4],], 
    [[12,3,3], 
    [2,4,5], 
    [2,4,6]]] 

a=np.asarray(a,dtype=dt) 
print(a.shape) 

apinv=np.zeros((4,3,3)) 
print(np.linalg.pinv(a[0,:,:]).shape) 

#numpy solution 
apinv = map(lambda n: np.linalg.pinv(n), a) 
apinv = np.asarray(apinv,dtype=dt) 

#theano solution (not working) 
at=T.tensor3('a') 
apinvt = map(lambda n: T.nlinalg.pinv(n), at) 

L'erreur est:

Original exception was: 
Traceback (most recent call last): 
    File "pydevd.py", line 2403, in <module> 
    globals = debugger.run(setup['file'], None, None, is_module) 
    File "pydevd.py", line 1794, in run 
    launch(file, globals, locals) # execute the script 
    File "exp_thn_pinv_map.py", line 35, in <module> 
    apinvt = map(lambda n: T.nlinalg.pinv(n), at) 
    File "theano/tensor/var.py", line 549, in __iter__ 
    raise TypeError(('TensorType does not support iteration. ' 
TypeError: TensorType does not support iteration. Maybe you are using builtin.sum instead of theano.tensor.sum? (Maybe .max?) 

Répondre

1

Le message d'erreur est

Traceback (most recent call last): 
    File "D:/Dropbox/source/intro_theano/pinv.py", line 32, in <module> 
    apinvt = map(lambda n: T.nlinalg.pinv(n), at) 
    File "d:\dropbox\source\theano\theano\tensor\var.py", line 549, in __iter__ 
    raise TypeError(('TensorType does not support iteration. ' 
TypeError: TensorType does not support iteration. Maybe you are using builtin.sum instead of theano.tensor.sum? (Maybe .max?) 

Cela se produit parce que, comme le message d'erreur indique, la variable symbolique at n'est pas itérable.

Le problème fondamental ici est que vous mélangez incorrectement le code Python exécuté immédiatement avec le code symbolique Theano d'exécution retardée.

Vous devez utiliser une boucle symbolique, pas une boucle Python. La bonne solution consiste à utiliser l'opérateur scan de Theano:

at=T.tensor3('a') 
apinvt, _ = theano.scan(lambda n: T.nlinalg.pinv(n), at, strict=True) 
f = theano.function([at], apinvt) 
print np.allclose(f(a), apinv) 
+0

super, merci pour l'aide et la suggestion à propos de la question. J'ai besoin d'avoir la tête autour de la fonction scan. – PickleRick