web-dev-qa-db-ja.com

TensorFlow:argmax(-min)

TensorFlowの予期しない(少なくとも私にとっての)動作に気付いたところです。 _tf.argmax_(-argmin)は外側から内側へのTensorのランクで動作すると考えましたが、明らかにそうではありません!?

例:

_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_は、inputdimensionの2つの引数を取ります。配列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)がこのスキームを無視するのはなぜですか?

16
daniel451

_tf.argmax_のdimension引数を、削減する軸と考えてください。 tf.argmax(arr, 0)は、次元_0_、つまり行全体で減少します。行全体を削減すると、個々の列ごとにargmaxが取得されます。

これは直観に反するかもしれませんが、_tf.reduce_max_などで使用される規則に従っています。

21
lballes

N次元テンソルでは、任意の次元はn-1次元を持ち、離散2次元部分空間を形成します。同じロジックに従って、n-2個の3次元部分空間、n-(n-1)、n次元部分空間まであります。残りのサブスペース内の関数として、または集約されているサブスペース全体の関数として集計を表現できます。サブスペースは集約後に存在しなくなるため、Tensorflowはそのディメンション全体の操作としてサブスペースを実装することを選択しました。

率直に言って、これはTensorflowの作成者による実装の選択です。

1