热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Pytorch之损失函数

1.torch.nn.MSELoss  均方损失函数,一般损失函数都是计算一个batch数据总的损失,而不是计算单个样本的损失。$$L(x-y)^{2}$$  这里$L,x,y$的

1. torch.nn.MSELoss

   均方损失函数,一般损失函数都是计算一个 batch 数据总的损失,而不是计算单个样本的损失。

$$L = (x - y)^{2}$$

   这里 $L, x, y$ 的维度是一样的,可以是向量或者矩阵(有多个样本组合),这里的平方是针对 Tensor 的每个元素,即 $(x-y)**2$ 或 $torch.pow(x-y, 2)$。

   函数原型如下:

"""
该函数返回的是一个 python 类对象
reduce = False,损失函数返回的是向量形式的 loss,这种情况下参数 size_average 失效。
reduce = True, 损失函数返回的是标量形式的 loss,这种情况下:
    1)当 size_average = True 时,返回 loss.mean(),即所有向量元素求和后再除以向量长度
    2)当 size_average = False 时,返回 loss.sum(),即所有向量元素只求和
默认情况下:两个参数都为 True。
"""
CLASS torch.nn.MSELoss(size_average=True, reduce=True)

   举个例子:

import torch

loss = torch.nn.MSELoss()   # 默认输出标量并求均值
input = torch.randn(3, 5, requires_grad=True)
target = torch.randn(3, 5)
output = loss(input, target)
output.backward()
print(output)

"""
tensor(2.4015, grad_fn=)
"""

 

2. torch.nn.BCELoss

   它适用于二分类问题,且神经网络的输出是一个概率分布,一般输出层的激活函数是 $Sigmod$ 函数,因为只有两类,所以输出没

   必要归一化,直接就是一个概率分布。那么这个损失函数可以用来计算目标值和预测值之间的二进制交叉熵损失函数,一般损失函

   数都是计算一个 batch 数据总的损失,而不是计算单个样本的损失。一个 batch 数据的损失为

$$L_{batch} = -w \cdot \big [\; y \ln \hat{y} + (1 - y)\ln (1 - \hat{y}) \;\big]$$

   这里 $L, y, \hat{y}$ 的维度是一样的,可以是向量或者矩阵(由多个样本组合),这里的 $\ln$ 是针对 Tensor 的每个元素。

   既然是计算两个分布(一个分布是我们用来近似的模型,另一个是真实分布)之间的交叉熵,那么每个样本对应的分布是什么?

   只考虑一个样本,那么它其实就是一个 $0-1$ 分布,即每一个 $x$,都会对应一个类别 $y$,$y$ 要么等于 $0$,要么等于 $1$。

       1)如果 $y = 0$,那么这个样本 $x$ 对应的 $0-1$ 分布(真实分布)为

             Pytorch 之损失函数

       2)如果 $y = 1$,那么这个样本 $x$ 对应的 $0-1$ 分布(真实分布)为

             Pytorch 之损失函数

 

   如果上面的内容不理解,可先去阅读下博客:KL 散度和交叉熵。

 

   注意输出标签不一定是 $0$ 和 $1$,但概率一定是 $0,1$ 且只有一项,其它项都是 $0$,如果标签比如是 $3,4$,是不能直接代入 BCELoss 的,

   因为这里标签为 $0,1$ 正好等于概率,所以才直接代入的。当输出标签为 $0,1$ 时,无论哪种情况,每个样本对应的交叉熵为:

$$L_{one} = - \big [\; y \ln \hat{y} + (1 - y)\ln (1 - \hat{y}) \;\big]$$

   函数原型如下:

"""
weight 必须和 target 的 shape 一致
reduce = False,损失函数返回的是向量形式的 loss,这种情况下参数 size_average 失效。
reduce = True, 损失函数返回的是标量形式的 loss,这种情况下:
    1)当 size_average = True 时,返回 loss.mean(),即所有向量元素求和后再除以向量长度,这种情况就是交叉熵
    2)当 size_average = False 时,返回 loss.sum(),即所有向量元素只求和,这种情况就是极大似然估计
默认情况下:weight 为 None, size_average 和 reduce 为 True。
"""
CLASS torch.nn.BCELoss(weight = None, size_average=True, reduce=True)

   举个例子:

import torch
 
S = torch.nn.Sigmoid()
loss = torch.nn.BCELoss()
input = torch.randn(3, requires_grad=True)
target = torch.empty(3).random_(2)
output = loss(S(input), target)
print(output)

