Pytorch 的 损失函数

1. 损失函数

损失函数(Loss Function)是用来衡量模型预测结果与真实值之间的差异的函数。它是训练过程中最重要的组成部分之一,用来指导模型的优化过程。

 作用

损失函数的作用包括:

  1. 衡量模型性能:通过计算预测结果与真实值的差异,损失函数可以提供一个衡量模型预测准确性的指标。较小的损失值表示模型的预测结果与真实值更接近,表明模型性能更好。

  2. 反向传播梯度:损失函数是神经网络反向传播算法中必不可少的一部分。通过计算损失函数对模型参数的梯度,可以根据梯度下降算法来更新模型参数,从而使模型不断优化,提高性能。

  3. 目标函数优化:在机器学习和深度学习中,我们的目标是最小化损失函数。通过不断调整模型参数,使损失函数达到最小值,可以使模型的预测结果更接近真实值。

不同任务和模型可能需要使用不同的损失函数。一些常见的损失函数包括均方误差(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>)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值