我刚刚注意到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)会忽略此方案?
发布于 2016-06-29 16:53:48
可以将tf.argmax的dimension参数视为缩减的轴线。跨维度0减少tf.argmax(arr, 0),即行。减少跨行意味着您将获得每个单独列的argmax。
这可能有悖于直觉,但它符合tf.reduce_max等中使用的约定。
发布于 2017-03-18 01:25:09
在n维张量中,任何给定的维度都有n-1个维度,形成一个离散的二维子空间。按照同样的逻辑,它有n-2个三维子空间,一直到n- (n-1),n维子空间。您可以将任何聚合表示为剩余子空间内的函数,或正在聚合的子空间之间的函数。由于聚合后该子空间将不再存在,因此Tensorflow选择将其实现为跨该维度的操作。
坦率地说,这是Tensorflow的创建者的一个实现选择,现在您知道了。
https://stackoverflow.com/questions/38094217
复制相似问题