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
)