Keras 2 API文档 / 损失函数 / 概率损失函数

概率损失函数

[源代码]

BinaryCrossentropy

tf_keras.losses.BinaryCrossentropy(
    from_logits=False,
    label_smoothing=0.0,
    axis=-1,
    reduction="auto",
    name="binary_crossentropy",
)

计算真实标签与预测标签之间的交叉熵损失。

将此交叉熵损失用于二元(0 或 1)分类应用。损失函数需要以下输入:

  • y_true (真实标签): 这是 0 或 1。
  • y_pred (预测值): 这是模型的预测,即一个浮点值,表示 logit(即,当 from_logits=True 时,值为 [-inf, inf])或概率(即,当 from_logits=False 时,值为 [0., 1.])。

推荐用法: (设置 from_logits=True)

使用 tf.keras API

model.compile(
    loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
    ....
)

作为独立函数

>>> # Example 1: (batch_size = 1, number of samples = 4)
>>> y_true = [0, 1, 0, 0]
>>> y_pred = [-18.6, 0.51, 2.94, -12.8]
>>> bce = tf.keras.losses.BinaryCrossentropy(from_logits=True)
>>> bce(y_true, y_pred).numpy()
0.865
>>> # Example 2: (batch_size = 2, number of samples = 4)
>>> y_true = [[0, 1], [0, 0]]
>>> y_pred = [[-18.6, 0.51], [2.94, -12.8]]
>>> # Using default 'auto'/'sum_over_batch_size' reduction type.
>>> bce = tf.keras.losses.BinaryCrossentropy(from_logits=True)
>>> bce(y_true, y_pred).numpy()
0.865
>>> # Using 'sample_weight' attribute
>>> bce(y_true, y_pred, sample_weight=[0.8, 0.2]).numpy()
0.243
>>> # Using 'sum' reduction` type.
>>> bce = tf.keras.losses.BinaryCrossentropy(from_logits=True,
...     reduction=tf.keras.losses.Reduction.SUM)
>>> bce(y_true, y_pred).numpy()
1.730
>>> # Using 'none' reduction type.
>>> bce = tf.keras.losses.BinaryCrossentropy(from_logits=True,
...     reduction=tf.keras.losses.Reduction.NONE)
>>> bce(y_true, y_pred).numpy()
array([0.235, 1.496], dtype=float32)

默认用法: (设置 from_logits=False)

>>> # Make the following updates to the above "Recommended Usage" section
>>> # 1. Set `from_logits=False`
>>> tf.keras.losses.BinaryCrossentropy() # OR ...('from_logits=False')
>>> # 2. Update `y_pred` to use probabilities instead of logits
>>> y_pred = [0.6, 0.3, 0.2, 0.8] # OR [[0.6, 0.3], [0.2, 0.8]]

[源代码]

CategoricalCrossentropy

tf_keras.losses.CategoricalCrossentropy(
    from_logits=False,
    label_smoothing=0.0,
    axis=-1,
    reduction="auto",
    name="categorical_crossentropy",
)

计算标签与预测值之间的交叉熵损失。

当存在两个或多个标签类别时,使用此交叉熵损失函数。我们期望标签以 one_hot 表示形式提供。如果您想以整数形式提供标签,请使用 SparseCategoricalCrossentropy 损失。每个特征应该有 # classes 个浮点值。

在下面的代码片段中,每个示例有 # classes 个浮点值。y_predy_true 的形状都是 [batch_size, num_classes]

独立用法

