Ich habe gerade ein unerwartetes Verhalten (zumindest für mich) in TensorFlow bemerkt. Ich dachte, tf.argmax
(-argmin
) wirkt auf die Tensor-Reihe von außen nach innen, aber anscheinend nicht ?!
Beispiel:
import numpy as np
import tensorflow as tf
sess = tf.InteractiveSession()
arr = np.array([[31, 23, 4, 24, 27, 34],
[18, 3, 25, 0, 6, 35],
[28, 14, 33, 22, 20, 8],
[13, 30, 21, 19, 7, 9],
[16, 1, 26, 32, 2, 29],
[17, 12, 5, 11, 10, 15]])
# arr has rank 2 and shape (6, 6)
tf.rank(arr).eval()
> 2
tf.shape(arr).eval()
> array([6, 6], dtype=int32)
tf.argmax
nimmt zwei Argumente an: input
und dimension
. Da die Indizes des Arrays arr
arr[rows, columns]
sind, würde ich erwarten, dass tf.argmax(arr, 0)
den Index des maximalen Elements pro Zeile zurückgibt, während ich erwartet hätte, dass tf.argmax(arr, 1)
das maximale Element pro Spalte zurückgibt. Ebenso für tf.argmin
.
Das Gegenteil trifft jedoch zu:
tf.argmax(arr, 0).eval()
> array([0, 3, 2, 4, 0, 1])
# 0 -> 31 (arr[0, 0])
# 3 -> 30 (arr[3, 1])
# 2 -> 33 (arr[2, 2])
# ...
# thus, this is clearly searching for the maximum element
# for every column, and *not* for every row
tf.argmax(arr, 1).eval()
> array([5, 5, 2, 1, 3, 0])
# 5 -> 34 (arr[0, 5])
# 5 -> 35 (arr[1, 5])
# 2 -> 33 (arr[2, 2])
# ...
# this clearly returns the maximum element per row,
# albeit 'dimension' was set to 1
Kann jemand dieses Verhalten erklären?
Verallgemeinert wird jeder n-dimensionale Tensor t
durch t[i, j, k, ...]
indiziert. Somit hat t
den Rang n und die Form (i, j, k, ...)
. Da Dimension 0 i
entspricht, Dimension 1 bis j
und so weiter. Warum ignoriert tf.argmax
(& -argmin
) dieses Schema?
Stellen Sie sich das dimension
-Argument von tf.argmax
als die Achse vor, um die Sie verkleinern. tf.argmax(arr, 0)
verringert sich über die Dimension 0
, d. H. Die Zeilen. Wenn Sie die Anzahl der Zeilen verringern, erhalten Sie den Argmax-Wert jeder einzelnen Spalte.
Dies ist möglicherweise nicht intuitiv, entspricht jedoch den in tf.reduce_max
usw. verwendeten Konventionen.
In einem n-dimensionalen Tensor hat jede gegebene Dimension n-1 Dimensionen, die einen diskreten zweidimensionalen Unterraum bilden. Der gleichen Logik folgend hat es n-2 dreidimensionale Unterräume, bis hinunter zu n - (n-1), n dimensionalen Unterräumen. Sie können jede Aggregation als Funktion innerhalb der verbleibenden Teilbereiche oder über die Teilbereiche, die zusammengefasst werden, ausdrücken. Da der Unterraum nach der Aggregation nicht mehr vorhanden ist, hat Tensorflow beschlossen, ihn als Vorgang in dieser Dimension zu implementieren.
Ehrlich gesagt, es ist eine Implementierungsentscheidung der Macher von Tensorflow, jetzt wissen Sie es.