Tensorflow - Cross Entropy Loss

本文详细介绍了Tensorflow中的交叉熵损失函数,包括sigmoid_cross_entropy_with_logits、weighted_cross_entropy_with_logits、softmax_cross_entropy_with_logits(已弃用)、softmax_cross_entropy_with_logits_v2以及sparse_softmax_cross_entropy_with_logits的用途、工作原理和使用方法。这些函数适用于不同类型的分类任务,如多标签分类和多分类,并探讨了如何根据任务需求选择合适的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tensorflow - Cross Entropy Loss

Tensorflow 提供的用于分类的 ops 有:

  • tf.nn.sigmoid_cross_entropy_with_logits
  • tf.nn.softmax
  • tf.nn.log_softmax
  • tf.nn.softmax_cross_entropy_with_logits
  • tf.nn.softmax_cross_entropy_with_logits_v2 - identical to the base version, except it allows gradient propagation into the labels.
  • tf.nn.sparse_softmax_cross_entropy_with_logits
  • tf.nn.weighted_cross_entropy_with_logits

其中, 交叉熵相关的损失函数有:

注: logits 表示未归一化处理的概率, 一般是 softmax 的输入, 网络输出层的输出结果.

根据应用场景中,分类目标的独立性与互斥性, 可以选择 sigmoid 或者 softmax 来实现.

1. sigmoid_cross_entropy_with_logits

  • 作用:

    计算给定 logits 的交叉熵(也叫 logistic loss).

    用于离散分类任务中, 计算概率误差. 其中每个类别标签class间是相互独立, 且不互斥的.

    例如, multilabel classification 问题, 每张图片中可能同时包含一头大象和一只狗.

  • 用法:

    tf.nn.sigmoid_cross_entropy_with_logits(
      _sentinel=None, # Used to prevent positional parameters. 内部参数, 不使用.
      labels=None,  # 与 logits 类型和尺寸一样的张量
      logits=None,  # type float32 or float64 的张量
      name=None )   #  op 名字, 可选参数.
  • 计算过程:

    x=logits,z=labels x = l o g i t s , z = l a b e l s , 有:

    L=zlog(sigmoid(x))+(1z)log(1sigmoid(x)) L = z ∗ − l o g ( s i g m o i d ( x ) ) + ( 1 − z ) ∗ − l o g ( 1 − s i g m o i d ( x ) )
    L=zlog(1/(1+exp(x)))+(1z)log(exp(x)/(1+exp(x))) L = z ∗ − l o g ( 1 / ( 1 + e x p ( − x ) ) ) + ( 1 − z ) ∗ − l o g ( e x p ( − x ) / ( 1 + e x p ( − x ) ) )
    L=zlog(1+exp(x))+(1z)(log(exp(x))+log(1+exp(x))) L = z ∗ l o g ( 1 + e x p ( − x ) ) + ( 1 − z ) ∗ ( − l o g ( e x p ( − x ) ) + l o g ( 1 + e x p ( − x ) ) )
    L=zlog(1+ex

### 关于 PyTorch 中 CrossEntropyLoss 的实现与应用 在机器学习领域,`CrossEntropyLoss` 是一种常用的损失函数,尤其适用于分类任务。它结合了 `LogSoftmax` 和 `Negative Log Likelihood (NLL)` 损失[^3]。以下是关于其具体实现和使用的详细介绍: #### 1. **PyTorch 中 CrossEntropyLoss 的定义** `torch.nn.CrossEntropyLoss` 是 PyTorch 提供的一个类,用于计算输入张量和目标之间的交叉熵损失。该方法内部实现了 softmax 函数以及负对数似然损失的组合操作。 ```python import torch import torch.nn as nn criterion = nn.CrossEntropyLoss() ``` 上述代码片段展示了如何实例化一个 `CrossEntropyLoss` 对象。需要注意的是,此函数期望未经缩放的原始分数(logits),而不是经过 softmax 处理后的概率分布[^4]。 --- #### 2. **典型应用场景** 假设我们正在处理一个多类别分类问题,其中模型输出是一个大小为 `[batch_size, num_classes]` 的 logits 张量,而标签则是一个形状为 `[batch_size]` 的整型张量,表示每一批次样本的真实类别索引。 ```python # 假设 batch size 为 3,num classes 为 5 outputs = torch.randn(3, 5, requires_grad=True) # 随机初始化 logits labels = torch.tensor([1, 0, 4]) # 真实标签 loss = criterion(outputs, labels) print(f'Computed Loss: {loss.item()}') ``` 在此示例中,`nn.CrossEntropyLoss` 自动执行以下两步: - 应用 Softmax 转换到 `outputs` 上; - 计算并返回 NLL 损失值。 因此,在使用 `CrossEntropyLoss` 时无需手动调用 `softmax()` 方法[^5]。 --- #### 3. **自定义权重调整** 如果数据集中某些类别的样本数量较少,则可以通过设置参数 `weight` 来平衡不同类别的贡献度。 ```python weights = torch.tensor([1.0, 2.0, 1.0, 1.5, 0.5]) weighted_criterion = nn.CrossEntropyLoss(weight=weights) loss_with_weights = weighted_criterion(outputs, labels) print(f'Weighted Loss: {loss_with_weights.item()}') ``` 通过这种方式可以缓解因类别不平衡而导致的训练偏差问题[^6]。 --- #### 4. **忽略特定索引** 当存在未标注的数据或者希望跳过某些预测结果时,可利用 `ignore_index` 参数指定这些特殊位置不会参与最终的误差累积过程。 ```python ignored_criterion = nn.CrossEntropyLoss(ignore_index=-100) modified_labels = torch.tensor([1, -100, 4]) # 将第二个样例标记为忽略项 (-100) loss_ignoring_some = ignored_criterion(outputs, modified_labels) print(f'Ignored Index Loss: {loss_ignoring_some.item()}') ``` 这里 `-100` 表明对应条目应被排除在外[^7]。 --- #### 5. **与其他框架对比** 相较于 TensorFlow,虽然两者都支持类似的交叉熵功能,但在灵活性方面各有千秋。例如,PyTorch 更适合快速原型开发研究项目;而对于大规模分布式部署场景来说,TensorFlow 可能更具优势[^8]。 --- ### 总结 综上所述,`CrossEntropyLoss` 不仅简化了多分类任务中的复杂流程,还提供了丰富的配置选项来满足实际需求下的各种特殊情况处理要求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值