【问题标题】:How does reduce_sum() work in tensorflow?reduce_sum() 在张量流中是如何工作的?
【发布时间】:2018-04-19 20:10:37
【问题描述】:

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

他们如何获得 cmets 中提到的输出?我已经根据我对##的想法提到了输出。

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.

【问题讨论】:

    标签: python tensorflow multidimensional-array reduce tensor


    【解决方案1】:

    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(沿行减少,然后减少结果数组)。

    【讨论】:

    • 在这个例子中,tf.reduce_sum(x) 也等价于tf.reduce_sum(x, [0, 1])。换句话说,如果您不指定要缩减的维度,它将在所有维度上缩减。
    【解决方案2】:

    输入是一个二维张量:

    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
    

    如你所见,输出是一样的。

    【讨论】:

      【解决方案3】:

      为了更好地理解发生了什么,我将更改值,结果是不言自明的

      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)
      

      【讨论】:

        【解决方案4】:

        这样想,轴表示将要消除的维度。所以对于第一个案例轴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 
        

        希望这会有所帮助!

        【讨论】:

          【解决方案5】:

          x 有 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。

          【讨论】:

            【解决方案6】:
            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 作为输出。

            【讨论】:

              【解决方案7】:

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

              【讨论】:

              • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
              猜你喜欢
              • 2018-06-30
              • 2017-10-31
              • 2017-09-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-04-09
              • 1970-01-01
              相关资源
              最近更新 更多