"""
tensor(0.7957, grad_fn=)
"""

 

3. torch.nn.CrossEntropyLoss

   这个和 BCELoss 其实是一样的,只不过 BCELoss 算的是二类,而 CrossEntropyLoss 算的是多类,比如输出类别 $0,1,2,3,4,5,6,7,8,9$ 共 $10$

   个类别,每个样本喂给神经网络,一定只会输出一个类别。举个例子,一个输入对应的输出类别为 $3$,那么它对应的分布长成这样:

      Pytorch 之损失函数

   这个样本输出类别为 $3$,意味着 $P(y = 3) = 1$,其它概率都是 $0$,那么可以计算这个样本的交叉熵损失为:

$$L_{one} = - \big [ \; 0 \cdot \ln \hat{y}_{0} + 0 \cdot \ln \hat{y}_{1} + 0 \cdot \ln \hat{y}_{2} + 
1 \cdot \ln \hat{y}_{3} + 0 \cdot \ln \hat{y}_{4} \\
+ 0 \cdot \ln \hat{y}_{5} + 0 \cdot \ln \hat{y}_{6} + 0 \cdot \ln \hat{y}_{7} + 0 \cdot \ln \hat{y}_{8} + 0 \cdot \ln \hat{y}_{9}\; \big]$$

   当使用 CrossEntropyLoss 损失函数的时候,神经网络的输出就不用再接 $softmax$ 层了,因为这个损失函数内部会做这个归一化,同时它还会根据

   对应的输出标签 $y$ 生成 $one-hot$ 向量。如下图所示:

      Pytorch 之损失函数

   左边输入的是不带激活函数的神经网络的输出,右边输入的是该样本的标签,比如标签 $3$,那么会生成 $one-hot$ 向量 $(0,0,0,1,0,0,0,0,0,0)$。

   上面只是个示意图,并不对应。生成的 $one-hot$ 向量其实就是该样本分布的真实概率。

"""
weight(Tensor, optional) - 每个类别对应的权重,默认是值为 1 的 Tensor
size_average(bool, optional) - 默认为 True, reduce = True 时忽略该参数。
   size_average = True: 则 losses 在 minibatch 结合 weight 求平均
   size_average = False: 则 losses 在 minibatch 只求相加和
ignore_index: 不知道干啥用
reduce: 默认为 True, 为 False 则返回 loss 向量,不求和
"""
class torch.nn.CrossEntropyLoss(weight=None, size_average=True, ignore_index=-100, reduce=True)

   举个例子:

   Pytorch 之损失函数


推荐阅读
  • 1,数据组织:训练验证数据生成:pythoncreate_data.pynuscenes_data_prep--data_pathNU ... [详细]
  • Java的核心库提供了大量的现成的类供我们使用。本节我们介绍几个常用的工具类。Math顾名思义,Math类就是用来进行数学计算的,它提供了大量的静态 ... [详细]
  • 以下不是python文件读写方法的是Python 文件I/O
    Python文件IO本章只讲述所有基本的IO函数,更多函数请参考Python标准文档。打印到屏幕最简单的输出方法是用print语句,你可以给它传递 ... [详细]
  • DNNBrain:北师大团队出品,国内首款用于映射深层神经网络到大脑的统一工具箱...
    导读深度神经网络(DNN)通过端到端的深度学习策略在许多具有挑战性的任务上达到了人类水平的性能。深度学习产生了具有多层抽象层次的数据表示;然而,它没有明确地提供任何关 ... [详细]
  • 深度强化学习Policy Gradient基本实现
    全文共2543个字,2张图,预计阅读时间15分钟。基于值的强化学习算法的基本思想是根据当前的状态,计算采取每个动作的价值,然 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • Pyhotn3基础笔记(上卷)吉多范罗苏姆(GuidovanRossum)一.解释器Python的解释器如今有多个语言的实现,包括&#x ... [详细]
  • rtemsapi用户指南Elixir代表了相对较新的编程语言,面向更广泛的受众。它于2011年发布,此后一直在开发中。他的主要特征是取消功能范式 ... [详细]
  • 找出字符串中重复字符
    2019独角兽企业重金招聘Python工程师标准packagejavaBasic;importjava.util.HashMap;importjava.util.Map; ... [详细]
  • 元类print(type(abc))print(type(True))print(type(100))print(type([1,2,3]))print(type({na ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
author-avatar
多米音乐_35946826
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有