Pytorch深度学习-----损失函数(L1Loss、MSELoss、CrossEntropyLoss)

news2025/1/19 11:26:56

系列文章目录

PyTorch深度学习——Anaconda和PyTorch安装
Pytorch深度学习-----数据模块Dataset类
Pytorch深度学习------TensorBoard的使用
Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Compose,RandomCrop)
Pytorch深度学习------torchvision中dataset数据集的使用(CIFAR10)
Pytorch深度学习-----DataLoader的用法
Pytorch深度学习-----神经网络的基本骨架-nn.Module的使用
Pytorch深度学习-----神经网络的卷积操作
Pytorch深度学习-----神经网络之卷积层用法详解
Pytorch深度学习-----神经网络之池化层用法详解及其最大池化的使用
Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)
Pytorch深度学习-----神经网络之线性层用法
Pytorch深度学习-----神经网络之Sequential的详细使用及实战详解


文章目录

  • 系列文章目录
  • 一、损失函数是什么?
    • 1.常见的损失函数及其解释
    • 2.实战
      • 2.1. 范数损失L1 Loss
      • 2.2. 均方误差损失MSE Loss
      • 2.3. 交叉熵损失CrossEntropyLoss
    • 3.在神经网络模型中使用交叉熵损失函数


一、损失函数是什么?

在PyTorch深度学习中,损失函数(Loss Function)是一个用于计算模型预测输出和实际输出之间的误差的函数。它用于衡量模型的性能,并通过反向传播算法更新模型的权重和参数,以减小预测输出和实际输出之间的误差

1.常见的损失函数及其解释

均方误差损失(MSE Loss): MSE Loss是一种常用于回归问题的损失函数。它计算预测输出和实际输出之间的均方误差,即预测值与实际值之差的平方的平均值。MSE Loss对于数据的高斯分布假设较为合理,适用于预测连续变量的任务。

交叉熵损失(Cross-Entropy Loss): 交叉熵损失是一种常用于分类问题的损失函数。它衡量的是两个概率分布之间的差异。在PyTorch中,可以使用torch.nn.CrossEntropyLoss来实现交叉熵损失。这个类结合了LogSoftmax和NLLLoss(负对数似然损失)两个操作,使得模型在训练时更加高效。交叉熵损失对于数据的伯努利分布假设较为合理,适用于分类任务。

L1范数损失(L1 Loss): L1 Loss计算预测输出和实际输出之间的绝对值差值的平均值。相比MSE Loss,L1 Loss对异常值不敏感,因此在处理存在异常值的数据集时可能更加适合。L1 Loss也被称为Mean Absolute Error (MAE)。

Softmax交叉熵损失(Softmax Cross-Entropy Loss): Softmax交叉熵损失是用于多分类任务的损失函数。它首先将模型的输出通过Softmax函数转换成概率分布,然后计算该分布与实际分布之间的交叉熵损失。这个损失函数可以用于解决多分类问题。

官网中关于损失函数(部分)如下图所示
在这里插入图片描述

2.实战

2.1. 范数损失L1 Loss

torch.nn.L1Loss(size_average=None, reduce=None, reduction='mean')

参数解释:

size_average(可选,默认为 None):这是一个布尔值或整数,用于指定是否对所有输入批次的输出进行平均。如果设置为 True,则对所有输入批次的输出进行平均。如果设置为整数 n,则对前 n 个输入批次的输出进行平均。如果设置为 None,则根据 reduce 参数的值决定是否进行平均。

reduce(可选,默认为 None):这是一个布尔值,用于指定是否对输入批次的输出进行减少。如果设置为 True,则对输入批次的输出进行减少,返回一个标量。如果设置为 False,则返回每个输入批次的输出的张量。如果 size_average 和 reduce 都为 None,则根据 reduction 参数的值决定是否进行减少和平均。

reduction(可选,默认为 ‘mean’):这是一个字符串,用于指定如何对输入批次的输出进行减少。可选的值有 ‘mean’、‘sum’ 和 ‘none’。如果设置为 ‘mean’,则对输入批次的输出进行平均。如果设置为 ‘sum’,则对输入批次的输出求和。如果设置为 ‘none’,则不进行减少,返回每个输入批次的输出的张量。

计算公式:
即平均绝对误差
在这里插入图片描述
代码实践

import torch
# 实例化
criterion1 = torch.nn.L1Loss()
criterion2 = torch.nn.L1Loss(reduction="sum")
# 实际输出值
output = torch.tensor([1.0, 2.0, 3.0])
# 目标值
target = torch.tensor([2.0, 2.0, 2.0])
# 平均值损失值
loss = criterion1(output, target)
print(loss)  # 输出:tensor(0.6667)
# 误差和
loss1 = criterion2(output,target)
print(loss1) # tensor(2.)

