pytorch基础使用—自定义损失函数

简介: pytorch基础使用—自定义损失函数

1 模板

与定义一个模型类似,定义一个继承nn.Module的类:

  1. __init__:初始化超参数
  2. forward:定义损失的计算方式,并进行前向传播
  3. backward:反向传播(暂未遇到需要修改的情况)
import torch.nn as nn
import torch
class MyLoss(nn.Module):
  def __init__(self):
    # 超参数初始化,如
    slef.param1 = 0
  def forward(self, predict, label):  # 一般是预测值和label
    # 进行损失计算,即前向传播,如
    return torch.mean(torch.pow((predict - label), 2))  # 可以自己定义一些计算,但是所有的数学操作必须使用tensor提供的math。也可以用functional提供的一些损失计算,如交叉熵损失。

下面介绍一些损失函数:

2 损失函数

损失函数分为两类:

  1. 1. 分类损失,如0-1 loss、熵与交叉熵loss、softmax loss及其变种、KL散度、Hinge loss、Exponential loss、Logistic loss、Focal Loss。
  2. 2. 回归损失,如L1 loss、L2 loss、perceptual loss、生成对抗网络损失、GAN的基本损失、-log D trick、Wasserstein GAN、LS-GAN、Loss-sensitive-GAN。

2.1 交叉熵损失

2.1.1 原理

交叉熵主要是用来判定实际的输出与期望的输出的接近程度

582a0382b3d540678c7fd32fd5ee3c6f.png

其中p为期望输出,q为实际输出。

假设期望输出为p=[1, 1, 0],实际输出q1=[0.4, 0.3, 0.3],q2=[0.6, 0.3, 0.1]:

4afc2a996359415598e1d495788d9ba4.jpg

fa6d0c9eedf54880a1d1933be04f5a18.jpg

可以看到q2和p的交叉熵更小,代笔着q2和p更加接近。

2.1.2 公式推导

假设有N条数据,out为网络输出,p为期望输出。

对于二分类问题:

首先我们先使用sigmod函数处理网络输出,限制其范围为0-1,结果为q,代表着实际输出:

3ab7fa46ccfd44a68908baab2e6c9168.png

对于一个样本i来说,在期望输出为pi的情况下,其正负样本的概率为:

57a08991195341b0af5be0c90c46c5ea.png

假设所有样本相互独立,对应的似然函数为:

1edf75271c4f4e6fa22c5b8ad82af552.png

对似然函数取对数和相反数即为损失函数

a8aa8283f65b47d3bf487a4553e1924f.png

2.1.3 扩展

交叉熵损失也可以应用到多分类问题,只是此时我们的网络输出out是一个one-hot变量,此时我们需要将out通过softmax函数,而不是sigmod。

假设网络输出N个样本,每个样本C个类别。一个样本的输出out(维度是1xC),其第i个数经过softmax计算如下:

a7fab3c177f84168b6853c356f6e015f.png

该样本中其余数也经过这样计算。该样本的编码这样处理后所有值相加为0,然后取其中最大的一个作为。后面就与二分类问题一致了。

2.4 nn.CrossEntropyLoss

from torch.nn impiort CrossEntropyLoss  # 导入
loss = CrossEntropyLoss()  # 定义,后面去使用即可

还有一种办法是使用functional中的cross_entropy函数

2.2 Focal Loss

Focal Loss以交叉熵损失为基础,引入主要是为了解决目标检测中正负样本数量极不平衡问题

交叉熵函数如下:

dac750951d2748a39bfff2912f95a5fe.png

两个式子合并到一起为:

c9de3d195f55440e9798fd4d350a5354.png

由该函数得到的交叉熵损失函数无法解决正负样本的平衡问题。因此经过三个阶段形成了Focal Loss:

  1. 平衡交叉熵
  2. 聚焦损失

2.2.1 平衡交叉熵

一个普遍的解决正负样本的问题的办法是增加权重参数,公式为:

9286e859051042caa79d9f7ebcf28761.png

样本t中,当为正样本y=1,负样本y=0。

结合了参数的交叉熵函数为:

231fb409c7da4079a0f7fe64735dd1e8.png

2.2.2 聚焦损失

参数平衡了正负样本不均衡的问题。但是后面又发现难分样本的问题,为此,对于简单的样本增加一个小的权重,让损失函数聚焦在困难样本的训练

设置这样一个调节因子,其中

