PyTorch二分类时BCELoss,CrossEntropyLoss,Sigmoid等的选择和使用 这里就总结一下使用PyTorch做二分类时的几种情况:
总体上来讲,有三种实现形式:
- 最后分类层降至一维,使用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计算理解
函数定义
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表示按行操作,则每行都是除以该行下所有元素平方和的开方
- 最后分类层降至一维,但是不显式使用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)
- 最后分类层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)。