>>> y_true = [[0, 1, 0], [0, 0, 1]]
>>> y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]
>>> # Using 'auto'/'sum_over_batch_size' reduction type.
>>> cce = tf.keras.losses.CategoricalCrossentropy()
>>> cce(y_true, y_pred).numpy()
1.177
>>> # Calling with 'sample_weight'.
>>> cce(y_true, y_pred, sample_weight=tf.constant([0.3, 0.7])).numpy()
0.814
>>> # Using 'sum' reduction type.
>>> cce = tf.keras.losses.CategoricalCrossentropy(
...     reduction=tf.keras.losses.Reduction.SUM)
>>> cce(y_true, y_pred).numpy()
2.354
>>> # Using 'none' reduction type.
>>> cce = tf.keras.losses.CategoricalCrossentropy(
...     reduction=tf.keras.losses.Reduction.NONE)
>>> cce(y_true, y_pred).numpy()
array([0.0513, 2.303], dtype=float32)

compile() API 一起使用

model.compile(optimizer='sgd',
              loss=tf.keras.losses.CategoricalCrossentropy())

[源代码]

SparseCategoricalCrossentropy

tf_keras.losses.SparseCategoricalCrossentropy(
    from_logits=False,
    ignore_class=None,
    reduction="auto",
    name="sparse_categorical_crossentropy",
)

计算标签与预测值之间的交叉熵损失。

当存在两个或多个标签类别时,使用此交叉熵损失函数。我们期望标签以整数形式提供。如果您想使用 one-hot 表示形式提供标签,请使用 CategoricalCrossentropy 损失。对于 y_pred,每个特征应该有 # classes 个浮点值,对于 y_true,每个特征应该有一个浮点值。

在下面的代码片段中,每个示例的 y_true 有一个浮点值,而 y_pred# classes 个浮点值。y_true 的形状是 [batch_size]y_pred 的形状是 [batch_size, num_classes]

独立用法

>>> y_true = [1, 2]
>>> y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]
>>> # Using 'auto'/'sum_over_batch_size' reduction type.
>>> scce = tf.keras.losses.SparseCategoricalCrossentropy()
>>> scce(y_true, y_pred).numpy()
1.177
>>> # Calling with 'sample_weight'.
>>> scce(y_true, y_pred, sample_weight=tf.constant([0.3, 0.7])).numpy()
0.814
>>> # Using 'sum' reduction type.
>>> scce = tf.keras.losses.SparseCategoricalCrossentropy(
...     reduction=tf.keras.losses.Reduction.SUM)
>>> scce(y_true, y_pred).numpy()
2.354
>>> # Using 'none' reduction type.
>>> scce = tf.keras.losses.SparseCategoricalCrossentropy(
...     reduction=tf.keras.losses.Reduction.NONE)
>>> scce(y_true, y_pred).numpy()
array([0.0513, 2.303], dtype=float32)

compile() API 一起使用

model.compile(optimizer='sgd',
              loss=tf.keras.losses.SparseCategoricalCrossentropy())

[源代码]

Poisson

tf_keras.losses.Poisson(reduction="auto", name="poisson")

计算 y_truey_pred 之间的 Poisson 损失。

loss = y_pred - y_true * log(y_pred)

独立用法

>>> y_true = [[0., 1.], [0., 0.]]
>>> y_pred = [[1., 1.], [0., 0.]]
>>> # Using 'auto'/'sum_over_batch_size' reduction type.
>>> p = tf.keras.losses.Poisson()
>>> p(y_true, y_pred).numpy()
0.5
>>> # Calling with 'sample_weight'.
>>> p(y_true, y_pred, sample_weight=[0.8, 0.2]).numpy()
0.4
>>> # Using 'sum' reduction type.
>>> p = tf.keras.losses.Poisson(
...     reduction=tf.keras.losses.Reduction.SUM)
>>> p(y_true, y_pred).numpy()
0.999
>>> # Using 'none' reduction type.
>>> p = tf.keras.losses.Poisson(
...     reduction=tf.keras.losses.Reduction.NONE)
>>> p(y_true, y_pred).numpy()
array([0.999, 0.], dtype=float32)

compile() API 一起使用

model.compile(optimizer='sgd', loss=tf.keras.losses.Poisson())

[源代码]

binary_crossentropy 函数

