TensorFlow分类损失函数:Sparse与Categorical用法详解

听雨眠
听雨眠
发布时间:2026-10-13 | 3人浏览过
原创

本文详解TensorFlow中多分类与二分类损失函数的使用。重点解析SparseCategoricalCrossentropy与CategoricalCrossentropy在输入格式(标签编码方式)及from_logits参数上的区别,并介绍BinaryCrossentropy在二分类场景下的应用。通过代码示例说明softmax与sigmoid激活函数的搭配原则,帮助开发者正确选择损失函数以优化模型训练。

多分类损失函数概述

多分类任务中,选择合适的损失函数至关重要。TensorFlow提供了多种分类损失函数,主要区别在于标签的编码方式以及是否经过激活函数处理。

label.shape:[batch_size]; pred.shape: [batch_size, num_classes]

SparseCategoricalCrossentropy 用法

对于多分类问题,通常使用 `tf.keras.losses.sparse_categorical_crossentropy(y_true, y_pred, from_logits=False, axis=-1)`。该函数适用于标签为整数索引的情况,即 `y_true` 的形状为 `[batch_size]`,而 `y_pred` 的形状为 `[batch_size, num_classes]`。

参数说明如下:`y_true` 代表真实标签,`y_pred` 代表模型预测值。关键参数 `from_logits` 决定了是否对预测值进行 softmax 处理。若预测结果已经过 softmax 激活函数处理(即输出概率分布,和为1),则应设为 `False`;若预测结果是未经过 softmax 的原始 logits,则应设为 `True`。


pred = tf.convert_to_tensor([[0.9, 0.05, 0.05], [0.5, 0.89, 0.6], [2.05, 0.01, 0.94]])
label = tf.convert_to_tensor([0, 1, 2])
loss = tf.keras.losses.sparse_categorical_crossentropy(label, pred)
print(loss.numpy())
# 包含 reduction 参数, 用于对一个批次的损失函数求平均值,求和等
# loss = tf.keras.losses.SparseCategoricalCrossentropy()(label, pred)
label.shape:[batch_size, num_classes](one_hot);pred.shape:[batch_size, num_classes]

使用 tf.keras.losses.categorical_crossentropy(y_true, y_pred, from_logits=False, axis=-1)

CategoricalCrossentropy 用法

另一种多分类损失函数是 `tf.keras.losses.categorical_crossentropy(y_true, y_pred, from_logits=False, axis=-1)`。其参数含义与前者类似,`y_true` 为真实值,`y_pred` 为预测值,`from_logits` 的作用同上。主要区别在于标签的格式要求不同。


pred = tf.convert_to_tensor([[0.9, 0.05, 0.05], [0.5, 0.89, 0.6], [0.05, 0.01, 0.94]])
label = tf.convert_to_tensor([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
loss = tf.keras.losses.categorical_crossentropy(label, pred)
print(loss.numpy())

二分类损失函数

对于二分类任务,应使用 `tf.keras.losses.BinaryCrossentropy()`。该函数专门用于处理只有两个类别的分类问题,输入标签通常为 0 或 1 的浮点数。


label = tf.convert_to_tensor([0, 0, 1, 1], dtype=tf.float32)
pred = tf.convert_to_tensor([1, 1, 1, 0], dtype=tf.float32)
loss = tf.keras.losses.BinaryCrossentropy()(label, pred)
print(loss.numpy())

多分类与二分类的区别

在多分类与二分类的选择上,核心区别在于标签的表示形式以及激活函数的搭配。

通常,`categorical_crossentropy` 需与 softmax 激活函数搭配使用,此时标签需要转换为 one-hot 编码格式;而 `binary_crossentropy` 则与 sigmoid 激活函数搭配,适用于二分类场景。`sparse_categorical_crossentropy` 则允许直接使用整数标签,无需手动转换为 one-hot 格式,更加便捷。

参考 TensorFlow 官方文档及相关技术博客,可以获取更多关于损失函数底层实现的细节。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表