二分类任务中torch.nn.BCEWithLogitsLoss输入维度及网络配置咨询
BCEWithLogitsLoss二分类任务的输入维度与网络设置
单输出维度([n, 1])—— 二分类首选方式
- 网络最后层设置:使用
nn.Linear(in_features, 1),输出的logits形状为[n, 1](n为样本数)。无需额外添加Sigmoid或Softmax层,因为BCEWithLogitsLoss内部已整合Sigmoid计算。 - 目标值要求:直接使用0/1标签,形状可为
[n]或[n, 1],无需做one-hot编码。比如标签0代表负类,1代表正类。 - 代码示例:
import torch import torch.nn as nn batch_size = 4 # 模拟网络输出的logits logits = torch.randn(batch_size, 1) # 模拟目标标签 targets = torch.randint(0, 2, (batch_size,)) loss_fn = nn.BCEWithLogitsLoss() # 若标签是[n]形状,转成[n,1]后计算损失 loss = loss_fn(logits, targets.float().unsqueeze(1))
双输出维度([n, 2])—— 可行但冗余的方式
- 网络最后层设置:使用
nn.Linear(in_features, 2),输出的logits形状为[n, 2]。 - 目标值要求:需要将原始0/1标签转换为one-hot编码的浮点张量,形状为
[n, 2],比如标签0对应[1, 0],标签1对应[0, 1]。 - 注意点:此时损失会对两个类别分别计算二元交叉熵,最终取平均值(默认reduction='mean')。这种方式本质是把二分类拆成两个独立的二元分类任务,计算效率低于单输出方式,一般不推荐。
- 代码示例:
batch_size = 4 logits = torch.randn(batch_size, 2) targets = torch.randint(0, 2, (batch_size,)) # 转换为one-hot编码 one_hot_targets = nn.functional.one_hot(targets, num_classes=2).float() loss_fn = nn.BCEWithLogitsLoss() loss = loss_fn(logits, one_hot_targets)
总结
优先选择单输出维度([n, 1]),它更贴合二分类的直观逻辑,标签处理简单,计算效率更高。双输出维度虽能运行,但属于冗余设计,仅在特殊场景下考虑使用。
内容的提问来源于stack exchange,提问作者usr01
相关产品推荐
相关产品推荐