即( (2-1)+(2-2)+(3-2))/3=2/3=0.6667

2.2. 均方误差损失MSE Loss

torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')

参数解释
size_average(可选,默认为 None):这是一个布尔值或整数,用于指定是否对所有输入批次的输出进行平均。如果设置为 True,则对所有输入批次的输出进行平均。如果设置为整数 n,则对前 n 个输入批次的输出进行平均。如果设置为 None,则根据 reduce 参数的值决定是否进行平均。

reduce(可选,默认为 None):这是一个布尔值,用于指定是否对输入批次的输出进行减少。如果设置为 True,则对输入批次的输出进行减少,返回一个标量。如果设置为 False,则返回每个输入批次的输出的张量。如果 size_average 和 reduce 都为 None,则根据 reduction 参数的值决定是否进行减少和平均。

reduction(可选,默认为 ‘mean’):这是一个字符串,用于指定如何对输入批次的输出进行减少。可选的值有 ‘mean’、‘sum’ 和 ‘none’。如果设置为 ‘mean’,则对输入批次的输出进行平均。如果设置为 ‘sum’,则对输入批次的输出求和。如果设置为 ‘none’,则不进行减少,返回每个输入批次的输出的张量。

公式

在这里插入图片描述

代码实践

import torch
# 实例化
criterion1 = torch.nn.MSELoss()
criterion2 = torch.nn.MSELoss(reduction="sum")
# 实际输出值
output = torch.tensor([1.0, 2.0, 5.0])
# 目标值
target = torch.tensor([2.0, 2.0, 2.0])
# 平方值损失值
loss = criterion1(output, target)
print(loss)  # 输出:tensor(3.3333)
# 误差和
loss1 = criterion2(output,target)
print(loss1) # tensor(10.)

即:((2-1)2+(2-2)2+(5-2)2)/3=10/3=3.333
若reduction="sum"即取差值的平方和。

2.3. 交叉熵损失CrossEntropyLoss

torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=- 100, reduce=None, reduction='mean', label_smoothing=0.0)

参数解释

weight:一个可选的 tensor,用于对每个类别的损失进行加权。这个张量的轴应该与输出的张量轴匹配,且长度等于类别的数量。如果未提供,则使用均匀权重。

size_average:一个可选参数,决定如何计算批处理中损失函数的平均值。如果设置为 True,则对每个样本的损失进行平均。如果设置为 False,则返回每个样本的损失。如果未提供,则根据损失函数是否具有 reduce 属性来决定。

ignore_index:一个可选参数,指定应忽略哪些标签。默认情况下,忽略标签为 -100 的元素。

reduce:一个可选参数,决定是否对批处理中的损失进行汇总。如果设置为 True,则对批处理中的损失进行汇总。如果设置为 False,则返回每个样本的损失。如果未提供,则根据损失函数是否具有 reduce 属性来决定。

reduction:一个可选参数,用于指定如何对批处理中的损失进行汇总。默认情况下,对损失进行平均。其他可能的值包括 ‘mean’、‘sum’ 和 ‘none’。

label_smoothing:一个可选参数,指定标签平滑的强度。默认情况下,不进行标签平滑。该参数的值应该在 0 到 1 之间。

公式
在这里插入图片描述
其中log是以e为底,exp是指数函数
注意的点:
交叉熵损失函数在PyTorch中的输入要求如下:

输入x的形状为(batch_size, num_classes)或(num_classes,)。其中,batch_size代表批量大小,num_classes代表类别数量。
输入y的形状为(batch_size,),其中每个元素是对应样本的目标标签的索引值。

即为交叉熵损失函数的输入要求是一个二维张量,第一维是批次大小,第二维是类别数
代码实践

代码如下图所示:

import torch
import torch.nn as nn

# 设置三分类问题,假设是人的概率是0.1,狗的概率是0.2,猫的概率是0.3
x = torch.tensor([0.1, 0.2, 0.3])
print(x)
y = torch.tensor([1]) # 设目标标签为1,即0.2狗对应的标签,目标标签张量y
x = torch.reshape(x, (1, 3))  # tensor([[0.1000, 0.2000, 0.3000]]),批次大小为1,分类数3,即为3分类
print(x)
print(y)
# 实例化对象
loss_cross = nn.CrossEntropyLoss()
# 计算结果
result_cross = loss_cross(x, y)
print(result_cross)

3.在神经网络模型中使用交叉熵损失函数

代码如下:

import torch
import torchvision
from torch.utils.data import DataLoader

