【问题标题】:'Reduction' parameter in tf.keras.lossestf.keras.losses 中的“减少”参数
【发布时间】:2020-08-30 10:13:25
【问题描述】:

根据docsReduction 参数有 3 个值 - SUM_OVER_BATCH_SIZESUMNONE

y_true = [[0., 2.], [0., 0.]]
y_pred = [[3., 1.], [2., 5.]]

mae = tf.keras.losses.MeanAbsoluteError(reduction=tf.keras.losses.Reduction.SUM)
mae(y_true, y_pred).numpy()
> 5.5

mae = tf.keras.losses.MeanAbsoluteError()
mae(y_true, y_pred).numpy()
> 2.75

经过各种试验,我可以推断出计算结果是这样的:-

  • REDUCTION = SUM

    Loss = Sum over all samples {(Sum of differences between y_pred and y_target vector of each sample / No of element in y_target of the sample )} = { (abs(3-0) + abs(1-2))/2 } + { (abs(2-0) + abs(5-0))/2 } = {4/2} + {7/2} = 5.5.

  • REDUCTION = SUM_OVER_BATCH_SIZE

    Loss = [Sum over all samples {(Sum of differences between y_pred and y_target vector of each sample / No of element in y_target of the sample )}] / Batch_size or No of Samples = [ { (abs(3-0)} + abs(1-2))/2 } + { (abs(2-0) + abs(5-0))/2 } ]/2 = [ {4/2} + {7/2} ]/2 = [5.5]/2 = 2.75.

因此,SUM_OVER_BATCH_SIZE 只不过是SUM/batch_size。那么,为什么叫SUM_OVER_BATCH_SIZE,而SUM实际上是把整个batch的loss加起来,而SUM_OVER_BATCH_SIZE计算的是batch的平均loss。

我对@9​​87654337@ 和SUM 工作原理的假设是否正确?

【问题讨论】:

  • 你的问题到底是什么?
  • 很抱歉没有更清楚。我的问题是,如果我假设“SUM_OVER_BATCH_SIZE”计算的是批次的平均值而不是总和是否正确?因为,查看文档以及 PyTorch L1 损失 (pytorch.org/docs/stable/generated/…),似乎 SUM_OVER_BATCH_SIZE 对应于 Torch 中的 mean,而 SUM 对应于 sum

标签: python tensorflow keras tensorflow2.0


【解决方案1】:

据我所知,您的假设是正确的。

如果您查看 github [keras/losses_utils.py][1] 第 260-269 行 您会看到它确实按预期执行。 SUM 将汇总批次维度中的损失,SUM_OVER_BATCH_SIZESUM 除以总损失数(批次大小)。

def reduce_weighted_loss(weighted_losses,
                     reduction=ReductionV2.SUM_OVER_BATCH_SIZE):
  if reduction == ReductionV2.NONE:
     loss = weighted_losses
  else:
     loss = tf.reduce_sum(weighted_losses)
     if reduction == ReductionV2.SUM_OVER_BATCH_SIZE:
        loss = _safe_mean(loss, _num_elements(weighted_losses))
  return loss

您可以通过添加一对 0 损失的输出来简单地检查您之前的示例。

y_true = [[0., 2.], [0., 0.],[1.,1.]]
y_pred = [[3., 1.], [2., 5.],[1.,1.]]

mae = tf.keras.losses.MeanAbsoluteError(reduction=tf.keras.losses.Reduction.SUM)
mae(y_true, y_pred).numpy()
> 5.5

mae = tf.keras.losses.MeanAbsoluteError()
mae(y_true, y_pred).numpy()
> 1.8333

所以,你的假设是正确的。 [1]:https://github.com/keras-team/keras/blob/v2.7.0/keras/utils/losses_utils.py#L25-L84

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 2018-04-16
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2021-08-18
    • 2012-01-30
    相关资源
    最近更新 更多