首页 文章

TensorFlow:argmax(-min)

提问于
浏览
16

我刚注意到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 . 由于数组 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维张量 tt[i, j, k, ...] 索引 . 因此, t 具有等级n和形状 (i, j, k, ...) . 由于维度0对应于 i ,因此维度1对应于 j ,依此类推 . 为什么 tf.argmax (& - argmin )忽略了这个方案?

2 回答

  • 1

    tf.argmaxdimension 参数视为您减少的轴 . tf.argmax(arr, 0) 跨维度 0 减少,即行 . 减少行数意味着您将获得每个列的argmax .

    这可能违反直觉,但它符合 tf.reduce_max 中使用的约定等等 .

  • 21

    在n维张量中,任何给定的维度都具有n-1维,形成离散的2维子空间 . 遵循相同的逻辑,它具有n-2个3维子空间,一直到n - (n-1),n维子空间 . 您可以将任何聚合表示为剩余子空间中的函数,或者正在聚合的子空间中的任何聚合 . 由于聚合后子空间将不再存在,因此Tensorflow已选择将其实现为跨该维度的操作 .

    坦率地说,这是Tensorflow创建者的一个实现选择,现在你知道了 .

相关问题