深度学习(十三)——损失函数与反向传播

一、损失函数:Loss Function

官网文档:torch.nn — PyTorch 2.0 documentation

1. Loss Function的作用

  • 每次训练神经网络的时候都会有一个目标,也会有一个输出。目标和输出之间的误差,就是用\(Loss\) \(Function\)来衡量的。所以,误差\(Loss\)是越小越好的。

  • 此外,我们可以根据误差\(Loss\),指导输出\(output\)接近目标\(target\)。即我们可以以\(Loss\)为依据,不断训练神经网络,优化神经网络中各个模块,从而优化\(output\)。

\(Loss\) \(Function\)的作用:

(1)计算实际输出和目标之间的差距

(2)为我们更新输出提供一定的依据,这个提供依据的过程也叫反向传播

2. Loss Function中的函数介绍

(1)nn.L1Loss

计算\(MAE\) (mean absolute error),即假设输入为\(x_i\),目标为\(y_i\),特征数量为\(n\)。在默认情况下,\(nn.L1Loss\)通过下面公式计算误差:

\[\frac{\sum^{n}_{i=1}{|x_i-y_i|}}{n} \]

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

参数说明:

  • reduction:默认为 ‘mean’ ,可选_mean_和_sum_。

    • reduction='mean'时,计算误差采用公式:

      \[\frac{\sum^{n}_{i=1}{|x_i-y_i|}}{n} \]

    • reduction='sum'时,计算误差采用公式:

      \[\sum^{n}_{i=1}{|x_i-y_i|} \]

  • 需要注意的是,计算的数据必须为浮点数

代码栗子:

import torch
from torch.nn import L1Lossinput=torch.tensor([1,2,3],dtype=torch.float32)
target=torch.tensor([1,2,5],dtype=torch.float32)input=torch.reshape(input,(1,1,1,3))
target=torch.reshape(target,(1,1,1,3))loss1=L1Loss()  #reduction='mean'
loss2=L1Loss(reduction='sum')  #reduction='mean'
result1=loss1(input,target)
result2=loss2(input,target)print(result1,result2)

(2)nn.MSELoss

计算\(MSE\) (mean squared error),即假设输入为\(x_i\),目标为\(y_i\),特征数量为\(n\)。在默认情况下,\(nn.MSELoss\)通过下面公式计算误差:

\[\frac{\sum{n}_{i=1}{(x_i-y_i)2}}{n} \]

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

参数说明:

  • reduction:默认为 ‘mean’ ,可选_mean_和_sum_。

    • reduction='mean'时,计算误差采用公式:

      \[\frac{\sum{n}_{i=1}{(x_i-y_i)2}}{n} \]

    • reduction='sum'时,计算误差采用公式:

      \[\sum{n}_{i=1}{(x_i-y_i)2} \]

代码栗子:

import torch
from torch.nn import L1Loss,MSELossinput=torch.tensor([1,2,3],dtype=torch.float32)
target=torch.tensor([1,2,5],dtype=torch.float32)input=torch.reshape(input,(1,1,1,3))
target=torch.reshape(target,(1,1,1,3))loss_mse1=MSELoss()  #reduction='mean'
loss_mse2=MSELoss(reduction='sum')  #reduction='mean'
result_mse1=loss_mse1(input,target)
result_mse2=loss_mse2(input,target)print(result_mse1,result_mse2)

(3)nn.CrossEntropyLoss(交叉熵)

当训练一个分类问题的时候,假设这个分类问题有\(C\)个类别,那么有:

