tf.keras.losses.SparseCategoricalCrossentropy是否适用于所有分类问题?
TensorFlow 2.3.1版本SparseCategoricalCrossentropy与BinaryCrossentropy适用场景说明
TensorFlow官方对
tf.keras.losses.SparseCategoricalCrossentropy()“支持两个及以上标签类别”的描述仅指类别数覆盖范围,不代表该损失适用于所有分类场景。
是否可以在任意分类问题中使用SparseCategoricalCrossentropy?
答案是否定的,该损失的使用有明确的前提约束,不符合条件时无法正常使用:
- 仅支持单标签分类任务,即每个样本只能归属一个类别,且标签必须为整数格式(如二分类标签为
0/1,三分类标签为0/1/2),不支持one-hot编码标签、浮点型标签。 - 要求模型最终输出层的激活函数为
softmax,输出维度等于分类总类别数,所有维度输出的概率和为1。
什么场景下必须使用BinaryCrossentropy类二分类损失函数?
出现以下任意一种场景时,你都只能选择tf.keras.losses.BinaryCrossentropy:
- 二分类任务中你选择让模型输出层维度为1、搭配
sigmoid激活函数,输出值直接表示正类归属概率 - 二分类任务的标签为one-hot编码格式,或者需要使用标签平滑、类权重等高级配置,2.3.1版本中
BinaryCrossentropy对这类功能的兼容性远好于强行用SparseCategoricalCrossentropy实现二分类 - 任务为多标签分类,即每个样本可同时归属多个类别(比如一张图片同时包含猫和狗两个标签),这类场景下
SparseCategoricalCrossentropy完全不支持,必须用BinaryCrossentropy搭配输出层sigmoid激活,独立计算每个类别的交叉熵损失
额外说明
如果强行在二分类场景下用SparseCategoricalCrossentropy,你需要把输出层维度设为2、搭配softmax激活,标签保持0/1整数格式,这种写法虽然能跑通,但在TensorFlow 2.3.1版本中小批量训练时的梯度波动会比用BinaryCrossentropy更大,计算效率也更低,不推荐使用。
内容的提问来源于stack exchange,提问作者Ken Lin
相关产品推荐
相关产品推荐

