首先看一下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可以不是一个数值,而是一个矩阵,有兴趣的可以进一步探索与发现。