TensorFlow: argmax (-min)

Я только что заметил неожиданное (по крайней мере для меня) поведение в TensorFlow. Я думал, что tf.argmax (- argmin) работает в рядах тензора от внешнего к внутреннему, но, видимо, это не так!!

Пример:

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 принимает два аргумента: input и dimension. Поскольку индексы массива arr равны arr[rows, columns], я бы ожидал, что tf.argmax(arr, 0) вернет индекс максимального элемента для каждой строки, в то время как я ожидал, что tf.argmax(arr, 1) вернет максимальный элемент на столбец. Аналогично для tf.argmin.

Однако верно и обратное:

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

Может ли кто-нибудь объяснить это поведение?

Обобщенный каждый n-мерный тензор t индексируется на t[i, j, k, ...]. Таким образом, t имеет ранг n и форму (i, j, k, ...). Поскольку размерность 0 соответствует i, размерность 1 до j и т.д. Почему tf.argmax (& - argmin) игнорирует эту схему?

Ответы

Ответ 1

Подумайте о аргументе dimension tf.argmax в качестве оси, по которой вы уменьшаете. tf.argmax(arr, 0) уменьшает размерность 0, т.е. строки. Сокращение по строкам означает, что вы получите argmax каждого отдельного столбца.

Это может быть нелогичным, но оно согласуется с соглашениями, используемыми в tf.reduce_max и т.д.

Ответ 2

В n-мерном тензоре любая заданная размерность имеет n-1 размерности, которые образуют дискретное 2-мерное подпространство. Следуя той же логике, она имеет n-2 3-мерные подпространства, вплоть до n - (n-1), n ​​мерных подпространств. Вы можете выразить любую агрегацию как функцию в оставшемся подпространстве (-ах) или в подсерии (-ах), которые агрегируются. Поскольку после агрегации подпространство больше не существует, Tensorflow решил реализовать его как операцию в этом измерении.

Откровенно говоря, это выбор реализации создателями Tensorflow, теперь вы знаете.