首页 > 其他分享 >Pytorch 的 损失函数

Pytorch 的 损失函数

时间:2024-08-29 15:56:38浏览次数:7  
标签:None 函数 模型 torch 损失 Pytorch True

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>)

标签:None,函数,模型,torch,损失,Pytorch,True
From: https://blog.csdn.net/SILVERCROWNAGE/article/details/141353646

相关文章

  • Pytorch 中的 Sequential
    1.介绍在PyTorch中,Sequential是一个模型容器。它是一个用于顺序排列神经网络模块(如层、激活函数等)的容器。通过使用Sequential,可以将多个模块按照顺序连接在一起,构建一个深度神经网络模型。使用Sequential时,可以将每个模块按照顺序添加到Sequential容器中。每个模块都可以......
  • 类的成员静态变量和静态成员函数需要类外定义吗,举例说明
    类的成员静态变量需要在类外定义(非声明),而静态成员函数则不需要在类外额外定义。 静态变量类外定义示例 假设有一个类MyClass,它有一个静态成员变量staticVar: cppclassMyClass{public:  staticintstaticVar;//静态成员变量声明  staticvoidstaticFu......
  • 编写CUDA核函数验与证核函数杂谈
    编写核函数核函数也是一个函数,但是声明核函数有一个比较模板化的方法:global__voidkernel_name(argumentlist);注意:声明和定义是不同的,这点CUDA与C语言是一致的在C语言函数前没有的限定符global,CUDAC中还有一些其他在C中没有的限定符,见表10-2。表10-2CUDAC中一些其他在C......
  • 从零开始的PyTorch【03】:优化你的神经网络模型
    从零开始的PyTorch【03】:优化你的神经网络模型前言欢迎回到PyTorch学习系列的第三篇!在前两篇文章中,我们学习了如何构建一个简单的神经网络并训练它,同时探索了数据集调整对模型性能的影响。今天,我们将深入探讨如何优化你的神经网络模型,使其在更复杂的任务中表现更好。我们......
  • C#学习笔记- 随机函数Random()的用法详解
    原文链接:https://www.jb51.net/article/90933.htmRandom.Next()返回非负随机数;Random.Next(Int)返回一个小于所指定最大值的非负随机数Random.Next(Int,Int)返回一个指定范围内的随机数,例如(-100,0)返回负数1、random(number)函数介绍random(number)返回一个0~number-1之间......
  • 用MySQL的GROUP_CONCAT函数轻松解决多表联查的聚合问题
    大家好呀,我是summo,最近遇到了一个功能需求,虽然也是CURD,但属于那种比较复杂一点的CURD,话不多说,我们先看一下需求。需求如下:有三张表,学生表、课程表、学生课程关联表,关联关系如下图:要求实现的功能:支持输入名称模糊查询,可以是学生名称也可以是课程名称,但只有一个输入框;要求以......
  • Python——集合基本操作以及哈希函数
    Python中的集合(Set)是一个无序的、不包含重复元素的数据结构。集合主要用于数学上的集合操作,如并集、交集、差集和对称差集等。集合使用大括号 {} 来表示,但注意空集合不能使用 {} 表示(这会创建一个空字典),而应该使用 set() 来创建。创建集合1.使用大括号 {}:这是最直接......
  • PHP8面向对象快速入门三 类的继承 类方法属性重写和final关键字 parent调用父类的方法
    在PHP中,类的继承(继承)是一种机制,允许一个类继承另一个类的属性和方法,从而实现代码的重用和扩展。继承可以帮助你创建一个基于现有类的新类,保留原有类的特性并增加或修改其功能。classAnimal{public$name='dongwu';protected$age=1;private......
  • 每天五分钟深度学习框架pytorch:nn.Module和nn.function的区别
    本文重点前面我们学习了神经网络工具箱nn.Module,本节课程我们学习一下nn.function,我们可以暂时这样认为,基本上nn.Module所能够完成的任务,nn.function基本上都可以完成,也就是它们两个是重复的,但是它们两个还是有很大的区别,这里我们简单的进行一下介绍。nn.Module和nn.func......
  • 并行动力:用PyTorch在多GPU上释放深度学习潜能
    标题:并行动力:用PyTorch在多GPU上释放深度学习潜能随着深度学习模型变得越来越复杂,单GPU训练往往难以满足需求。幸运的是,PyTorch提供了强大的多GPU训练支持,允许我们利用多个GPU来加速模型的训练过程。本文将详细介绍如何在PyTorch中使用多GPU训练,包括数据并行、模型并行以及......