it-swarm.com.de

TensorFlow: argmax (-min)

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 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.

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?

16
daniel451

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.

21
lballes

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.

1