TensorFlow中的reduce函数
改编自 https://blog.csdn.net/Vipbinn/article/details/82978003 ->来源追踪:https://blog.csdn.net/chengshuhao1991/article/details/78545723
在通过TensorFlow中文社区TensorFly
对TensorFlow框架进行了解的时候,对于入门的第一个例子进行了逐行的学习,对于数据的生成、表示,以及各个函数的作用有了一定的认识。其中reduce_mean()
函数的定义和作用让我觉得很有意思,但又无法确认对其的理解,在网络上浏览了一些博客,发现有不少与我的理解是相同的,因此记录下来。
使用任意具有代码补全功能的IDE,在完成导入工作(即import tensorflow as tf
)后,输入tf.reduce_
,会得到大量reduce开头的函数补全提示,其中就包含reduce_mean()
。
文档中列出的所有操作为:
reduce_all(...)
逻辑与
reduce_any(...)
逻辑或
reduce_euclidean_norm(...)
欧几里得范数(Euclidean norm of elements)->reduce_logsumexp(...)
如同名字,先取指数幂,求和后取对数 -> reduce_max(...)
最大值
reduce_mean(...)
平均值
reduce_min(...)
最小值
reduce_prod(...)
乘积
reduce_std(...)
标准差
reduce_sum(...)
求和
reduce_variance(...)
方差
其中关于reduce_mean()
,官方给出的解释如下:
tf.math.reduce_mean( input_tensor, axis=None, keepdims=None, name=None, reduction_indices=None, keep_dims=None )
Reduces
input_tensor
along the dimensions given inaxis
. Unlesskeepdims
is true, the rank of the tensor is reduced by 1 for each entry inaxis
. Ifkeepdims
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.
其中,axis
参数指定了计算过程中需要“降维”的维度,若是不传值的话,默认对全部维度采取降维操作,返回的是一个单独的值(维度为0),否则将按照指定的维度执行降维操作。而keepdims
参数则用于申明要求在操作过程中不降低维度,由于各类reduce操作均属于聚合操作,因而该参数的实际含义为在计算完成后,为其保留一对方括号(即一个维度)。
咕果的开发团队把之前版本的参数名keep_dims
改为了keepdims
,所以如果使用的是比较老的版本的话,可能需要考虑改一下函数名= =(还算良心地没有直接去除对老参数名的支持)
在文档给出的例子中,使用输入张量
x = tf.constant(
[[1., 1.],
[2., 2.]]
)
对于两个常用参数(axis
, keepdims
)的测试,结果分别如下:
不传值的情况下:
>>> op = tf.reduce_mean(x)
>>> sess.run(op)
1.5
指定axis
的情况下:
>>> op = tf.reduce_mean(x, axis = 0)
>>> sess.run(op)
array([1.5, 1.5], dtype=float32)
>>> op = tf.reduce_mean(x, axis = [1])
>>> sess.run(op)
array([1., 2.], dtype=float32)
>>> op = tf.reduce_mean(x, axis = [0, 1])
>>> sess.run(op)
1.5
指定keepdims=True
,即保留维度的情况下:
>>> op = tf.reduce_mean(x, keepdims = True)
>>> sess.run(op)
array([[1.5]], dtype=float32)
>>> op = tf.reduce_mean(x, axis = [1], keepdims = True)
>>> sess.run(op)
array([[1.],
[2.]], dtype=float32)
由此,两个常用参数与函数本身的作用就能够比较清晰地展示出来了。
那么,回到标题:既然都是聚合函数,为什么要在函数名前加一个reduce_
前缀呢?
根据上文的描述,答案应该是比较清晰了:在进行了这些聚合操作之后,TensorFlow会默认将结果作为数据返回,也就是说,不论你的axis
参数填了没,填了什么,在输入张量的至少某一个维度,一定会进行聚合操作,而聚合操作之后,数据合而为一,降低了输入张量的维度。而在英语中,reduce作为动词,有着减少,缩小(尺寸、数量、价格等)的意思,在此可以引申为在维度数量上的缩小。这样理解之后,看着函数名,对于其记忆和功能的推测就轻松多了。