在tensorflow中,reduce_sum()是如何工作的?

50

我正在学习tensorflow,我从tensorflow网站取得了以下代码。根据我的理解,axis = 0是行,axis = 1是列。

他们如何得到注释中提到的输出?根据我的想法,我已经在“##”旁边标出了输出。

import tensorflow as tf

x = tf.constant([[1, 1, 1], [1, 1, 1]])
tf.reduce_sum(x, 0)  # [2, 2, 2] ## [3, 3]
tf.reduce_sum(x, 1)  # [3, 3] ##[2, 2, 2]
tf.reduce_sum(x, [0, 1])  # 6 ## Didn't understand at all.
7个回答

84

x 的形状为 (2, 3)(两行三列):

1 1 1
1 1 1
通过执行tf.reduce_sum(x, 0),张量沿着第一个维度(行)被减少,结果是[1, 1, 1] + [1, 1, 1] = [2, 2, 2]
通过执行tf.reduce_sum(x, 1),张量沿着第二个维度(列)被减少,结果是[1, 1] + [1, 1] + [1, 1] = [3, 3]
通过执行tf.reduce_sum(x, [0, 1]),张量沿着两个维度(行和列)同时被减少,结果是1 + 1 + 1 + 1 + 1 + 1 = 6 或者等价地,[1, 1, 1] + [1, 1, 1] = [2, 2, 2],然后 2 + 2 + 2 = 6(先沿行减少,然后减少得到的数组)。

9
在这个例子中,tf.reduce_sum(x)tf.reduce_sum(x, [0, 1])也是等价的。换句话说,如果您不指定要缩减的维度,它将沿着所有维度进行缩减。 - Vivek Subramanian

24
为了更好地理解正在发生的事情,我将更改一些值,结果是不言自明的。
import tensorflow as tf

x = tf.constant([[1, 2, 4], [8, 16, 32]])
a = tf.reduce_sum(x, 0)  # [ 9 18 36]
b = tf.reduce_sum(x, 1)  # [ 7 56]
c = tf.reduce_sum(x, [0, 1])  # 63

with tf.Session() as sess:
  output_a = sess.run(a)
  print(output_a)
  output_b = sess.run(b)
  print(output_b)
  output_c = sess.run(c)
  print(output_c)

22

输入是一个二维张量:

1 1 1
1 1 1

在 TensorFlow 中,0 轴代表行,1 轴代表列。沿着 0 轴的求和将产生一个长度为 3 的一维张量,每个元素是每列的总和。因此结果为 [2, 2, 2]。对于行也是如此。

在这种情况下,沿两个轴的求和是张量中所有值的总和,即 6

的比较:

a = np.array([[1, 1, 1], [1, 1, 1]])
np.sum(a, axis=0)       # [2 2 2] 
np.sum(a, axis=1)       # [3 3]
np.sum(a, axis=(0, 1))  # 6

正如您所看到的,输出结果是相同的。


10

想象一下,轴表示将被消除的维度。因此对于第一个案例,轴为0,所以如果您通过这个维度(2个条目),它们都会折叠成1。因此结果如下:

result = [[1,1,1] + [1,1,1]] = [2,2,2] 

所以,您已经移除了维度0

现在,对于第二种情况,您将会折叠轴1(或列),因此:

result = [[1,1] + [1,1] + [1,1]] = [3,3]

最后一种情况是按括号中指示的顺序继续折叠。换句话说,首先消除行,然后再消除列:

result1 = [2,2,2]
result_final = 2 + 2 + 2 = 6 

希望这能有所帮助!


3
有2行3列,具体如下:
1 1 1
1 1 1

沿行减少(tf.reduce_sum(x, 0))意味着您从底部和顶部挤压,使两个独立的行变成一行。它将变为[2,2,2]。

沿列减少(tf.reduce_sum(x, 1))意味着您从右侧和左侧挤压,使3个不同的列变成1列,即[3,3]。

最后,tf.reduce_sum(x, [0, 1])表示首先您从底部和顶部挤压(它将变为[2,2,2]),然后您从右侧和左侧挤压[2,2,2],使其变为6。


1
tf.reduce_sum(x, [0, 1]) 

这个命令将首先沿着轴0(逐行)计算总和,然后沿着轴1(逐列)计算总和。

例如,

 x = tf.constant([[1, 1, 1], [1, 1, 1]])

在计算沿轴=0的总和后,您正在对[2,2,2]进行求和。 在计算沿轴=1的总和后,您正在对2 + 2 + 2进行求和。 最终输出为6。

-1

如果你了解R语言,reduce sum 相当于 R 语言中的 rowSum 和 colSum,如果在第二个参数中给出两个轴,则可以同时执行两者。


1
你的回答可以通过添加更多支持性信息得到改善。请进行[编辑]以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是否正确。您可以在帮助中心找到有关编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接