结合该调节因子后,交叉熵函数如下:

b68faa00642140f8a419ae07b2c72887.jpg

当p为1,即为易区分样本时,接近0,即降低对易区分样本的损失比例。

2.2.3 Focal Loss

假设N个样本,最终的Focal Loss由上面CE(p. y)得到:

7c8885a7f7d74d45819f2b2b39689abf.jpg

论文中提示时效果最好。

公式推导与2.1.2小结中一致

2.2.4 Code

def focal_loss(y, p, alpha=0.25, gamma=2):
    p = K.clip(y_pred, 1e-8, 1 - 1e-8)
    return - alpha * y * K.log(p) * (1 - p)**gamma - (1 - alpha) * (1 - y) * K.log(1 - p) * p**gamma

这里只是一个实现思路,配合着公式看,网络上也有通过pyotrch实现的Focal Loss。

相关文章
|
6月前
|
机器学习/深度学习 文字识别 PyTorch
PyTorch内置损失函数汇总 !!
PyTorch内置损失函数汇总 !!
93 0
|
机器学习/深度学习 数据采集 PyTorch
使用自定义 PyTorch 运算符优化深度学习数据输入管道
使用自定义 PyTorch 运算符优化深度学习数据输入管道
70 0
|
6月前
|
数据挖掘 PyTorch 算法框架/工具
人脸识别中的损失函数ArcFace及其实现过程代码(pytorch)--理解softmax损失函数及Arcface
人脸识别中的损失函数ArcFace及其实现过程代码(pytorch)--理解softmax损失函数及Arcface
514 0
|
2月前
|
机器学习/深度学习 存储 PyTorch
PyTorch自定义学习率调度器实现指南
本文将详细介绍如何通过扩展PyTorch的 ``` LRScheduler ``` 类来实现一个具有预热阶段的余弦衰减调度器。我们将分五个关键步骤来完成这个过程。
77 2
|
25天前
|
机器学习/深度学习 算法 PyTorch
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
这篇文章详细介绍了多种用于目标检测任务中的边界框回归损失函数,包括IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU和WIOU,并提供了它们的Pytorch实现代码。
124 1
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
|
2月前
|
并行计算 PyTorch 算法框架/工具
基于CUDA12.1+CUDNN8.9+PYTORCH2.3.1,实现自定义数据集训练
文章介绍了如何在CUDA 12.1、CUDNN 8.9和PyTorch 2.3.1环境下实现自定义数据集的训练,包括环境配置、预览结果和核心步骤,以及遇到问题的解决方法和参考链接。
基于CUDA12.1+CUDNN8.9+PYTORCH2.3.1,实现自定义数据集训练
|
2月前
|
机器学习/深度学习
小土堆-pytorch-神经网络-损失函数与反向传播_笔记
在使用损失函数时,关键在于匹配输入和输出形状。例如,在L1Loss中,输入形状中的N代表批量大小。以下是具体示例:对于相同形状的输入和目标张量,L1Loss默认计算差值并求平均;此外,均方误差(MSE)也是常用损失函数。实战中,损失函数用于计算模型输出与真实标签间的差距,并通过反向传播更新模型参数。
|
5月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】18. Pytorch中自定义层的几种方法:nn.Module、ParameterList和ParameterDict
【从零开始学习深度学习】18. Pytorch中自定义层的几种方法:nn.Module、ParameterList和ParameterDict
|
数据可视化 PyTorch 算法框架/工具
量化自定义PyTorch模型入门教程
在以前Pytorch只有一种量化的方法,叫做“eager mode qunatization”,在量化我们自定定义模型时经常会产生奇怪的错误,并且很难解决。但是最近,PyTorch发布了一种称为“fx-graph-mode-qunatization”的方方法。在本文中我们将研究这个fx-graph-mode-qunatization”看看它能不能让我们的量化操作更容易,更稳定。
241 0
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch中的自定义层与模块开发
【4月更文挑战第18天】PyTorch教程:通过继承`nn.Module`创建自定义层和模块。自定义层需实现`__init__`(初始化参数)和`forward`(前向传播逻辑)方法。示例代码展示了一个简单的`CustomLinear`层和包含该层及ReLU激活的`CustomModule`。自定义模块可组合多个层,如`SimpleNet`模型中使用两个`CustomModule`。这使得构建满足特定需求的复杂神经网络成为可能。