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, теперь вы знаете.