# 准备数据集
dataset = torchvision.datasets.CIFAR10(root="dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)
# 数据集加载器
dataloader = DataLoader(dataset, batch_size=1)
"""
输入图像是3通道的32×32的,
先后经过卷积层(5×5的卷积核)、
最大池化层(2×2的池化核)、
卷积层(5×5的卷积核)、
最大池化层(2×2的池化核)、
卷积层(5×5的卷积核)、
最大池化层(2×2的池化核)、
拉直、
全连接层的处理,
最后输出的大小为10
"""
# 搭建神经网络
class Lgl(torch.nn.Module):
    def __init__(self):
        super(Lgl, self).__init__()
        self.conv1 = torch.nn.Conv2d(in_channels=3,out_channels=32,kernel_size=5,padding=2)
        self.maxpool1 = torch.nn.MaxPool2d(kernel_size=2)
        self.conv2 = torch.nn.Conv2d(in_channels=32,out_channels=32,kernel_size=5,padding=2)
        self.maxpool2 = torch.nn.MaxPool2d(kernel_size=2)
        self.conv3 = torch.nn.Conv2d(in_channels=32,out_channels=64,kernel_size=5,padding=2)
        self.maxpool3 = torch.nn.MaxPool2d(kernel_size=2)
        self.flatten = torch.nn.Flatten()
        self.linear1 = torch.nn.Linear(1024,64)
        self.linear2 = torch.nn.Linear(64, 10)

    def forward(self, x):
         x = self.conv1(x)
         x = self.maxpool1(x)
         x = self.conv2(x)
         x = self.maxpool2(x)
         x = self.conv3(x)
         x = self.maxpool3(x)
         x = self.flatten(x)
         x = self.linear1(x)
         x = self.linear2(x)
         return x
# 实例化
lgl = Lgl()
loss = torch.nn.CrossEntropyLoss()
# 对每一张图片进行CrossEntropyLoss损失函数计算
# 使用损失函数loss计算预测结果和目标标签之间的交叉熵损失
for data in dataloader:
    imgs, target = data
    out = lgl(imgs)
    result = loss(out, target)
    print(result)

上述代码解读:

导入所需的库:

torch和torchvision库用于构建和训练神经网络。
DataLoader用于创建数据加载器,用于处理训练数据的批量加载。

准备数据集:

使用torchvision提供的datasets模块加载CIFAR-10数据集。
将数据集转换为张量类型,并准备为输入训练模型的形式。

搭建神经网络模型:

定义一个继承自nn.Module的类Lgl,表示我们的模型。
在构造函数__init__中,使用nn.Conv2d定义了三个卷积层和nn.Linear定义了两个全连接层。
在forward方法中,按顺序将输入数据传递给网络的各个层,通过卷积、池化和线性变换进行特征提取和分类。

实例化模型和损失函数:

创建一个Lgl类的实例lgl作为我们的模型。
创建一个CrossEntropyLoss类的实例loss作为我们的损失函数,用于计算预测结果和目标标签之间的交叉熵损失。

遍历数据集并进行计算:

使用数据加载器dataloader遍历准备好的数据集。
对于每个batch的数据,将输入图像传递给模型lgl进行前向传播计算,得到预测结果。
使用损失函数loss计算预测结果和目标标签之间的交叉熵损失。
打印输出的损失结果。

声明:本篇文章(包括本专栏所有文章),未经许可,谢绝转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/843170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编织人工智能:机器学习发展历史与关键技术全解析

文章目录 1. 引言1.1 机器学习的定义1.2 重要性和应用场景重要性应用场景 2. 机器学习的早期历史2.1 初期理论与算法感知机决策树 2.2 早期突破支持向量机神经网络初探 3. 21世纪初期的发展3.1 集成学习方法随机森林XGBoost 3.2 深度学习的崛起卷积神经网络(CNN&…

ViLT:基于transformer模型的计算机视觉与自然语言处理多模态模型

transformer模型刚开始使用在NLP自然语言处理的机器翻译实例上,但是随着注意力机制的算法越来越火,根据transformer模型的魔改模型也越来越多,首先便是Google自己发布的VIT模型,把transformer注意力机制应用到计算机视觉任务上。那么transformer模型是否也同样适用于多模态…

模拟实现消息队列项目(系列4) -- 服务器模块(内存管理)

目录 前言 1. 创建MemoryDataCenter 2. 封装Exchange 和 Queue方法 3. 封装Binding操作 4. 封装Message操作 4.1 封装消息中心集合messageMap 4.2 封装消息与队列的关系集合queueMessageMap的操作 5. 封装未确认消息集合waitMessage的操作 6. 从硬盘中恢复数据到内存中 7. Memo…

【前端 | CSS布局】 网格布局(grid)

概述 网格布局(Grid)是最强大的 CSS 布局方案。 它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了。 上图这样的布局&am…

安装linux操作系统

安装虚拟机的步骤: 安装linux系统 之后开启虚拟机 之后重启,打开虚拟机,登录root账号

高薪通报!!230418期班平均薪资9600!!行途不晚,箭响离弦...

回头看,2023的钟表已经转了半轮,时间转眼已经过去一半,这一年我们摘下口罩,重新出发。2023年,失业者高达8700万人,应届毕业生1158万人,我们的就业环境并不乐观。 多少人干着并不如意的工作&…

安装和登录appuploader

转载:安装和登录appuploader 目录 转载:安装和登录appuploader 一. 下载安装appuploader windows启动 部分功能不可用处理 驱动安装 二. 登录appuploader 常规使用登录方法 验证码说明 使用上传专用密码登录 未支付688给apple账号登录 一. 下载…

Java重启

Java启动! 前言祖师爷高斯林老爷子冯诺依曼 注释单行注释多行注释文档注释 标识符***【硬性规则】******【软性建议】*** 关键字结尾 前言 其实我在写这篇文章的时候已经完整地学过一遍Java校招需要掌握的大部分知识了,但是在最近找实习的过程中,我发现自己对于一些只是还是模…

C语言案例 按序输出多个整数-03

难度2复杂度3 题目:输入多个整数,按从小到大的顺序输出 步骤一:定义程序的目标 编写一个C程序,随机输入整数,按照从小到大的顺序输出 步骤二:程序设计 整个C程序由三大模块组成,第一个模块使…

微信现在怎么加好友最有效?

微信作为如今当之无愧的国民 App,基本已经成为了国内用户的首选社交软件。 无论是日常交友,还是商务交流,基本都能在微信上完成。 主动加人最好的办法就是做矩阵,如果是被动加人的话方式就很多。 说说主动加人做矩阵吧。 微信目前…

基于EIoT能源物联网的工厂智能照明系统应用改造-安科瑞黄安南

【摘要】:随着物联网技术的发展,许多场所针对照明合理应用物联网照明系统,照明作为工厂的重要能耗之一,工厂的照明智能化控制,如何优化控制、提高能源的利用率,达到节约能源的目的。将互联网的技术应用到工…

谈谈网络安全

目录 1.概念 2.发展现状 3.主要问题 1.概念 网络安全是指保护计算机网络和其中的数据免受未经授权访问、损坏、窃取或破坏的过程和技术。网络安全涉及预防和检测潜在的威胁和漏洞,并采取措施保护网络的机密性、完整性和可用性。 网络安全的概念包括以下几个方面&am…

数据互通,版本管理优化图文档与BOM数据

在现代企业的产品开发过程中,图文档和BOM数据是不可或缺的关键要素。图文档记录了产品的设计和工程信息,而BOM数据则明确了产品所需物料的清单和规格。然而,由于数据的复杂性和版本变更的频繁性,图文档与BOM数据之间的协作和管理常…

不怕晒的穿戴式耳机,遮阳听歌两不误,哈氪无界V体验

近年来,气传导、骨传导等不入耳的耳机技术也逐渐成熟,然而这类很多主打舒适便携的耳机新形态,还是很难与帽子、眼镜等配件兼容,对于喜欢户外运动的人来说,遮阳帽和耳机同时佩戴总会显得特别别扭。 好在国产品牌的创造力…

Vue2源码分析-环境搭建

安装rollup 项目初始化 npm init -y安装pnpm npm i -g pnpm安装rollup以及相关插件 pnpm i rollup rollup/plugin-babel babel/core babel/preset-env --save-dev在根目录创建rollup.config.js文件,并且配置如下 import babel from "rollup/plugin-babel…

Vue2 第二十节 vue-router (四)

1.全局前置路由和后置路由 2.独享路由守卫 3.组件内路由守卫 4.路由器的两种工作模式 路由 作用:对路由进行权限控制 分类:全局守卫,独享守卫,组件内守卫 一.全局前置路由和后置路由 ① 前置路由守卫:每次路由…

【Linux操作系统】makefile入门:一个规则-两个函数-三个变量

在Linux中,makefile是一种非常重要的工具,用于自动化构建和管理项目。它可以帮助开发人员轻松地编译和链接程序,同时还可以处理依赖关系和增量构建等问题。在makefile中,我们将重点介绍makefile中的一个规则,两个函数和…

PE半透明屏是怎么制造的?工艺、材料、应用

PE半透明屏是一种新型的屏幕材料,具有半透明的特点。 它由聚乙烯(PE)材料制成,具有良好的透明度和柔韧性。PE半透明屏广泛应用于建筑、广告、展览等领域,具有很高的市场潜力。 PE半透明屏的特点之一是其半透明性。 它…

关于Java的IO流开发

IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了。那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候&a…

区块链技术助力慈善,为您的善举赋予全新力量!

我们怀揣着一颗温暖的心,秉承着公开透明的理念,带着信任与责任,倾力打造了一套区块链技术驱动的去中心化捐赠与物资分发系统,通过智能生态网络(IEN)解决捐赠不透明问题的系统,让您的善举直接温暖…