wake-up-neo.net

Was ist in TensorFlow das Argument 'axis' in der Funktion 'tf.one_hot'?

Könnte jemand mit einer Erklärung helfen, was axis in der Funktion one_hot Von TensorFlow ist?

Nach der Dokumentation :

axis: Die zu füllende Achse (Standard: -1, eine neue innerste Achse)

Am nächsten kam ich zu einer Antwort auf SO war eine Erklärung relevant für Pandas :

Ich bin mir nicht sicher, ob der Kontext zutreffend ist.

12
user919426

Hier ist ein Beispiel:

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

... ist der Eingangstensor und N=4 (jeder Index wird in einen 4D Vektor transformiert).

axis=-1

Die Berechnung von one_hot_1 = tf.one_hot(x, 4).eval() ergibt einen (3, 4) - Tensor:

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

... wo die letzte Dimension One-Hot-codiert ist (deutlich sichtbar). Dies entspricht dem Standardwert axis=-1, D. H. Dem letzten.

axis=0

Wenn Sie nun one_hot_2 = tf.one_hot(x, 4, axis=0).eval() berechnen, erhalten Sie einen (4, 3) - Tensor, der nicht sofort als One-Hot-Codierung erkennbar ist:

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

Dies liegt daran, dass die One-Hot-Codierung entlang der 0-Achse erfolgt und die Matrix transponiert werden muss, um die vorherige Codierung anzuzeigen. Die Situation wird komplizierter, wenn die Eingabe höherdimensional ist, die Idee jedoch dieselbe ist: Der Unterschied besteht in der Platzierung der Dimension extra, die für die One-Hot-Codierung verwendet wird.

10
Maxim

Für mich bedeutet Achse "wo fügst du die zusätzlichen Zahlen hinzu, um die Abmessung zu vergrößern". Zumindest interpretiere ich das so und diene als Mnemon.

Zum Beispiel haben Sie [1,2,3,0,2,1] und dies ist von Form (6,1). Das heißt, es ist ein eindimensionales Array. one_hot fügt Nullen hinzu und transformiert die Position an jeder Position des ursprünglichen Arrays zu einer 1. Dazu muss das ursprüngliche Array eine Dimension größer sein als das ursprüngliche Array, und die Achse teilt der Funktion mit, wo sie hinzugefügt werden soll. Diese neue Dimension wird die Beispiele identifizieren .


achse = 1

Sie fügen eine zweite Dimension hinzu und die erste Dimension wird beibehalten. Dies würde zu einem (6,4) -Array führen. Für das resultierende Array verwenden Sie also die erste Dimension (0), um zu ermitteln, welches Beispiel angezeigt wird, und die zweite Dimension (1, die neue), um zu ermitteln, ob diese Klasse aktiv ist. newArr [0] [1] = 1 bedeutet Beispiel 0, Klasse 1, was in diesem Fall bedeutet, dass Beispiel 0 von Klasse 1 ist.

   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

achse = 0

Sie fügen eine erste Dimension hinzu und die vorhandene Dimension wird verschoben. Dies würde zu einem (4,6) -Array führen. Für das resultierende Array verwenden Sie also die erste Dimension (0, die neue Dimension), um festzustellen, ob diese Klasse aktiv ist, und die zweite Dimension (1), um festzustellen, welches Beispiel angezeigt wird. newArr [0] [1] = 0 bedeutet Klasse 0, Beispiel 1, was in diesem Fall bedeutet, dass Beispiel 1 nicht zu Klasse 0 gehört.

   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