Dans Tensorflow, comment utiliser tf.gather () pour la dernière dimension?
Je suis en train de rassembler les morceaux du tenseur dans les termes de la dernière dimension pour une partie de la connexion entre les couches. Parce que la sortie du tenseur de forme est [batch_size, h, w, depth]
je veux sélectionner des tranches en fonction de la dernière dimension, comme
# L is intermediate tensor
partL = L[:, :, :, [0,2,3,8]]
Cependant, tf.gather(L, [0, 2,3,8])
semble être la seule à travailler pour la première dimension (à droite?) Quelqu'un peut me dire comment faire?
source d'informationauteur YW P Kwon
Vous devez vous connecter pour publier un commentaire.
Il y a un suivi de bug à l'appui de ce cas d'utilisation ici: https://github.com/tensorflow/tensorflow/issues/206
Pour l'instant vous pouvez:
transposer votre matrice de sorte que la dimension de rassembler est le premier (transposition est cher)
remodeler votre tenseur en 1d (remodeler n'est pas cher) et faire de votre recueillir des indices de colonne dans une liste d'indice de l'élément linéaire à l'indexation, puis remodeler retour
gather_nd
. Aura encore besoin pour transformer votre colonne des indices dans la liste d'indice de l'élément.De TensorFlow 1.3
tf.gather
a unaxis
paramètre, donc les différentes solutions de contournement ici ne sont plus nécessaires.https://www.tensorflow.org/versions/r1.3/api_docs/python/tf/gather
https://github.com/tensorflow/tensorflow/issues/11223
Avec gather_nd vous pouvez désormais le faire comme suit:
Également, comme indiqué par l'utilisateur Nova dans un fil de discussion référencés par @Yaroslav Bulatov:
L'essentiel est d'aplatir le tenseur et l'utilisation strided 1D adressage avec tf.rassembler(...).
Encore une autre solution à l'aide de tf.dépiler(...), tf.rassembler(...) et de la tf.pile(..)
Code:
Résultat:
Une version correcte de @Andrei réponse lire
Vous pouvez essayer de cette façon, par exemple(dans la plupart des cas en PNL au moins),
Le paramètre est de la forme
[batch_size, depth]
et les indices sont [i, j, k, n, m] dont la longueur est batch_size. Puisgather_nd
peut être utile.Cet extrait d'abord trouver le poing dimension par le biais de la batch_num, puis extraire l'élément le long de cette dimension par le numéro de la cible.
La mise en œuvre 2. @Yaroslav Bulatov:
De crédit à Comment sélectionner les lignes à partir d'un 3-D Tenseur dans TensorFlow?
Tenseur n'a pas d'attribut de la forme, mais get_shape() la méthode. Ci-dessous est praticable par Python 2.7