2016-06-29 36 views
16

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?

risposta

21

Si consideri l'argomento dimension di tf.argmax come l'asse attraverso il quale si riduce. tf.argmax(arr, 0) si riduce attraverso la dimensione 0, ad esempio le righe. Ridurre le righe significa che otterrai l'argmax di ogni singola colonna.

Questo potrebbe essere controintuitivo, ma è in linea con le convenzioni utilizzate in tf.reduce_max e così via.

+1

Anche le stesse convenzioni di numpy's ['argmax'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html) –

+1

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

+0

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

1

In un tensore n-dimensionale, ogni dimensione data ha dimensioni n-1 che formano un sottospazio bidimensionale discreto. Seguendo la stessa logica, ha n-2 sottospazi dimensionale, fino a n - (n-1), n ​​sottospazi dimensionale. È possibile esprimere qualsiasi aggregazione come una funzione all'interno del sottospazio rimanente o attraverso il sottospazio (i) che vengono aggregati. Poiché il sottospazio non sarà più disponibile dopo l'aggregazione, Tensorflow ha scelto di implementarlo come operazione su quella dimensione.

Francamente, è una scelta di implementazione dei creatori di Tensorflow, ora lo sai.