pytorch(15)损失函数
损失函数
1. 损失函数概念
损失函数:衡量模型输出与真实标签的差异
\]
\]
\]
损失函数:计算一个样本的一个差异
代价函数:计算整个样本的loss的平均值
目标函数:表示最终的一个目标,目标函数来说在有约束条件下的最小化就是损失函数(loss function)
代价函数未必是越小越好,因为很可能出现过拟合。因此为了不让代价函数达到最小,出现过拟合。于是我们就添加了Regularization的正则项L1,L2。
- 损失函数
class _Loss(Module):
def __init__(self,reduction='mean'):
super(_Loss, self).__init__()
if size_average is not None or reduce is not None:
self.reduction = _Reduction.legacy_get_string(size_average, reduce)
else:
self.reduction = reduction
分析流程:
crossentropyLoss的流程:
loss_functoin = nn.CrossEntropyLoss() #①处
先通过nn.CrossEntropyLoss构建损失函数赋给loss_function,紧接着在训练过程中通过
loss = loss_functoin(outputs, labels) #②处
进行计算其损失函数,输入神经网络模型的输出outputs的值和标签进行loss。
在①②处设置断点,step into①处时,进入loss.py,调用class CrossEntropyLoss类,继承_WeightedLoss类,也就是会继承一个带权值的Loss类。进入init的初始化类,能够看到它调用了一个父类的super(CrossEntropyLoss)的初始化类,再step into,能够看到它是一个_WeightedLoss类的init初始化,这个类继承_Loss这个基本类。再通过step into能够看到是继承的Module类,其主要是设置reduction。在这里reduction="mean"。
接下来我们在step into②处进行step into。刚刚在lossfunction处我们已经知道lossfunction是一个Module类型,所以这里输入一个outputs和labels之后就是执行了一个forward.在这里step into后的hook就比较熟悉,我们直接进入到
result = self.forward(*input, **kwargs)
再进入到step into后,进入到forward模块
def forward(self, input: Tensor, target: Tensor) -> Tensor:
return F.cross_entropy(input,target,weight=self.weight,ignore_index=self.ignore_index,reduction=self.reduction)
step into [F.cross_entropy],进入到functional.py中
if size_average is not None or reduce is not None:
reduction = _Reduction.legacy_get_string(size_average, reduce)
return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)
接下来就能够计算出loss,在这里为[loss:tensor(0.7012, grad_fn=<NllLossBackward>)]
损失函数
- nn.CrossEntropyLoss
功能:nn.LogSoftmax()[采用softmax进行归一化处理]与nn.NLLLoss()结合,进行交叉熵计算[和公式意义上的交叉熵不同之处:采用softmax进行归一化,把数据值归一到一个概率输出的模式,交叉熵损失函数常常用在分类任务当中,分类任务中通常需要计算两个输出的概率值,因为在分类任务当中我们的输出常常是以概率值为主的,所以交叉熵在这里主要是衡量两个概率分布之间的差异,所以交叉熵的值越低,表示两个概率分布越近越相似]
交叉熵=信息熵+相对熵
{自信息: }I(x)=-log[p(x)]\\
{熵(信息熵):}H(P)=E_{x\sim p}[I(x)]=-\sum^{N}_{i}P(x_i)logP(x_i)\\
{相对熵:}D_KL(P,Q)=E_{x\sim p}\Big[log \frac{P(x)}{Q(x)}\Big]\\
=E_{x\sim p}[logP(x)-logQ(x)]\\
=\sum_{i=1}^{N}P(x_i)[log P(x_i)-logQ(x_i)]\\
=\sum_{i=1}^{N}P(x_i)logP(x_i)-\sum_{i=1}^{N}P(x_i)logQ(x_i)\\
=H(P,Q)-H(P)\\
{交叉熵:}H(P,Q) = D_{KL}(P,Q)+H(P)
\]
[熵是香农从热力学方面引申的一个概念,用来描述该事情的不确定性,一个事件越不确定,它的熵就越大,例如明天下雨这件事的熵就比明天太阳升起这件事的熵要大。自信息是用来衡量单个事件的不确定性,px是事件x的概率,对概率取一个-log。熵是整个概率分布的不确定性,用来描述整个概率分布,它是自信息的一个期望。相对熵又叫KL散度,用来衡量两个分布之间的差异距离,虽然是可以计算的,但是它不是一个距离函数,距离函数是有对称性的,这里的相对熵没有对称性。从公式上来看,P是真实的分布,Q是模型输出的一个分布,我们需要用Q去拟合P的分布,所以是不具备对称性的。它是对log P(x)/Q(x)]求取期望。因此在深度学习的模型中,我们去优化交叉熵,实际上就是去优化相对熵的,训练集的P是固定的常数,所以在优化中是优化DKL(P,Q)]
在伯努利模型中,很容易发现概率为0.5的Loss值是0.69,通常意义表明模型训练坏了,当前模型不具备任何判别能力。因为它对任何的输出都是0.5,可能或者不可能。
主要参数:
- weight:各类别的loss设置权值,在公式中如下,如果我们想让第0类的loss更大点,让模型更关注第0类,我们可以把它的weight设置为1.2
- ignore_index:忽略某个类别,不计算Loss
- reduction:计算模式,可为none/sum/mean
none:逐个元素计算
sum:所有元素求和,返回标量
mean:加权平均,返回标量
nn.CrossEntropyLoss(weight=None,size_average=None,ignore_index=-100,reduce=None,reduction='mean')
交叉熵的计算公式如下:
\\H(P,Q)=\sum^{N}_{i=1}P(x_i)logQ(x_i)\\
loss(x,class)=-log\Big(\frac{exp(x[class])}{\sum_j exp(x[j])} \Big)=-x[class]+log\Big(\sum_j exp(x[j]) \Big)\\
softmax归一化=\frac{exp(x[class])}{\sum_j exp(x[j])}\\
将这一个神经元的输出值归一化到一个概率取值区间。
\]
- NLL/BCE/BCEWithLogits Loss
nn.NLLLoss
功能:实现负对数似然函数中的负号功能
主要参数:
- weight:各类别的Loss设置权值
- ignore_index:忽略某个类别
- reduction:计算模式,可为none/sum/mean
nn.NLLLoss(weight=None,size_average=None,ignore_index=-100,reduce=None,reduction='mean')
\]
nn.BCELoss
功能:二分类交叉熵
注意事项:输入值取值在[0,1]
主要参数:
- weight:各类别的Loss设置权值
- ignore_index:忽略某个类别
- reduction:计算模式,可为none/sum/mean
none-逐个元素计算
sum-所有元素求和,返回标量
mean-加权平均,返回标量
nn.BCELoss(weight=None,size_average=None,reduce=None,reduction='mean')
\]
nn.BCEWithLogitsLoss
功能:结合Sigmoid与二分类交叉熵
注意事项:网络最后不加sigmoid函数
主要参数:
- pos_weight:正样本的权值
- weight:各类别的Loss设置权值
- ignore_index:忽略某个类别
- reduction:计算模式:none,sum,mean
代码:
nn.BCEWithLogitsLoss(weight=None,size_average=None,reduce=None,reduction='mean',pos_weight=None)
\]
pytorch(15)损失函数的更多相关文章
- pytorch常用损失函数
损失函数的基本用法: criterion = LossCriterion() #构造函数有自己的参数 loss = criterion(x, y) #调用标准时也有参数 得到的loss结果已经对min ...
- 库、教程、论文实现,这是一份超全的PyTorch资源列表(Github 2.2K星)
项目地址:https://github.com/bharathgs/Awesome-pytorch-list 列表结构: NLP 与语音处理 计算机视觉 概率/生成库 其他库 教程与示例 论文实现 P ...
- [pytorch]pytorch loss function 总结
原文: http://www.voidcn.com/article/p-rtzqgqkz-bpg.html 最近看了下 PyTorch 的损失函数文档,整理了下自己的理解,重新格式化了公式如下,以便以 ...
- python常用20库
python核心库和统计 简述 1. Requests.最着名的http库由kenneth reitz编写.这是每个python开发人员必备的. 2. Scrapy.如果您参与webscraping, ...
- Jetson Nano系列教程0:初识Jetson Nano
关于Jetson Nano Developer Kit Jetson nano搭载四核Cortex-A57 MPCore 处理器,采用128 核 Maxwell™ GPU.支持JetPack SDK ...
- PyTorch的十七个损失函数
本文截取自<PyTorch 模型训练实用教程>,获取全文pdf请点击: tensor-yu/PyTorch_Tutorialgithub.com 版权声明:本文为博主原创文章,转载请附上 ...
- 【小白学PyTorch】15 TF2实现一个简单的服装分类任务
[新闻]:机器学习炼丹术的粉丝的人工智能交流群已经建立,目前有目标检测.医学图像.时间序列等多个目标为技术学习的分群和水群唠嗑的总群,欢迎大家加炼丹兄为好友,加入炼丹协会.微信:cyx64501661 ...
- pytorch 损失函数
pytorch损失函数: http://blog.csdn.net/zhangxb35/article/details/72464152?utm_source=itdadao&utm_medi ...
- Pytorch的19种损失函数
基本用法 12 criterion = LossCriterion() loss = criterion(x, y) # 调用标准时也有参数 损失函数 L1范数损失:L1Loss 计算 output ...
随机推荐
- 【uva 1442】Cav(算法效率)
题意:有一个由N个片段构成宽度的洞穴,已知洞顶 si 和洞底 pi 的高度,要求储存尽量多的燃料. 解法:O(n),分别从1到N和从N到1扫一遍,调整每个片段合法的最大高度,求出答案. 1 #incl ...
- Codeforces Round #660 (Div. 2) Captain Flint and Treasure 拓扑排序(按照出度、入读两边拓扑排序)
题目链接:Captain Flint and Treasure 题意: 一种操作为 选一个下标 使得ans+=a[i] 且 把a[b[i]]+a[i] 要求每个下标都进行一种这样的操作,问怎么样的 ...
- python的scrapy框架的使用 和xpath的使用 && scrapy中request和response的函数参数 && parse()函数运行机制
这篇博客主要是讲一下scrapy框架的使用,对于糗事百科爬取数据并未去专门处理 最后爬取的数据保存为json格式 一.先说一下pyharm怎么去看一些函数在源码中的代码实现 按着ctrl然后点击函数就 ...
- .NET 5学习笔记(10)——Entity Framework Core之切换SQLServer和SQLite
上一篇我们梳理了CodeFist的一般流程,本篇我们讨论如何在一套代码中,支持SQL Server和SQLite的切换.同时从本篇开始,我们从.NET Core 3.1 迁移到.NET 5.相信.NE ...
- HDU 5608 function(莫比乌斯反演 + 杜教筛)题解
题意: 已知\(N^2-3N+2=\sum_{d|N}f(d)\),求\(\sum_{i=1}^nf(i) \mod 1e9+7\),\(n\leq1e9\) 思路: 杜教筛基础题? 很显然这里已经设 ...
- 可重入锁ReentrantLock解析
说到可重入锁,先从AQS的ConditionObject说起,AQS的内部类ConditionObject是构建显示锁条件队列的基础.之前AQS的解析没有说这个内部类,这里和ReentrantLock ...
- Vue & Sentry
Vue & Sentry config.errorHandler https://cn.vuejs.org/v2/api/#errorHandler Vue.config.errorHandl ...
- nodemon all in one
nodemon all in one https://nodemon.io/ https://github.com/remy/nodemon#nodemon https://www.npmjs.com ...
- Web Performance API
Web Performance API 性能监测/性能优化 https://developer.mozilla.org/en-US/docs/Web/API/Performance https://d ...
- 如何取消 Google Cloud Platform 试用 & 关闭 GCP 帐号 & 删除信用卡 & 取消订阅
如何取消 Google Cloud Platform 试用 & 关闭 GCP 帐号 & 删除信用卡 & 取消订阅 关闭您的 Google Cloud Platform 帐号 s ...