tf_keras.losses.binary_crossentropy(
    y_true, y_pred, from_logits=False, label_smoothing=0.0, axis=-1
)

计算二元交叉熵损失。

独立用法

>>> y_true = [[0, 1], [0, 0]]
>>> y_pred = [[0.6, 0.4], [0.4, 0.6]]
>>> loss = tf.keras.losses.binary_crossentropy(y_true, y_pred)
>>> assert loss.shape == (2,)
>>> loss.numpy()
array([0.916 , 0.714], dtype=float32)

参数

  • y_true:真实值。形状 = [batch_size, d0, .. dN]
  • y_pred:预测值。形状 = [batch_size, d0, .. dN]
  • from_logits: y_pred 是否预期为 logits 张量。默认情况下,我们假设 y_pred 编码了一个概率分布。
  • label_smoothing: 介于 [0, 1] 之间的浮点数。如果大于 0,则通过将其向 0.5 压缩来平滑标签。也就是说,使用 1. - 0.5 * label_smoothing 作为目标类,使用 0.5 * label_smoothing 作为非目标类。
  • axis: 计算均值所在的轴。默认为 -1。

返回

二元交叉熵损失值。形状 = [batch_size, d0, .. dN-1]


[源代码]

categorical_crossentropy 函数

tf_keras.losses.categorical_crossentropy(
    y_true, y_pred, from_logits=False, label_smoothing=0.0, axis=-1
)

计算分类交叉熵损失。

独立用法

>>> y_true = [[0, 1, 0], [0, 0, 1]]
>>> y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]
>>> loss = tf.keras.losses.categorical_crossentropy(y_true, y_pred)
>>> assert loss.shape == (2,)
>>> loss.numpy()
array([0.0513, 2.303], dtype=float32)

参数

  • y_true: one-hot 编码的真实目标张量。
  • y_pred:预测目标的张量。
  • from_logits: y_pred 是否预期为 logits 张量。默认情况下,我们假设 y_pred 编码了一个概率分布。
  • label_smoothing: 介于 [0, 1] 之间的浮点数。如果大于 0,则平滑标签。例如,如果为 0.1,则非目标标签使用 0.1 / num_classes,目标标签使用 0.9 + 0.1 / num_classes
  • axis: 默认为 -1。计算熵的维度。

返回

分类交叉熵损失值。


[源代码]

sparse_categorical_crossentropy 函数

tf_keras.losses.sparse_categorical_crossentropy(
    y_true, y_pred, from_logits=False, axis=-1, ignore_class=None
)

计算稀疏分类交叉熵损失。

独立用法

>>> y_true = [1, 2]
>>> y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]
>>> loss = tf.keras.losses.sparse_categorical_crossentropy(y_true, y_pred)
>>> assert loss.shape == (2,)
>>> loss.numpy()
array([0.0513, 2.303], dtype=float32)
>>> y_true = [[[ 0,  2],
...            [-1, -1]],
...           [[ 0,  2],
...            [-1, -1]]]
>>> y_pred = [[[[1.0, 0.0, 0.0], [0.0, 0.0, 1.0]],
...             [[0.2, 0.5, 0.3], [0.0, 1.0, 0.0]]],
...           [[[1.0, 0.0, 0.0], [0.0, 0.5, 0.5]],
...            [[0.2, 0.5, 0.3], [0.0, 1.0, 0.0]]]]
>>> loss = tf.keras.losses.sparse_categorical_crossentropy(
...   y_true, y_pred, ignore_class=-1)
>>> loss.numpy()
array([[[2.3841855e-07, 2.3841855e-07],
        [0.0000000e+00, 0.0000000e+00]],
       [[2.3841855e-07, 6.9314730e-01],
        [0.0000000e+00, 0.0000000e+00]]], dtype=float32)

