Ich bemerkte gerade ein unerwartetes (zumindest für mich) Verhalten in TensorFlow. Ich dachte tf.argmax
(- argmin
) arbeitet auf den Rängen eines Tensors von außen nach innen, aber anscheinend tut es nicht ?!TensorFlow: argmax (-min)
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: 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
.
jedoch das Gegenteil ist wahr:
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 jeder n-dimensionale Tensor t
wird durch t[i, j, k, ...]
indiziert. Somit hat t
den Rang n und die Form (i, j, k, ...)
. Da Dimension 0 entspricht i
, Dimension 1 bis j
, und so weiter. Warum ignoriert tf.argmax
(& - argmin
) dieses Schema?
Auch die gleichen Konventionen wie numpy's ['argmax'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html) –
Können Sie erklären, warum das Reduzieren über mehrere Zeilen den Erhalt des Argmax mit sich bringt von jeder einzelnen Spalte? Zusätzlich: Wie verhält sich das für n-dimensionale Tensoren? Ich bin ein wenig verloren beim Herausfinden, welche Dimension sich auf das Reduzieren von "i, j, k, l" oder "m" in einem 5D-Tensor bezieht. – daniel451
Wenn Sie nach den maximalen _across_ Zeilen suchen, suchen Sie _within_ columns. Für jedes '' d''-dimensionale Array bedeutet die Verwendung der '' argmax''_across_ der '' i''ten Achse, dass Sie für jede mögliche Kombination der 'd-1'' restlichen Indizes sind Suche nach dem Maximum _amongst_ '' arr [ind1, ind2, ..., ind_i_minus_1,:, ind_i_plus_1, ..., ind_d] ''. – lballes