TensorFlow:沿轴的最大张量

时间:2021-03-24 21:34:10

My question is in two connected parts:

我的问题有两个相互关联的部分:

  1. How do I calculate the max along a certain axis of a tensor? For example, if I have

    如何计算张量的某个轴​​上的最大值?例如,如果我有

    x = tf.constant([[1,220,55],[4,3,-1]])
    

    I want something like

    我想要类似的东西

    x_max = tf.max(x, axis=1)
    print sess.run(x_max)
    
    output: [220,4]
    

    I know there is a tf.argmax and a tf.maximum, but neither give the maximum value along an axis of a single tensor. For now I have a workaround:

    我知道有一个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]))
    

    But it looks less than optimal. Is there a better way to do this?

    但它看起来不是最佳的。有一个更好的方法吗?

  2. Given the indices of an argmax of a tensor, how do I index into another tensor using those indices? Using the example of x above, how do I do something like the following:

    给定张量的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]
    

    I know slicing, like the last line, does not exist in TensorFlow yet (#206).

    我知道切片,就像最后一行一样,在TensorFlow中还不存在(#206)。

    My question is: what is the best workaround for my specific case (maybe using other methods like gather, select, etc.)?

    我的问题是:对于我的特定情况,最好的解决方法是什么(可能使用其他方法,如收集,选择等)?

    Additional information: I know x and y are going to be two dimensional tensors only!

    附加信息:我知道x和y只是二维张量!

2 个解决方案

#1


53  

The tf.reduce_max() operator provides exactly this functionality. By default it computes the global maximum of the given tensor, but you can specify a list of reduction_indices, which has the same meaning as axis in NumPy. To complete your example:

tf.reduce_max()运算符提供了这个功能。默认情况下,它计算给定张量的全局最大值,但您可以指定reduction_indices列表,其含义与NumPy中的轴相同。要完成您的示例:

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)"

If you compute the argmax using 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() to extract the appropriate values:

如果使用tf.argmax()计算argmax,可以通过使用tf.reshape()展平y,将argmax索引转换为矢量索引,并使用tf.gather(),从不同的张量y获得值。提取适当的值:

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)"

#2


0  

As of TensorFlow 1.10.0-dev20180626, tf.reduce_max accepts axis and keepdims keyword arguments offering the similar functionality of numpy.max.

从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)

To have a resultant tensor of the same dimension as the input tensor, use keepdims=True

要使结果张量与输入张量具有相同的尺寸,请使用keepdims = True

In [57]: tf.reduce_max(x, axis=1, keepdims=True).eval()Out[57]: 
array([[220],
       [  4]], dtype=int32)

If the axis argument is not explicitly specified then the tensor level maximum element is returned (i.e. all axes are reduced).

如果未明确指定axis参数,则返回张量级最大元素(即减少所有轴)。

In [58]: tf.reduce_max(x).eval()
Out[58]: 220

#1


53  

The tf.reduce_max() operator provides exactly this functionality. By default it computes the global maximum of the given tensor, but you can specify a list of reduction_indices, which has the same meaning as axis in NumPy. To complete your example:

tf.reduce_max()运算符提供了这个功能。默认情况下,它计算给定张量的全局最大值,但您可以指定reduction_indices列表,其含义与NumPy中的轴相同。要完成您的示例:

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)"

If you compute the argmax using 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() to extract the appropriate values:

如果使用tf.argmax()计算argmax,可以通过使用tf.reshape()展平y,将argmax索引转换为矢量索引,并使用tf.gather(),从不同的张量y获得值。提取适当的值:

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)"

#2


0  

As of TensorFlow 1.10.0-dev20180626, tf.reduce_max accepts axis and keepdims keyword arguments offering the similar functionality of numpy.max.

从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)

To have a resultant tensor of the same dimension as the input tensor, use keepdims=True

要使结果张量与输入张量具有相同的尺寸,请使用keepdims = True

In [57]: tf.reduce_max(x, axis=1, keepdims=True).eval()Out[57]: 
array([[220],
       [  4]], dtype=int32)

If the axis argument is not explicitly specified then the tensor level maximum element is returned (i.e. all axes are reduced).

如果未明确指定axis参数,则返回张量级最大元素(即减少所有轴)。

In [58]: tf.reduce_max(x).eval()
Out[58]: 220