You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二分类任务中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:25:19