Je viens de remarquer un comportement inattendu (du moins pour moi) dans TensorFlow. Je pensais que tf.argmax
(-argmin
) opérait sur les rangs d'un tenseur de l'extérieur vers l'intérieur, mais apparemment, ce n'est pas le cas?!
Exemple:
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
prend deux arguments: input
et dimension
. Puisque les indices du tableau arr
sont arr[rows, columns]
, je m'attendrais à ce que tf.argmax(arr, 0)
renvoie l'index de l'élément maximal par ligne, alors que je m'attendrais à ce que tf.argmax(arr, 1)
renvoie l'élément maximal par colonne. De même pour tf.argmin
.
Cependant, le contraire est vrai:
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
Quelqu'un peut-il expliquer ce comportement?
Généralisé chaque tenseur n-dimensionnel t
est indexé par t[i, j, k, ...]
. Ainsi, t
a rang n et forme (i, j, k, ...)
. Puisque la dimension 0 correspond à i
, la dimension 1 à j
, etc. Pourquoi tf.argmax
(& -argmin
) ignore-t-il ce schéma?
Pensez à l'argument dimension
de tf.argmax
comme étant l'axe sur lequel vous réduisez. tf.argmax(arr, 0)
réduit la dimension 0
, c’est-à-dire les lignes. La réduction sur plusieurs lignes signifie que vous obtiendrez l'argmax de chaque colonne.
Cela peut paraître contre-intuitif, mais cela cadre avec les conventions utilisées dans tf.reduce_max
et ainsi de suite.
Dans un tenseur à n dimensions, toute dimension donnée a n-1 dimensions qui forment un sous-espace discret à 2 dimensions. Suivant la même logique, il comporte n-2 sous-espaces à 3 dimensions, jusqu’à n - (n-1), n sous-espaces à dimensions. Vous pouvez exprimer toute agrégation sous forme de fonction dans le ou les sous-espaces restants ou dans le ou les sous-espaces en cours d'agrégation. Comme le sous-espace n'existera plus après l'agrégation, Tensorflow a choisi de l'implémenter en tant qu'opération sur cette dimension.
Franchement, c'est un choix d'implémentation par les créateurs de Tensorflow, maintenant vous le savez.