参数

  • y_true: 真实值。
  • y_pred:预测值。
  • from_logits: y_pred 是否预期为 logits 张量。默认情况下,我们假设 y_pred 编码了一个概率分布。
  • axis: 默认为 -1。计算熵的维度。
  • ignore_class: 可选整数。在损失计算中要忽略的类的 ID。这在分割问题中很有用,例如,分割图中的“空”类(通常是 -1 或 255)。默认情况下 (ignore_class=None),将考虑所有类。

返回

稀疏分类交叉熵损失值。


[源代码]

poisson 函数

tf_keras.losses.poisson(y_true, y_pred)

计算 y_true 和 y_pred 之间的 Poisson 损失。

Poisson 损失是 Tensor y_pred - y_true * log(y_pred) 的元素均值。

独立用法

>>> y_true = np.random.randint(0, 2, size=(2, 3))
>>> y_pred = np.random.random(size=(2, 3))
>>> loss = tf.keras.losses.poisson(y_true, y_pred)
>>> assert loss.shape == (2,)
>>> y_pred = y_pred + 1e-7
>>> assert np.allclose(
...     loss.numpy(), np.mean(y_pred - y_true * np.log(y_pred), axis=-1),
...     atol=1e-5)

参数

  • y_true:真实值。形状 = [batch_size, d0, .. dN]
  • y_pred:预测值。形状 = [batch_size, d0, .. dN]

返回

Poisson 损失值。形状 = [batch_size, d0, .. dN-1]

引发

  • InvalidArgumentError: 如果 y_truey_pred 的形状不兼容。

[源代码]

KLDivergence

tf_keras.losses.KLDivergence(reduction="auto", name="kl_divergence")

计算 y_truey_pred 之间的 Kullback-Leibler 散度损失。

loss = y_true * log(y_true / y_pred)

参见:https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence

独立用法

>>> y_true = [[0, 1], [0, 0]]
>>> y_pred = [[0.6, 0.4], [0.4, 0.6]]
>>> # Using 'auto'/'sum_over_batch_size' reduction type.
>>> kl = tf.keras.losses.KLDivergence()
>>> kl(y_true, y_pred).numpy()
0.458
>>> # Calling with 'sample_weight'.
>>> kl(y_true, y_pred, sample_weight=[0.8, 0.2]).numpy()
0.366
>>> # Using 'sum' reduction type.
>>> kl = tf.keras.losses.KLDivergence(
...     reduction=tf.keras.losses.Reduction.SUM)
>>> kl(y_true, y_pred).numpy()
0.916
>>> # Using 'none' reduction type.
>>> kl = tf.keras.losses.KLDivergence(
...     reduction=tf.keras.losses.Reduction.NONE)
>>> kl(y_true, y_pred).numpy()
array([0.916, -3.08e-06], dtype=float32)

compile() API 一起使用

model.compile(optimizer='sgd', loss=tf.keras.losses.KLDivergence())

[源代码]

kl_divergence 函数

tf_keras.losses.kl_divergence(y_true, y_pred)

计算 y_truey_pred 之间的 Kullback-Leibler 散度损失。

loss = y_true * log(y_true / y_pred)

参见:https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence

独立用法

>>> y_true = np.random.randint(0, 2, size=(2, 3)).astype(np.float64)
>>> y_pred = np.random.random(size=(2, 3))
>>> loss = tf.keras.losses.kullback_leibler_divergence(y_true, y_pred)
>>> assert loss.shape == (2,)
>>> y_true = tf.keras.backend.clip(y_true, 1e-7, 1)
>>> y_pred = tf.keras.backend.clip(y_pred, 1e-7, 1)
>>> assert np.array_equal(
...     loss.numpy(), np.sum(y_true * np.log(y_true / y_pred), axis=-1))

参数

  • y_true:真实目标的张量。
  • y_pred:预测目标的张量。

返回

一个包含损失的 Tensor

引发

  • TypeError: 如果 y_true 无法转换为 y_pred.dtype