Ho appena notato un comportamento imprevisto (almeno per me) in TensorFlow. Pensavo che lo tf.argmax
(- argmin
) operi sui ranghi di un Tensore da esterno a interno, ma a quanto pare non è così ?!TensorFlow: argmax (-min)
Esempio:
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
prende due argomenti input
e dimension
. Poiché gli indici dell'array arr
sono arr[rows, columns]
, mi aspetto che tf.argmax(arr, 0)
restituisca l'indice dell'elemento massimo per riga, mentre mi sarei aspettato che tf.argmax(arr, 1)
restituisse l'elemento massimo per colonna. Allo stesso modo per tf.argmin
.
Tuttavia, è vero il contrario:
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
qualcuno può spiegare questo comportamento?
Generalizzato ogni Tensore n-dimensionale t
indicizzato da t[i, j, k, ...]
. Pertanto, t
ha il rango n e forma (i, j, k, ...)
. Poiché la dimensione 0 corrisponde a i
, dimensione 1 a j
e così via. Perché lo tf.argmax
(& - argmin
) ignora questo schema?
Anche le stesse convenzioni di numpy's ['argmax'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html) –
Puoi spiegare perché la riduzione tra le righe implica il recupero dell'argmax di ogni singola colonna? Inoltre: come si comporta questo per i Tensori n-dimensionali? Sono un po 'perso a capire quale dimensione si riferisce alla riduzione di 'i, j, k, l' o' m' in un 5D-Tensore. – daniel451
Per definizione, se cerchi le righe _across_ massime, stai cercando _within_ columns. Per ogni array dimensionale '' d'', prendendo il '' argmax'' _across_ l'asse '' i'' significa che, per qualsiasi combinazione possibile degli indici rimanenti '' d-1'', sei cercando il massimo _amongst_ '' arr [ind1, ind2, ..., ind_i_minus_1,:, ind_i_plus_1, ..., ind_d] ''. – lballes