2016-06-29 5 views
16

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 arrarr[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?

Antwort

21

Denken Sie an das dimension Argument von als die Achse, über die Sie reduzieren. tf.argmax(arr, 0) reduziert über Dimension 0, d.h. die Zeilen. Reduzieren über Zeilen bedeutet, dass Sie die Argmax jeder einzelnen Spalte erhalten.

Dies könnte widersprüchlich sein, aber es fällt in Übereinstimmung mit den Konventionen in tf.reduce_max und so weiter.

+1

Auch die gleichen Konventionen wie numpy's ['argmax'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html) –

+1

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

+0

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

1

In einem n-dimensionalen Tensor hat jede gegebene Dimension n-1 Dimensionen, die einen diskreten zweidimensionalen Unterraum bilden. Nach der gleichen Logik hat er n-2 3-dimensionale Unterräume bis hin zu n - (n-1), n-dimensionalen Unterräumen. Sie können jede Aggregation als Funktion innerhalb der verbleibenden Unterräume oder über die Unterräume, die aggregiert werden, ausdrücken. Da der Unterraum nach der Aggregation nicht mehr existiert, hat Tensorflow entschieden, ihn als eine Operation über diese Dimension zu implementieren.

Offen gesagt, es ist eine Implementierung Wahl von den Machern von Tensorflow, jetzt wissen Sie.