在PyTorch中,不同类型任务的主要区别在于输出层的设计和损失函数的选择:
Sigmoid
激活,损失函数通常是BCELoss
。Softmax
激活函数,通常使用CrossEntropyLoss
。Softmax
激活,损失函数是CrossEntropyLoss
。(一个图片被分类为猫、狗、老鼠、青蛙....,可能被分类成多个分类中的一种)Sigmoid
激活,损失函数是BCELoss
或BCEWithLogitsLoss
。(一个图片既包含猫,还包含狗,它同时含有多个标签)MSELoss
。备注:其中“ 二分类的实现方式2 ”和“ 多分类任务 ”实现方式是一样的
使用单个输出节点和Sigmoid
激活,损失函数通常是BCELoss
。
class BinaryClassificationModel(nn.Module):
def __init__(self):
super(BinaryClassificationModel, self).__init__()
self.layer = nn.Linear(10, 1)
def forward(self, x):
return torch.sigmoid(self.layer(x))
criterion = nn.BCELoss()
使用两个输出节点和Softmax
激活函数,通常使用CrossEntropyLoss
。
class BinaryModelSoftmax(nn.Module):
def __init__(self):
super(BinaryModelSoftmax, self).__init__()
self.layer = nn.Linear(10, 2)
def forward(self, x):
return torch.softmax(self.layer(x), dim=1)
criterion_softmax = nn.CrossEntropyLoss()
多分类任务:使用与类别数相等的输出节点和Softmax
激活,损失函数是CrossEntropyLoss
。
class MulticlassClassificationModel(nn.Module):
def __init__(self):
super(MulticlassClassificationModel, self).__init__()
self.layer = nn.Linear(10, 3)
def forward(self, x):
return torch.softmax(self.layer(x), dim=1)
criterion = nn.CrossEntropyLoss()
多标签分类任务:使用与标签数相等的输出节点和Sigmoid
激活,损失函数是BCELoss
或BCEWithLogitsLoss
。
class MultiLabelClassificationModel(nn.Module):
def __init__(self):
super(MultiLabelClassificationModel, self).__init__()
self.layer = nn.Linear(10, 3)
def forward(self, x):
return torch.sigmoid(self.layer(x))
criterion = nn.BCEWithLogitsLoss()
回归任务:单个输出节点,无激活函数,损失函数通常是MSELoss
。
class RegressionModel(nn.Module):
def __init__(self):
super(RegressionModel, self).__init__()
self.layer = nn.Linear(10, 1)
def forward(self, x):
return self.layer(x)
criterion = nn.MSELoss()