改编自 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)->\sqrt{\sigma_{i=1}^{n} x_{i}^{2}} reduce_logsumexp(...) 如同名字,先取指数幂,求和后取对数 -> \log_{10} \sigma_{i=1}^{n} e^{x} 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 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.

其中,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作为动词,有着减少,缩小(尺寸、数量、价格等)的意思,在此可以引申为在维度数量上的缩小。这样理解之后,看着函数名,对于其记忆和功能的推测就轻松多了。

标签: none

添加新评论