PyTorch中提供了多种损失函数,涵盖了分类、回归和图像处理等不同领域的任务,以下是其中一些常用的损失函数及其使用示例:
- 交叉熵损失函数(CrossEntropyLoss)
适用于多分类任务,通常与Softmax层结合使用。
import torch.nn as nn import torch.optim as optim # 定义神经网络模型 class Net(nn.Module): def __init__(self, num_classes): super(Net, self).__init__() self.fc1 = nn.Linear(10, 5) self.fc2 = nn.Linear(5, num_classes) def forward(self, x): x = nn.functional.relu(self.fc1(x)) x = self.fc2(x) return x # 创建模型实例、损失函数和优化器 net = Net(num_classes=3) # 假设有3个类别 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.01) # 在每次迭代中,计算并反向传播损失 output = net(input_data) loss = criterion(output, target) loss.backward() optimizer.step()
- 均方误差损失函数(MSELoss)
适用于回归任务,用于度量模型输出和目标值之间的平均平方误差。
import torch.nn as nn import torch.optim as optim # 定义神经网络模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(10, 5) self.fc2 = nn.Linear(5, 1) def forward(self, x): x = nn.functional.relu(self.fc1(x)) x = self.fc2(x) return x # 创建模型实例、损失函数和优化器 net = Net() criterion = nn.MSELoss() optimizer = optim.SGD(net.parameters(), lr=0.01) # 在每次迭代中,计算并反向传播损失 output = net(input_data) loss = criterion(output, target) loss.backward() optimizer.step()
- 平滑的L1损失函数(SmoothL1Loss)
适用于回归任务,与MSELoss不同,SmoothL1Loss对异常值更加鲁棒。
import torch.nn as nn import torch.optim as optim # 定义神经网络模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(10, 5) self.fc2 = nn.Linear(5, 1) def forward(self, x): x = nn.functional.relu(self.fc1(x)) x = self.fc2(x) return x # 创建模型实例、损失函数和优化器 net = Net() criterion = nn.SmoothL1Loss() optimizer = optim.SGD(net.parameters(), lr=0.01) # 在每次迭代中,计算并反向传播损失 output = net(input_data) loss = criterion(output, target) loss.backward() optimizer.step()
- 二分类交叉熵损失函数(BCELoss)
适用于二分类任务,将模型输出视为一个概率值,用于度量模型输出和目标值之间的交叉熵。
import torch.nn as nn import torch.optim as optim # 定义神经网络模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(10, 5) self.fc2 = nn.Linear(5, 1) def forward(self, x): x = nn.functional.relu(self.fc1(x)) x = nn.functional.sigmoid(self.fc2(x)) return x # 创建模型实例、损失函数和优化器 net = Net() criterion = nn.BCELoss() optimizer = optim.SGD(net.parameters(), lr=0.01) # 在每次迭代中,计算并反向传播损失 output = net(input_data) loss= criterion(output, target) loss.backward() optimizer.step()
= criterion(output, target) loss.backward() optimizer.step()
import torch.nn as nn import torch.optim as optim # 定义神经网络模型 class Net(nn.Module): def init(self): super(Net, self).init() self.fc1 = nn.Linear(10, 5) self.fc2 = nn.Linear(5, 1)
def forward(self, x): x = nn.functional.relu(self.fc1(x)) x = self.fc2(x) return x # 创建模型实例、损失函数和优化器 net = Net() criterion = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([5.0])) optimizer = optim.SGD(net.parameters(), lr=0.01) # 在每次迭代中,计算并反向传播损失 output = net(input_data) loss = criterion(output, target) loss.backward() optimizer.step()
这里设置了一个正样本的权重为5,表示模型在训练时应该更加关注正样本。
- 像素级别交叉熵损失函数(CrossEntropyLoss2d)
适用于图像分割任务,将每个像素点的预测结果视为一个概率值,用于度量模型输出和目标值之间的交叉熵。
import torch.nn as nn import torch.optim as optim # 定义神经网络模型 class Net(nn.Module): def __init__(self, num_classes): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1) self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1) self.conv3 = nn.Conv2d(128, num_classes, kernel_size=3, stride=1, padding=1) def forward(self, x): x = nn.functional.relu(self.conv1(x)) x = nn.functional.max_pool2d(x, kernel_size=2, stride=2) x = nn.functional.relu(self.conv2(x)) x = nn.functional.max_pool2d(x, kernel_size=2, stride=2) x = self.conv3(x) return x # 创建模型实例、损失函数和优化器 net = Net(num_classes=2) # 假设有2个类别 criterion = nn.CrossEntropyLoss2d() optimizer = optim.SGD(net.parameters(), lr=0.01) # 在每次迭代中,计算并反向传播损失 output = net(input_data) loss = criterion(output, target) loss.backward() optimizer.step()
这里使用了一个简单的卷积神经网络来进行二分类图像分割,输出层使用了两个通道,分别代表两种类别(前景和背景)。损失函数为CrossEntropyLoss2d,用于计算每个像素点的预测结果与真实标签之间的交叉熵损失。
除了以上列出的常见损失函数外,PyTorch还提供了许多其他类型的损失函数,如L1Loss、NLLLoss、KLDivLoss等,可以根据具体应用场景选择适合的损失函数。