TensorFlow:沿轴的张量最大值
TensorFlow: Max of a tensor along an axis
我的问题分为两个相关部分:
如何计算张量沿某个轴的最大值?例如,如果我有
x = tf.constant([[1,220,55],[4,3,-1]])
我想要
x_max = tf.max(x, axis=1)
print sess.run(x_max)
output: [220,4]
我知道有一个 tf.argmax
和一个 tf.maximum
,但都没有给出单个张量沿轴的最大值。现在我有一个解决方法:
x_max = tf.slice(x, begin=[0,0], size=[-1,1])
for a in range(1,2):
x_max = tf.maximum(x_max , tf.slice(x, begin=[0,a], size=[-1,1]))
但看起来不太理想。有更好的方法吗?
给定张量的 argmax
的索引,我如何使用这些索引索引到另一个张量?使用上面的 x
示例,我该如何执行以下操作:
ind_max = tf.argmax(x, dimension=1) #output is [1,0]
y = tf.constant([[1,2,3], [6,5,4])
y_ = y[:, ind_max] #y_ should be [2,6]
我知道像最后一行一样的切片在 TensorFlow 中还不存在 (#206)。
我的问题是:对于我的具体情况,最好的解决方法是什么(也许使用其他方法,如收集、select 等)?
其他信息:我知道 x
和 y
只会是二维张量!
tf.reduce_max()
运算符正好提供了这个功能。默认情况下,它计算给定张量的全局最大值,但您可以指定 reduction_indices
的列表,这与 NumPy 中的 axis
具有相同的含义。要完成您的示例:
x = tf.constant([[1, 220, 55], [4, 3, -1]])
x_max = tf.reduce_max(x, reduction_indices=[1])
print sess.run(x_max) # ==> "array([220, 4], dtype=int32)"
如果您使用 tf.argmax()
, you could obtain the the values from a different tensor y
by flattening y
using tf.reshape()
, converting the argmax indices into vector indices as follows, and using tf.gather()
计算 argmax 以提取适当的值:
ind_max = tf.argmax(x, dimension=1)
y = tf.constant([[1, 2, 3], [6, 5, 4]])
flat_y = tf.reshape(y, [-1]) # Reshape to a vector.
# N.B. Handles 2-D case only.
flat_ind_max = ind_max + tf.cast(tf.range(tf.shape(y)[0]) * tf.shape(y)[1], tf.int64)
y_ = tf.gather(flat_y, flat_ind_max)
print sess.run(y_) # ==> "array([2, 6], dtype=int32)"
从 TensorFlow 1.10.0-dev20180626 开始,tf.reduce_max
接受 axis
和 keepdims
关键字参数提供与 numpy.max
.
类似的功能
In [55]: x = tf.constant([[1,220,55],[4,3,-1]])
In [56]: tf.reduce_max(x, axis=1).eval()
Out[56]: array([220, 4], dtype=int32)
要获得与输入张量相同维数的结果张量,请使用 keepdims=True
In [57]: tf.reduce_max(x, axis=1, keepdims=True).eval()Out[57]:
array([[220],
[ 4]], dtype=int32)
如果未明确指定 axis
参数,则返回张量级最大元素(即所有轴都减少)。
In [58]: tf.reduce_max(x).eval()
Out[58]: 220
我的问题分为两个相关部分:
如何计算张量沿某个轴的最大值?例如,如果我有
x = tf.constant([[1,220,55],[4,3,-1]])
我想要
x_max = tf.max(x, axis=1) print sess.run(x_max) output: [220,4]
我知道有一个
tf.argmax
和一个tf.maximum
,但都没有给出单个张量沿轴的最大值。现在我有一个解决方法:x_max = tf.slice(x, begin=[0,0], size=[-1,1]) for a in range(1,2): x_max = tf.maximum(x_max , tf.slice(x, begin=[0,a], size=[-1,1]))
但看起来不太理想。有更好的方法吗?
给定张量的
argmax
的索引,我如何使用这些索引索引到另一个张量?使用上面的x
示例,我该如何执行以下操作:ind_max = tf.argmax(x, dimension=1) #output is [1,0] y = tf.constant([[1,2,3], [6,5,4]) y_ = y[:, ind_max] #y_ should be [2,6]
我知道像最后一行一样的切片在 TensorFlow 中还不存在 (#206)。
我的问题是:对于我的具体情况,最好的解决方法是什么(也许使用其他方法,如收集、select 等)?
其他信息:我知道
x
和y
只会是二维张量!
tf.reduce_max()
运算符正好提供了这个功能。默认情况下,它计算给定张量的全局最大值,但您可以指定 reduction_indices
的列表,这与 NumPy 中的 axis
具有相同的含义。要完成您的示例:
x = tf.constant([[1, 220, 55], [4, 3, -1]])
x_max = tf.reduce_max(x, reduction_indices=[1])
print sess.run(x_max) # ==> "array([220, 4], dtype=int32)"
如果您使用 tf.argmax()
, you could obtain the the values from a different tensor y
by flattening y
using tf.reshape()
, converting the argmax indices into vector indices as follows, and using tf.gather()
计算 argmax 以提取适当的值:
ind_max = tf.argmax(x, dimension=1)
y = tf.constant([[1, 2, 3], [6, 5, 4]])
flat_y = tf.reshape(y, [-1]) # Reshape to a vector.
# N.B. Handles 2-D case only.
flat_ind_max = ind_max + tf.cast(tf.range(tf.shape(y)[0]) * tf.shape(y)[1], tf.int64)
y_ = tf.gather(flat_y, flat_ind_max)
print sess.run(y_) # ==> "array([2, 6], dtype=int32)"
从 TensorFlow 1.10.0-dev20180626 开始,tf.reduce_max
接受 axis
和 keepdims
关键字参数提供与 numpy.max
.
In [55]: x = tf.constant([[1,220,55],[4,3,-1]])
In [56]: tf.reduce_max(x, axis=1).eval()
Out[56]: array([220, 4], dtype=int32)
要获得与输入张量相同维数的结果张量,请使用 keepdims=True
In [57]: tf.reduce_max(x, axis=1, keepdims=True).eval()Out[57]:
array([[220],
[ 4]], dtype=int32)
如果未明确指定 axis
参数,则返回张量级最大元素(即所有轴都减少)。
In [58]: tf.reduce_max(x).eval()
Out[58]: 220