reduce_sum和reduce_mean函数

reduce_sum和reduce_mean函数

https://blog.csdn.net/Vipbinn/article/details/82978003

https://www.cnblogs.com/rossoneri/p/8029940.html

https://blog.csdn.net/chengshuhao1991/article/details/78545723

 

一句话总结

对于其中的常用参数,input_tensor就是输入的tensor,axis/reduction_indices二选一,代表reduce的维度,这个数越大,代表越深入,粒度越小地进行sum/mean等计算。axis只能传入一个数,例如是三维,只能是0,1,2三者其一,代表在这个方向上降维计算,而reduction_indices传入为[ ]可以是[0],[1],[0,1],[0,1,2]等等,可以在多个方向上降维,这就是二者的区别。

 

 

reduce_mean方法的源代码如下

def reduce_mean(input_tensor,
                axis=None,
                keep_dims=False,
                name=None,
                reduction_indices=None):
  """Computes the mean of elements across dimensions of a tensor.
​
  Reduces `input_tensor` along the dimensions given in `axis`.
  Unless `keep_dims` is true, the rank of the tensor is reduced by 1 for each
  entry in `axis`. If `keep_dims` is true, the reduced dimensions
  are retained with length 1.
​
  If `axis` has no entries, all dimensions are reduced, and a
  tensor with a single element is returned.
​
  For example:
​
  ```python
  # 'x' is [[1., 1.]
  #         [2., 2.]]
  tf.reduce_mean(x) ==> 1.5
  tf.reduce_mean(x, 0) ==> [1.5, 1.5]
  tf.reduce_mean(x, 1) ==> [1.,  2.]
  ```
​
  Args:
    input_tensor: The tensor to reduce. Should have numeric type.
    axis: The dimensions to reduce. If `None` (the default),
      reduces all dimensions.
    keep_dims: If true, retains reduced dimensions with length 1.
    name: A name for the operation (optional).
    reduction_indices: The old (deprecated) name for axis.
​
  Returns:
    The reduced tensor.
​
  @compatibility(numpy)
  Equivalent to np.mean
  @end_compatibility
  """
  return gen_math_ops._mean(
      input_tensor,
      _ReductionDims(input_tensor, axis, reduction_indices),
      keep_dims,
      name=name)

说一下其中很重要的几个点吧:

Args:(参数列表) input_tensor: The tensor to reduce. Should have numeric type. axis: The dimensions to reduce. If None (the default), reduces all dimensions. keep_dims: If true, retains reduced dimensions with length 1. name: A name for the operation (optional). reduction_indices: The old (deprecated) name for axis.

也就是说,tensorflow里边的reduce_indices参数和axis参数有一个就行了。。

 

tf的reduce_XXX这几个函数本身就被认为是一种降维,降维sum,降维mean等。。。好好理解其中的思想吧。

 

在计算损失时,通常会用到reduce_sum()函数来进行求和,但是在使用过程中常常会搞不清楚具体是怎样进行计算的,通过查阅资料,逐渐搞清楚了这个函数的用法,下面就来详细解释一下。

在TensorFlow官方文档中有这样的解释:

其实在reduce_sum()中,是从维度上去考虑的。其中的参数reduction_indices很容易搞蒙圈,上个图加深理解吧。

调用reduce_sum(arg1, arg2)时,参数arg1即为要求和的数据,arg2有两个取值分别为0和1,通常用reduction_indices=[0]或reduction_indices=[1]来给arg2传递参数。从上图可以看出,对于reduce_sum()而言

1)当arg2 = [0]时,是纵向对矩阵求和,原来矩阵有几列最后就得到几个值;

2)当arg2 = [1]时,是横向对矩阵求和,原来矩阵有几行最后就得到几个值;

3)当省略arg2参数时,默认对矩阵所有元素进行求和,最后得到一个值。

