【Tensorflow】tf.reduce_sum()方法深度解析

首先看一下reduce_sum及其参数的注释 :

def tf.reduce_sum(input_tensor, axis=None, keepdims=False, name=None)

 Computes the sum of elements across dimensions of a tensor.

Reduces input_tensor along the dimensions given in axis. Unless keepdims is true, the rank of the tensor is reduced by 1 for each entry in axis. If keepdims is true, the reduced dimensions are retained with length 1.

If axis is None, all dimensions are reduced, and a tensor with a
single element is returned.

1 参数只有一个矩阵 input_tensor,其余参数为默认

下面我们用三个张量为例(下统一称为矩阵),对一维向量,二维矩阵,三维矩阵分别执行其余参数为默认的reduce_sum()运算。

x_dim_1 = tf.constant([1,2,3])
z = tf.reduce_sum(x_dim_1)
print("1D sum :")
print(z)

x_dim_2 = tf.constant([[1,2,3],[4,5,6]])
z = tf.reduce_sum(x_dim_2)
print("2D sum :")
print(z)

x_dim_3 = tf.constant([[[1,2],[2,3],[3,4]],
            [[4,5],[5,6],[6,7]]])

z = tf.reduce_sum(x_dim_3)
print("3D sum :")
print(z)

输出结果如下:

在这里插入图片描述

不难看出,无论是对几维矩阵而言,tf.reduce_sum()方法均对矩阵的所有元素进行求和,并将结果降维至一维,返回一个数值(0维矩阵)。 在这种情况下,tf.reduce_sum()方法与我们熟悉的numpy.sum()方法可以说在矩阵运算方面别无二致,同时也符合注释中所说 :
 

If axis is None, all dimensions are reduced, and a tensor with a
single element is returned.

 2 保持keepdims参数为false,改变axis参数的值进行运算

这个部分就是reduce_sum的灵魂所在,其关键是要理解所谓axis参数对于高维矩阵的意义。
不妨先看看,如果我们打印出上述代码中的三个矩阵常量的shape,会得到什么:

 在这里插入图片描述

需要理解的是,对于高维矩阵来说,其每一个元素都是一个低维矩阵。 例如,对于一维矩阵(数组) x_dim_1 而言,每一个元素都是一个0维的数组(数值) : 1,2,3。 对于高维矩阵,以三维矩阵x_dim_3 为例,其每一个元素都是一个二维的矩阵,这些二维矩阵中的每一个元素都是一个一维数组,这些一维数组中的每个元素都是一个0维矩阵(数值)。

听起来好像像绕口令,那么我们就以x_dim_3为例,具体解释axis与矩阵的shape之间的关系。
x_dim_3 = [ [ [1,2],[2,3],[3,4] ],
[ [4,5],[5,6],[6,7] ] ]

首先我们不难看出,这是一个三维矩阵。那么该矩阵包含了几个二维矩阵的元素呢,我们不难看出包含了两个,分别是 [ [1,2],[2,3],[3,4] ] 以及 [ [4,5],[5,6],[6,7] ] 两个二维矩阵。那么对于每一个作为元素的二维矩阵,又包含了多少个一维数组呢,显然,每一个二维矩阵都包含了三个一维数组。以第一个二维数组元素为例,包含了[1,2],[2,3],[3,4]三个一维数组元素。而每一个一维数组元素,又分别包含了两个0维数组(数值)。

这就是张量 x_dim_3 的shape的构成(2,3,2),其代表的数学意义为,这个三维矩阵包含了两个二维矩阵元素,每一个二维矩阵又包含了三个一维矩阵元素,每一个一维矩阵又包含了两个数值。同时,三个数值分别对应了axis=0 axis=1 axis=2 三个轴分别包含的元素个数。

问题实际变成了,沿着axis=0 : 对包含的两个二维矩阵元素进行求和, 沿着axis=1 : 对该维度包含的三个一维矩阵进行求和,沿着axis = 2 : 对该维度包含的两个数值进行求和。 下面放出对x_dim_3的测试及输出结果。
 

# 沿着axis = 0 对三维矩阵进行降维求和 实际就是对两个二维矩阵元素进行加法运算
x_dim_3 = tf.constant([[[1,2],[2,3],[3,4]],
            [[4,5],[5,6],[6,7]]])
z = tf.reduce_sum(x_dim_3,axis=0)
print(z)

输出结果如下:

在这里插入图片描述

在这里插入图片描述

 

# 沿着axis=1 对三维矩阵进行降维求和 
x_dim_3 = tf.constant([[[1,2],[2,3],[3,4]],
            [[4,5],[5,6],[6,7]]])
z = tf.reduce_sum(x_dim_3,axis=1)
print(z)

在这里插入图片描述

# 沿着axis=2对三维矩阵进行降维求和 
x_dim_3 = tf.constant([[[1,2],[2,3],[3,4]],
            [[4,5],[5,6],[6,7]]])
z = tf.reduce_sum(x_dim_3,axis=2)
print(z)

在这里插入图片描述

 3 总结

reduce_sum方法人如其名,减少维度的同时对矩阵内部沿着某一轴进行求和。与之类似的方法还有reduce_max, reduce_min, reduce_mean,他们关于axis参数的使用与本篇文章中分析的是别无二致的。当然,axis可以不是一个数值,而是一个矩阵,有兴趣的可以进一步探索与发现。
 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值