web-dev-qa-db-fra.com

Dans TensorFlow, quel est l'argument 'axe' dans la fonction 'tf.one_hot'

Quelqu'un pourrait-il m'aider avec une explication de ce que axis est dans TensorFlow's one_hot une fonction?

Selon la documentation :

axe: l'axe à remplir (par défaut: -1, un nouvel axe le plus à l'intérieur)

Au plus près, je suis arrivé à une réponse le SO était une explication pertinent pour Pandas :

Je ne sais pas si le contexte est tout aussi applicable.

12
user919426

Voici un exemple:

x = tf.constant([0, 1, 2])

... est le tenseur d'entrée et N=4 (chaque index est transformé en vecteur 4D).

axis=-1

Le calcul de one_hot_1 = tf.one_hot(x, 4).eval() donne un tenseur (3, 4):

[[ 1.  0.  0.  0.]
 [ 0.  1.  0.  0.]
 [ 0.  0.  1.  0.]]

... où la dernière dimension est codée à chaud (clairement visible). Cela correspond à la valeur par défaut axis=-1, C'est-à-dire dernier un.

axis=0

Maintenant, le calcul de one_hot_2 = tf.one_hot(x, 4, axis=0).eval() produit un tenseur (4, 3), Qui n'est pas immédiatement reconnaissable comme codé à chaud:

[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]
 [ 0.  0.  0.]]

En effet, le codage à chaud est effectué le long de l'axe 0 et il faut transposer la matrice pour voir le codage précédent. La situation devient plus compliquée, lorsque l'entrée est de dimension supérieure, mais l'idée est la même: la différence réside dans le placement de la dimension extra utilisée pour le codage à chaud.

10
Maxim

Pour moi, l'axe se traduit par "où ajoutez-vous les numéros supplémentaires pour augmenter la dimension". C'est du moins ainsi que je l'interprète et sert de mnémonique.

Par exemple, vous avez [1,2,3,0,2,1] et c'est de forme (6,1). Ce qui signifie que c'est un tableau à une dimension. one_hot ajoute des zéros et transforme la position en 1 dans chaque position de votre tableau d'origine, pour que cela se produise, le tableau d'origine doit avoir 1 dimension de plus que le tableau d'origine et l'axe indique à la fonction où l'ajouter, ce nouveau dimension identifiera les exemples.


axe = 1

Vous ajoutez une deuxième dimension et la première dimension est conservée. Il en résulterait un tableau (6,4). Donc, pour le tableau résultant, vous utilisez la première dimension (0) pour savoir quel exemple vous voyez et la deuxième dimension (1, la nouvelle) pour savoir si cette classe est active. newArr [0] [1] = 1 signifie exemple 0, classe 1, ce qui signifie dans ce cas que l'exemple 0 est de classe 1.

   0   1   2   3  <- class

[[ 0.  1.  0.  0.]   <- example 0
 [ 0.  0.  1.  0.]   <- example 1
 [ 0.  0.  0.  1.]   <- example 2
 [ 1.  0.  0.  0.]   <- example 3
 [ 0.  0.  1.  0.]   <- example 4
 [ 0.  1.  0.  0.]]  <- example 5

axe = 0

Vous ajoutez une première dimension et la dimension existante est décalée. Il en résulterait un tableau (4,6). Ainsi, pour le tableau résultant, vous utilisez la première dimension (0, la nouvelle dimension) pour savoir si cette classe est active et la deuxième dimension (1) pour savoir quel exemple vous voyez. newArr [0] [1] = 0 signifie la classe 0, exemple 1, qui dans ce cas signifie que l'exemple 1 n'est pas de classe 0.

   0   1   2   3   4   5  <- example

[[ 0.  0.  0.  1.  0.  0.]   <- class 0
 [ 1.  0.  0.  0.  0.  1.]   <- class 1
 [ 0.  1.  0.  0.  1.  0.]   <- class 2
 [ 0.  0.  1.  0.  0.  0.]]  <- class 3
10
loco.loop