看到这里,函数名的前缀为什么是reduce_其实也就很容易理解了,reduce就是“对矩阵降维”的含义,下划线后面的部分就是降维的方式,在reduce_sum()中就是按照求和的方式对矩阵降维。那么其他reduce前缀的函数也举一反三了,比如reduce_mean()就是按照某个维度求平均值,等等。

对于reduce_mean而言

1)当arg2 = [0]时,是纵向对矩阵求平均,原来矩阵有几列最后就得到几个值;

2)当arg2 = [1]时,是横向对矩阵平均,原来矩阵有几行最后就得到几个值;

3)当省略arg2参数时,默认对矩阵所有元素进行求和(零维),最后得到一个值。

总结规律: 对于k维的, tf.reduce_xyz(x, axis=k-1)的结果是对最里面一维所有元素进行求和。 tf.reduce_xyz(x, axis=k-2)是对倒数第二层里的向量对应的元素进行求和。 tf.reduce_xyz(x, axis=k-3)把倒数第三层的每个向量对应元素相加。

 

http://wossoneri.github.io/2017/11/15/%5BTensorflow%5DThe-dimension-of-Tensor/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这段代码是计算交叉熵(Cross Entropy)损失函数的代码,其中包括了两个输入,ys和prediction,分别代表了真实标签和模型的预测结果。交叉熵是用于衡量两个概率分布之间的距离,即真实标签概率分布和模型预测结果概率分布之间的距离,交叉熵越小,表示两者越接近。其中,使用了log函数,目的是将概率值转化为log值,方便计算。最终使用tf.reduce_mean函数计算所有样本的平均交叉熵。 ### 回答2: 这行代码是用来计算交叉熵的,交叉熵是用来衡量两个概率分布的差异性的指标之一。在这行代码中,使用了TensorFlow中的函数来实现交叉熵的计算。 首先,ys是真实的标签,它的shape是(batch_size, num_classes),表示每个样本的真实标签。prediction是模型输出的预测值,它的shape也是(batch_size, num_classes),表示模型对每个样本的预测结果。 接下来,使用了TensorFlow中的log函数,将预测值取对数。由于交叉熵的公式中包含对数,这里的取对数操作是为了将预测值转换为概率值。 然后,对于每个样本,将真实标签ys与预测值的对数进行相乘。这里使用了TensorFlow中的*运算符,进行矩阵元素的逐元素相乘。 之后,使用reduce_sum函数沿着reduction_indices=[1]的维度求和。这里的维度1表示对每个样本的预测结果求和,得到每个样本的交叉熵损失。 最后,再使用reduce_mean函数对所有样本的交叉熵损失进行求平均,得到整体的交叉熵损失。这里的reduce_mean函数是对某个维度上的值进行求平均。 综上所述,这句代码的作用是计算模型输出预测值与真实标签之间的交叉熵损失,并求平均值。通过最小化交叉熵损失,可以使模型学习到更符合真实标签的预测结果。 ### 回答3: 这段代码是用于计算交叉熵(Cross Entropy)的值。 首先,我们需要了解一下交叉熵的概念。在机器学习中,交叉熵常用于衡量预测值与真实值之间的差异,特别是在分类任务中。它表示两个概率分布之间的距离或差异度量。 代码中的`ys`代表真实的标签值,`prediction`代表模型对于每个样本的预测值。`tf.log(prediction)`表示对预测值取对数,而`ys * tf.log(prediction)`表示将真实标签和预测值相乘。 接着,`tf.reduce_sum`将对每个样本的所有分类进行求和操作,即将每个类别的预测值相加。而`reduction_indices=[1]`表示对第1个维度(也就是类别维度)进行求和,得到每个样本的总和。 最后,`tf.reduce_mean`计算所有样本的平均交叉熵值。它将对每个样本的交叉熵值求和,然后除以样本数量,得到平均值。 因此,这段代码的作用是计算模型的预测结果与真实标签之间的交叉熵值,并返回平均交叉熵作为模型的损失函数。损失函数的值越小,表示模型的预测结果与真实标签越接近,模型的准确性越高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值