💻 源码
"""
演示
    二分类交叉熵损失函数
介绍
    损失函数 也叫 成本函数/目标函数/代价函数/误差函数,用来 衡量模型好坏,也就是模型预测表现
    分类问题
        多分类:多分类交叉熵损失函数,nn.CrossEntropLoss
        二分类:二分类交叉熵,nn.BCELoss; 或 多分类交叉熵损失函数,nn.CrossEntropLoss(建议使用)
多分类交叉熵损失
    公式:CrossEntropLoss = -Σylog(softmax(y_logits))
    其中:y_logits是模型的原始输出/预测分数
        softmax(y_logits)是模型输出的概率分布,也就是每个类别的预测概率,最大概率对应预测类别
    注意:
        多分类交叉熵CrossEntropLoss里面有softmax运算,所以模型的输出层不需要softmax。
        但是如果要获取预测概率,则需要在模型输出的原始预测分数后面经过softmax
    应用:
        多分类问题,如:10个类别,预测图片属于哪一类
    API:
        nn.CrossEntropyLoss()

二分类交叉熵损失
    公式:BCELoss = -y*log(y_hat)-(1-y)*log(1-y_hat)
    其中:y_hat是模型的预测值,也就是经过sigmoid之后的预测概率,对应正类
        y 是真实值,0或1,
        负类:标签编码0,one-hot编码[1,0],正类:标签编码1,one-hot[0,1]
    注意:
        二分类交叉熵损失BCELoss里面没有sigmoid,所以模型输出层最后需要添加sigmoid
    API:
        nn.BCELoss()

需要掌握:
    loss_fn = nn.CrossEntropLoss
    loss = loss_fn(y_logits, y_true)
    二分类任务可以用多分类交叉熵损失函数CrossEntropLoss(建议使用) / 二分类交叉熵损失BCELoss

"""

# 导包
import torch
from torch import nn

# 1.定义函数,演示 二分类交叉熵损失函数,注意sigmoid要添加到模型输出层
# 二分类任务,通常1为正类,0为负类
def demo01():
    # 1.创建 真实值, 只能标签编码
    # 1D:(batch_size,)
    y_true = torch.tensor([0, 1, 0, 1], dtype=torch.float32)
    # 2.创建 预测分数,1D:(batch_size,)
    y_logits = torch.tensor([10, -10, -50, 2.5], dtype=torch.float32)
    # 预测类别[1,0,0,1]
    # 经过sigmoid,转换为概率,这里才是模型输出的预测值
    y_preds = torch.sigmoid(y_logits)
    print(f"y_preds:{y_preds}, shape: {y_preds.shape}")
    print(f"y_true:{y_true}, shape: {y_true.shape}")
    # print(f"y_logits:{y_logits}, shape: {y_logits.shape}")
    # print(f"y_preds:{y_preds}, shape: {y_preds.shape}")
    # 3.创建 损失函数,二分类交叉熵损失函数
    loss_fn = nn.BCELoss()
    # 4.计算损失
    # y_preds:1D(4,);y_true:1D(4,)
    loss = loss_fn(y_preds, y_true)
    print(f"二分类交叉熵损失:{loss}")
    ...

# 测试
if __name__ == '__main__':
    demo01()