\[loss(x,class)=-log(\frac{exp(x[class])}{\sum_{j}exp(x[j])})=-x[class]+log(\sum_{j}exp(x[j]) \]

*注意:其中的\(log\)在数学中表示的是\(ln\),即以10为底的对数函数

举个栗子:

  • 我们对包含了_人、狗、猫_的图片进行分类,其标签的索引分别为_0、1、2_。这时候将一张_狗_的图片输入神经网络,即目标(\(target\))为\(1\)(对应_狗_的标签索引)。输出结果为\([0.1,0.2,0.3]\),该列表中的数字分别代表分类标签对应的概率。

  • 根据上述分类结果,图片为_人_的概率更大,即\(0.3\)。对于该分类的\(Loss\) \(Function\),我们可以通过交叉熵去计算,即:

    \[x=[0.1,0.2,0.3];x[class]=x[1]=0.2 \]

    \[loss(x,class)=-0.2+log[exp(0.1)+exp(0.2)+exp(0.3)] \]

那么如何验证这个公式的合理性呢?根据上面的栗子,分类结果越准确,\(Loss\)应该越小。这条公式由两个部分组成:

  • \(log(\sum_{j}exp(x[j])\):主要作用是控制或限制预测结果的概率分布。比如说,预测出来的_人、狗、猫_的概率均为_0.9_,每个结果概率都很高,这显然是不合理的。此时\(log(\sum_{j}exp(x[j])\)的值会变大,误差\(loss(x,class)\)也会随之变大。同时该指标也可以作为分类器性能评判标准。

  • \(-x[class]\):在已知图片类别的情况下,预测出来对应该类别的概率\(x[class]\)越高,其预测结果误差越小。

参数说明:

  • Input: \((N,C)\),其中\(N\)代表_batch_size_,\(C\)代表分类的数量(或者叫标签数量),即数据要分成几类(或有几个标签)。

  • Target: \((N)\),对于每个数据:\(0\leq{target[i]}\leq{C-1}\)

代码栗子:

  • 仍然以上面图片分类栗子的结果为例,编写程序
import torch
from torch.nn import L1Loss,MSELoss,CrossEntropyLossx=torch.tensor([0.1,0.2,0.3])
y=torch.tensor([1])x=torch.reshape(x,(1,3))loss_cross=CrossEntropyLoss()
result_cross=loss_cross(x,y)
print(result_cross)
  • 直接用_CIFAR 10_数据进行实战分类:
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoaderdataset=torchvision.datasets.CIFAR10("./dataset",train=False,download=True,transform=torchvision.transforms.ToTensor())
dataloder=DataLoader(dataset,batch_size=1)class Demo(nn.Module):def __init__(self):super(Demo,self).__init__()self.model1=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.model1(x)return xdemo=Demo()
loss=nn.CrossEntropyLoss()
for data in dataloder:imgs,targets=dataoutput=demo(imgs)# print(output)#[Run] 一共输出10个数据,分别代表该图像为各个标签的概率.具体如下:# tensor([[-0.0151, -0.0990, 0.0908, 0.0354, 0.0731, -0.0313, -0.0329, 0.1006,#          -0.0953, 0.0449]], grad_fn= < AddmmBackward0 >)# print(targets)#[Run] 输出该图像真实的标签,具体如下:# tensor([7])result_loss=loss(output,targets)print(result_loss)

二、反向传播

如何根据\(Loss\) \(Function\)为更新神经网络数据提供依据?

  • 对于每个卷积核当中的参数,设置一个\(grad\)(梯度)。

  • 当我们进行反向传播的时候,对每一个节点的参数都会求出一个对应的梯度。之后我们根据梯度对每一个参数进行优化,最终达到降低\(Loss\)的一个目的。比较典型的一个方法——梯度下降法

代码举例:

  • 在上面的代码for循环的最后,加上:
result_loss.backward()
  • 上面就是反向传播的使用方法,它的主要作用是计算一个\(grad\)。使用debug功能并删掉上面这行代码,会发现单纯由result_loss=loss(output,targets)计算出来的结果,是没有\(grad\)这个参数的。

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

五、面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。
在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

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

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

相关文章

UniAudio 1.5:大型语言模型(LLMs)驱动的音频编解码器

大型语言模型&#xff08;LLMs&#xff09;在文本理解和生成方面展示了卓越的能力&#xff0c;但它们不能直接应用于跨模态任务&#xff0c;除非进行微调。本文提出了一种跨模态上下文学习方法&#xff0c;使未进行进一步训练的LLMs能够在少量示例的情况下&#xff0c;无需任何…

【吊打面试官系列-Mysql面试题】Myql 中的事务回滚机制概述 ?

大家好&#xff0c;我是锋哥。今天分享关于 【Myql 中的事务回滚机制概述 ?】面试题&#xff0c;希望对大家有帮助&#xff1b; Myql 中的事务回滚机制概述 ? 事务是用户定义的一个数据库操作序列&#xff0c;这些操作要么全做要么全不做&#xff0c;是一个不可分割的工作单位…

CSS3基本语法

文章目录 一、CSS引入方式二、选择器1、标签选择器2、类选择器3、id选择器4、通配符选择器 三、字体操作1、字体大小2、字体粗细3、字体样式&#xff08;是否倾斜&#xff09;4、字体修改常见字体系列 修改字体系列语法 四、文本操作1、文本缩进2、文本水平对齐方式3、文本修饰…

进阶篇05——存储过程、存储函数、触发器

存储过程 简介 基本语法 创建和调用 -- 创建名为p1的存储过程&#xff0c;小括号里可以跟参数 -- 存储过程个人觉得就是SQL里的函数 create procedure p1() begin-- begin 和 end 之间是封装的SQL语句-- 可以是一条SQL也可以是多条SQLselect * from student; end;-- 调用存储…

c++中string的用法

STL的简介 一.什么是STL二.STL的六大组件2.1仿函数2.2空间配置器2.3 算法2.4 迭代器2.5容器2.6配置器 三.string类3.1string类3.2string类的常用接口说明代码示例运行结果 3.3string类对象的容量操作代码示例sizelengthcapcityempty resizereverse 3.4string类对象的访问及遍历…

今年618各云厂商的香港服务器优惠活动汇总

又到了一年618年中钜惠活动时间&#xff0c;2024年各大云服务器厂商都有哪些活动呢&#xff1f;有哪些活动包括香港服务器呢&#xff1f;带着这些问题&#xff0c;小编给大家一一讲解各大知名厂商的618活动有哪些值得关注的地方&#xff0c;如果对你有帮助&#xff0c;欢迎点赞…

2024年6月19日 (周三) 叶子游戏新闻

超市播音系统: 定时播放不同音乐 强制卸载软件: 一款强制卸载软件 人气漫改《忍者杀手》动作游戏7月24日登陆Switch角川游戏日前宣布&#xff0c;旗下人气漫改动作游戏《忍者杀手&#xff1a;火烧新琦玉》将于7月24日登陆Switch&#xff0c;本作已经上架Steam&#xff0c;感兴趣…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 部门组队编程(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

亚特全球链锯文化推广大使活动盛大启航

&#xff08;本台记者报&#xff09;链锯&#xff0c;这一象征着力量与技艺的工具&#xff0c;自诞生以来便见证了人类工业文明的进步。从最初的简易链锯到如今的多功能锂电链锯&#xff0c;彰显了人类对于技艺与科技的追求&#xff0c;其演变历程不仅映射出人类科技的巨大飞跃…

《软件定义安全》之七:SDN安全案例

第7章 SDN安全案例 1.DDoS缓解 1.1 Radware DefenseFlow/Defense4All Radware在开源的SDN控制器平台OpenDaylight&#xff08;ODL&#xff09;上集成了一套抗DDoS的模块和应用&#xff0c;称为Defense4ALL。其架构如下图&#xff0c;主要有两部分&#xff1a;控制器中的安全…

【Pytorch】一文向您详细介绍 model.eval() 的作用和用法

【Pytorch】一文向您详细介绍 model.eval() 的作用和用法 下滑查看解决方法 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕…

数据结构之探索“队列”的奥秘

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 队列有关概念 队列的使用 队列模拟实现 循环队列的模拟实现 622. 设计循环队列 双端队…

C++ 84 之 文件读写

#include <iostream> #include <cstring> #include <string> using namespace std; #include <fstream> // 文件流的头文件int main() {// 写入: 文件内容// (文件位置&#xff0c; 如果这个不存在&#xff0c; 就新建一个)// 写法1&#xff1a; of…

深度学习项目十六:根据训练好的权重文件推理图片--YOLO系列

文章目录 根据训练好的权重文件推理图片--YOLO系列一、自己构建YOLOv5推理代码1.1 对数据集进行模型训练1.2 对数据集进行模型推理检测1.3 自己编写推理函数1.3.1 针对单张进行推理1.3.2 针对文件夹下的图片进行推理二、自己构建YOLOv8推理代码2.1 对数据集进行模型训练2.2 对数…

安装pytorch环境

安装&#xff1a;Anaconda3 通过命令行查显卡nvidia-smi 打开Anacanda prompt 新建 conda create -n pytorch python3.6 在Previous PyTorch Versions | PyTorch选择1.70&#xff0c;安装成功&#xff0c;但torch.cuda.is_available 返回false conda install pytorch1.7.0…

报表工具数据源的取数处理方式大对比

根据报表的需求&#xff0c;很多报表中的指标数据需要进行预处理&#xff0c;以满足快速抽取和展示的需要。对于帆软报表类似的产品&#xff0c;一般通过建立视图、合并数据表&#xff0c;形成直接应用于模板设计的数据集&#xff0c;报表直接和数据集进行交互、关联。当用户发…

Antd - 上传图片 裁剪图片

目录 本地上传方法【input type"file"】&#xff1a;upload组件【antd】默认接口上传&#xff1a;自定义接口上传&#xff1a;【取消默认上传接口】antd的upload组件beforeUpload还有个比较坑的地方 upload结合裁剪1、antd官方裁剪组件&#xff1a;![在这里插入图片描…

Vue - 第3天

文章目录 一、Vue生命周期二、Vue生命周期钩子三、工程化开发和脚手架1. 开发Vue的两种方式2. 脚手架Vue CLI基本介绍&#xff1a;好处&#xff1a;使用步骤&#xff1a; 四、项目目录介绍和运行流程1. 项目目录介绍2. 运行流程 五、组件化开发六、根组件 App.vue1. 根组件介绍…

python学习笔记-08

面向对象基础(OOP)-上 1. 面向对象概述 面向过程&#xff1a;根据业务逻辑从上到下写代码 函数式&#xff1a;将某功能代码封装到函数中&#xff0c;日后便无需重复编写&#xff0c;仅调用函数即可 面向对象(object oriented programming)&#xff1a;将数据与函数绑定到一起…

微信小程序毕业设计-电影院订票选座系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…