1. 损失函数
损失函数(Loss Function)是用来衡量模型预测结果与真实值之间的差异的函数。它是训练过程中最重要的组成部分之一,用来指导模型的优化过程。
作用
损失函数的作用包括:
衡量模型性能:通过计算预测结果与真实值的差异,损失函数可以提供一个衡量模型预测准确性的指标。较小的损失值表示模型的预测结果与真实值更接近,表明模型性能更好。
反向传播梯度:损失函数是神经网络反向传播算法中必不可少的一部分。通过计算损失函数对模型参数的梯度,可以根据梯度下降算法来更新模型参数,从而使模型不断优化,提高性能。
目标函数优化:在机器学习和深度学习中,我们的目标是最小化损失函数。通过不断调整模型参数,使损失函数达到最小值,可以使模型的预测结果更接近真实值。
不同任务和模型可能需要使用不同的损失函数。一些常见的损失函数包括均方误差(Mean Squared Error,MSE),交叉熵损失(Cross-Entropy Loss),二分类交叉熵损失(Binary Cross-Entropy Loss)等。
选择合适的损失函数对于模型的性能和训练效果至关重要。在实际应用中,根据任务的特点和需求,选择适合的损失函数可以帮助提高模型的准确性和泛化能力。
2. 常见的损失函数
1. L1Loss
class torch.nn.L1Loss(size_average=None, reduce=None, reduction='mean')
size_average
(默认值为True):表示是否对元素进行平均。若为True,则返回值为标量;若为False,则返回值为每个样本的损失值。
reduce
(默认值为True):表示是否将每个样本的损失值相加,并返回总损失。若为True,则返回值为标量;若为False,则返回值为每个样本的损失值。
reduction
(默认值为'mean'):表示如何对损失值进行汇总。可以取以下值:
- 'none':不进行汇总,返回每个样本的损失值。
- 'mean':对损失值进行平均汇总,返回一个标量。
- 'sum':对损失值进行求和汇总,返回一个标量。
注意:
参数
size_average
的默认值为True,即当参数为None时,默认为True。
它是一个 类,因此 需要实例化,之后传入 tensor 数据,自动进行 forward 函数计算!!!
import torch
from torch.nn import L1Loss
input = torch.tensor([1,2,3,4],dtype=torch.float32)
target = torch.tensor([5,6,7,8],dtype=torch.float32)
input = torch.reshape(input,(1,1,1,4))
target = torch.reshape(target,(1,1,1,4))
loss = L1Loss()
result = loss(input,target)
print(result) # tensor(4.)
2. MSELoss(均方误差)
计算预测值和真实值之间的差的平方的平均值。
class torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')
3. CrossEntropyLoss(交叉熵损失)
用于多分类问题,通过比较预测概率分布和真实标签的分布来衡量模型的性能。
class torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean', label_smoothing=0.0)
weight (Tensor, optional) - 每个类别的权重,默认为None。可以传入一个权重张量,用于调整不同类别的损失权重。
size_average (bool, optional) - 是否对损失求平均,默认为True。如果设置为True,则返回的损失是对所有输入样本的损失求平均值;如果设置为False,则返回的是总的损失之和。
ignore_index (int, optional) - 忽略的类别索引,默认为-100。如果指定了该参数,那么在计算损失时会忽略该类别的预测。
reduction (string, optional) - 损失值的归约方式,默认为'mean'。可选的取值有:'none'表示不进行归约,返回每个样本的损失值;'sum'表示对所有样本的损失值进行求和;'mean'表示对所有样本的损失值进行求平均。
label_smoothing (float, optional) - 标签平滑的因子,默认为0。如果设置为非零值,将对真实标签进行平滑处理。
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential, CrossEntropyLoss
from torch.utils.data import DataLoader
input = torchvision.datasets.CIFAR10("../TorchVersion/dataset",train=True,
transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(input,batch_size=1)
class myModule(nn.Module):
def __init__(self):
super(myModule, self).__init__()
self.module1 = Sequential(
Conv2d(3, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 64, 5, padding=2),
MaxPool2d(2),
Flatten(), # 展平
Linear(1024, 64),
Linear(64, 10)
)
def forward(self,x):
x = self.module1(x)
return x
myModule_1 = myModule()
cross_loss = CrossEntropyLoss()
for data in dataloader:
img, target = data
output = myModule_1(img)
# print(img)
# print(output) # tensor([[-0.0629, 0.1239, 0.0203, 0.0592, 0.0030, -0.1035, -0.1055, -0.1032,0.0423, -0.0527]], grad_fn=<AddmmBackward0>)
# print(target) # tensor([6])
result = cross_loss(output,target)
print(result) # tensor(2.2373, grad_fn=<NllLossBackward0>)
标签:None,函数,模型,torch,损失,Pytorch,True
From: https://blog.csdn.net/SILVERCROWNAGE/article/details/141353646