5 votes

Comment la fonction dimshuffle fonctionne dans Theano

J'ai du mal à comprendre ce que et comment dimshuffle() est mis en œuvre dans Theano ? J'ai trouvé les exemples suivants dans la documentation officielle, mais je n'ai pas compris leur signification.

Quelqu'un peut-il expliquer la signification de chaque exemple dans ce qui suit ?

(‘x’) -> make a 0d (scalar) into a 1d vector
(0, 1) -> identity for 2d vectors
(1, 0) -> inverts the first and second dimensions
(‘x’, 0) -> make a row out of a 1d vector (N to 1xN)
(0, ‘x’) -> make a column out of a 1d vector (N to Nx1)
(2, 0, 1) -> AxBxC to CxAxB
(0, ‘x’, 1) -> AxB to Ax1xB
(1, ‘x’, 0) -> AxB to Bx1xA
(1,) -> This remove dimensions 0. It must be a broadcastable dimension (1xA to A)

Veuillez noter que je suis au courant concept de diffusion dans numpy python.

9voto

Kh40tiK Points 107

Sans 'x' , dimshuffle est identique à transpose

Pour des raisons explicatives, faisons semblant que numpy possède un fichier dimshuffle fonction

x = np.arange(60).reshape((3,4,5))
x.dimshuffle(0, 1, 2).shape # gives (3, 4, 5)
x.dimshuffle(2, 1, 0).shape # gives (5, 4, 3)

Puisque nous l'avons :

shp = (3,4,5)
(shp[2], shp[1], shp[0]) == (5, 4, 3)

Les arguments 2, 1, 0 à dimshuffle signifie simplement que le permutation au tuple de forme.

Chaque fois qu'il y a 'x' présent, il ajoute une dimension de taille dans le tableau :

x = np.arange(60).reshape((3,4,5))
x.dimshuffle(2, 1, 0, 'x').shape # (5, 4, 3, 1)
x.dimshuffle(2, 1, 'x', 0).shape # (5, 4, 1, 3)
x.dimshuffle(2, 'x', 1, 0).shape # (5, 1, 4, 3)

Chaque fois qu'il manque un indice (ou plusieurs) à la permutation, ces indices sont retirés du tuple de forme, à condition qu'ils soient égaux à 1 (ce qui est diffusable).

x = np.arange(1337).reshape(2,1337,1)
y = x.dimshuffle(1,0) # this works since shape[2] is 1
y.shape # (1337, 2)
z = y.dimshuffle(1) # ERROR

Notez que theano n'a aucun moyen de déterminer la forme du tenseur symbolique, donc dimshuffle avec retrait dimensionnel doivent se référer à broadcastable attribut. (Ceci est différent de tensorflow car vous pouvez spécifier la forme au moment de la compilation).

>>> x = T.vector()
>>> x.broadcastable
(False,)
>>> y = x.dimshuffle('x', 0, 'x')
>>> y.broadcastable # the new dims are broadcastable because we added via 'x'
(True, False, True)

Avec dimshuffle vous pouvez enregistrer plusieurs appels à transpose y expand_dims (notez que Theano n'a pas de expand_dims )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X