PyTorch二分类时BCELoss,CrossEntropyLoss,Sigmoid等的选择和使用 这里就总结一下使用PyTorch做二分类时的几种情况:

总体上来讲,有三种实现形式:

  1. 最后分类层降至一维,使用sigmoid输出一个0-1之间的分数,使用torch.nn.BCELoss作为loss function
self.outputs = nn.Linear(NETWORK_WIDTH, 1)
 
def forward(self, x):
    # other layers omitted
    x = self.outputs(x)           
    return torch.sigmoid(x) 

criterion = nn.BCELoss()
 
net_out = net(data)
loss = criterion(net_out, target)

注意:如果不使用softmax,使用sigmoid归一化分数到了0-1之间,如果想将其变为概率分布,可以使用l1/l2 normalize(we 𝐿1-normalized the aspect weights so that they sum up to one)【Pytorch】F.normalize计算理解

inception v3 pytorch 分类 pytorch二分类_git

函数定义

torch.nn.functional.normalize(input, p=2.0, dim=1, eps=1e-12, out=None)

功能:将某一个维度除以那个维度对应的范数(默认是2范数)。

使用:

F.normalize(data, p=2/1, dim=0/1/-1) 将某一个维度除以那个维度对应的范数(默认是2范数)

        data:输入的数据(tensor)

        p:L2/L1_norm运算

        dim:0表示按列操作,则每列都是除以该列下平方和的开方;1表示按行操作,则每行都是除以该行下所有元素平方和的开方
  1. 最后分类层降至一维,但是不显式使用sigmoid,而使用torch.nn.BCEWithLogitsLoss作为loss function
self.outputs = nn.Linear(NETWORK_WIDTH, 1)
 
def forward(self, x):
    # other layers omitted
    x = self.outputs(x)           
    return x
###############################################################
criterion = nn.BCEWithLogitsLoss()
 
net_out = net(data)
loss = criterion(net_out, target)
  1. 最后分类层nn.Linear输出维度为2维,这时候使用的 loss function 是 torch.nn.CrossEntropyLoss,其已经包含了softmax作为激活函数
self.dense = nn.Linear(hidden_dim,2)
################################################
criterion = nn.CrossEntropyLoss()
net_out = net(data)
loss = criterion(net_out, target)

所以总结一下,在PyTorch中进行二分类,有三种主要的全连接层,激活函数和loss function组合的方法,分别是:

  • torch.nn.Linear + torch.sigmoid + torch.nn.BCELoss
  • torch.nn.Linear + BCEWithLogitsLoss(集成了Sigmoid)
  • torch.nn.Linear(输出维度为2)+ torch.nn.CrossEntropyLoss(集成了Softmax)。