【深度学习所有损失函数】在 NumPy、TensorFlow 和 PyTorch 中实现(2/2)

 一、说明

在本文中,讨论了深度学习中使用的所有常见损失函数,并在NumPy,PyTorch和TensorFlow中实现了它们。

(二-五)见

六、稀疏分类交叉熵损失

        稀疏分类交叉熵损失类似于分类交叉熵损失,但在真实标签作为整数而不是独热编码提供时使用。它通常用作多类分类问题中的损失函数。

稀疏分类交叉熵损失的公式为:

L = -1/N * sum(log(Y_hat_i))

        其中 是每个样本的真实类标签的预测概率,是样本数。Y_hat_iiN

        换句话说,该公式计算每个样本的真实类标签的预测概率的负对数,然后对所有样本的这些值求平均值。

        与对真实标签使用独热编码的分类交叉熵损失不同,稀疏分类交叉熵损失直接使用整数标签。每个样本的真实标签表示为 0 到 之间的单个整数值,其中 是类的数量。iC-1C

6.1 在 NumPy 中的实现

import numpy as npdef sparse_categorical_crossentropy(y_true, y_pred):# convert true labels to one-hot encodingy_true_onehot = np.zeros_like(y_pred)y_true_onehot[np.arange(len(y_true)), y_true] = 1# calculate lossloss = -np.mean(np.sum(y_true_onehot * np.log(y_pred), axis=-1))return loss

        在此实现中, 是整数标签数组,是每个样本的预测概率数组。该函数首先使用 NumPy 的高级索引功能将真实标签转换为独热编码格式,以创建一个形状数组,其中是样本数和类数,每行对应于单个样本的真实标签分布。y_truey_pred(N, C)NC

然后,该函数使用上一个答案中描述的公式计算损失:。这是使用 NumPy 的广播实现的,其中创建一个形状数组,其中每个元素表示 和 中相应元素的乘积。然后,该函数用于对维度求和,并用于对维度求平均值。-1/N * sum(log(Y_hat_i))y_true_onehot * np.log(y_pred)(N, C)y_true_onehotnp.log(y_pred)sumCmeanN

下面是如何使用该函数的示例:

# define true labels as integers and predicted probabilities as an array
y_true = np.array([1, 2, 0])
y_pred = np.array([[0.1, 0.8, 0.1], [0.3, 0.2, 0.5], [0.4, 0.3, 0.3]])# calculate the loss
loss = sparse_categorical_crossentropy(y_true, y_pred)# print the loss
print(loss)

        这将输出给定输入的稀疏分类交叉熵损失的值。

6.2 TensorFlow 中的实现

import tensorflow as tfdef sparse_categorical_crossentropy(y_true, y_pred):loss = tf.keras.losses.sparse_categorical_crossentropy(y_true, y_pred, from_logits=False)return loss# define true labels as integers and predicted probabilities as a tensor
y_true = tf.constant([1, 2, 0])
y_pred = tf.constant([[0.1, 0.8, 0.1], [0.3, 0.2, 0.5], [0.4, 0.3, 0.3]])# calculate the loss
loss = sparse_categorical_crossentropy(y_true, y_pred)# print the loss
print(loss.numpy())

在此实现中, 是整数标签数组,是每个样本的预测概率数组。该函数使用 TensorFlow 提供的函数来计算损失。设置该参数以确保 表示概率而不是对数值。y_truey_predtf.keras.losses.sparse_categorical_crossentropyfrom_logitsFalsey_pred

6.3 在 PyTorch 中的实现

import torch.nn.functional as F
import torchdef sparse_categorical_crossentropy(y_true, y_pred):loss = F.cross_entropy(y_pred, y_true)return loss# define true labels as integers and predicted logits as a tensor
y_true = torch.tensor([1, 2, 0])
y_pred = torch.tensor([[0.1, 0.8, 0.1], [0.3, 0.2, 0.5], [0.4, 0.3, 0.3]])# calculate the loss
loss = sparse_categorical_crossentropy(y_true, y_pred)# print the loss
print(loss.item())

        在此实现中, 是一个整数标签数组,并且是每个样本的预测对数数组。该函数使用 PyTorch 的函数来计算损失。张量应该具有形状,其中是样本的数量,是类的数量。y_truey_predF.cross_entropyy_pred(N, C)NC

七、骰子损失

        骰子损失,也称为索伦森-骰子系数或 F1 分数,是图像分割任务中使用的损失函数,用于测量预测分割与地面实况之间的重叠。骰子损失范围从 0 到 1,其中 0 表示没有重叠,1 表示完全重叠。

骰子损失定义为:

Dice Loss = 1 - (2 * intersection + smooth) / (sum of squares of prediction + sum of squares of ground truth + smooth)

        其中 是预测和地面真实掩码的元素乘积,是一个平滑常数(通常是一个较小的值,例如 1e-5),以防止除以零,并且总和将覆盖掩码的所有元素。intersectionsmooth

        骰子损失可以在各种深度学习框架中实现,如TensorFlow,PyTorch和NumPy。该实现涉及使用框架中可用的逐元素乘积和求和运算计算交集和平方和。

7.1 在 NumPy 中的实现

import numpy as npdef dice_loss(y_true, y_pred, smooth=1e-5):intersection = np.sum(y_true * y_pred, axis=(1,2,3))sum_of_squares_pred = np.sum(np.square(y_pred), axis=(1,2,3))sum_of_squares_true = np.sum(np.square(y_true), axis=(1,2,3))dice = 1 - (2 * intersection + smooth) / (sum_of_squares_pred + sum_of_squares_true + smooth)return dice

        在此实现中,分别是基本事实和预测掩码。该参数用于防止被零除。和函数分别用于计算交集和平方和。最后,使用上一个答案中描述的公式计算骰子损失。y_truey_predsmoothsumsquare

        请注意,此实现假定 和 是具有维度的 4D 数组。如果您的掩码具有不同的形状,则可能需要相应地修改实现。y_truey_pred(batch_size, height, width, num_classes)

7.2 TensorFlow 中的实现

import tensorflow as tfdef dice_loss(y_true, y_pred, smooth=1e-5):intersection = tf.reduce_sum(y_true * y_pred, axis=(1,2,3))sum_of_squares_pred = tf.reduce_sum(tf.square(y_pred), axis=(1,2,3))sum_of_squares_true = tf.reduce_sum(tf.square(y_true), axis=(1,2,3))dice = 1 - (2 * intersection + smooth) / (sum_of_squares_pred + sum_of_squares_true + smooth)return dice

        在此实现中,和 是 TensorFlow 张量分别表示地面真相和预测掩码。该参数用于防止被零除。和函数分别用于计算交集和平方和。最后,使用上一个答案中描述的公式计算骰子损失。y_truey_predsmoothreduce_sumsquare

请注意,此实现假定 和 是具有维度的 4D 张量。如果您的掩码具有不同的形状,则可能需要相应地修改实现。y_truey_pred(batch_size, height, width, num_classes)

7.3 在 PyTorch 中的实现

import torchdef dice_loss(y_true, y_pred, smooth=1e-5):intersection = torch.sum(y_true * y_pred, dim=(1,2,3))sum_of_squares_pred = torch.sum(torch.square(y_pred), dim=(1,2,3))sum_of_squares_true = torch.sum(torch.square(y_true), dim=(1,2,3))dice = 1 - (2 * intersection + smooth) / (sum_of_squares_pred + sum_of_squares_true + smooth)return dice

        在此实现中,和 是 PyTorch 张量分别表示基本事实和预测掩码。该参数用于防止被零除。和函数分别用于计算交集和平方和。最后,使用上一个答案中描述的公式计算骰子损失。y_truey_predsmoothsumsquare

请注意,此实现假定 和 是具有维度的 4D 张量。如果您的掩码具有不同的形状,则可能需要相应地修改实现。y_truey_pred(batch_size, num_classes, height, width)

八、KL散度损失

        KL(Kullback-Leibler)散度损失是两个概率分布彼此差异程度的度量。在机器学习的上下文中,它通常用作损失函数来训练从给定分布生成新样本的模型。

        两个概率分布 p 和 q 之间的 KL 散度定义为:

        KL(p||q) = sum(p(x) * log(p(x) / q(x)))

        在机器学习的上下文中,p 表示真实分布,q 表示预测分布。KL 散度损失衡量预测分布与真实分布的匹配程度。

        KL 散度损失可用于各种任务,例如图像生成、文本生成和强化学习。但是,由于它具有非凸形式,因此可能很难优化。

        在实践中,KL散度损失通常与其他损失函数(如交叉熵损失)结合使用。通过将KL散度损失添加到交叉熵损失中,鼓励模型生成不仅与目标分布匹配,而且与训练数据具有相似分布的样本。

8.1 在 NumPy 中的实现

import numpy as npdef kl_divergence_loss(p, q):return np.sum(p * np.log(p / q))

在此实现中,和 是分别表示真实分布和预测分布的 numpy 数组。KL 背离损失使用上述公式计算。pq

请注意,此实现假定并具有相同的形状。如果它们具有不同的形状,则可能需要相应地修改实现。pq

8.2 TensorFlow 中的实现

   tf.keras.losses.KLDivergence()是 TensorFlow 中的一个内置函数,用于计算两个概率分布之间的 KL 背离损失。它可以用作各种机器学习任务中的损失函数,例如图像生成、文本生成和强化学习。

        下面是一个用法示例:tf.keras.losses.KLDivergence()

import tensorflow as tf# define true distribution and predicted distribution
p = tf.constant([0.2, 0.3, 0.5])
q = tf.constant([0.4, 0.3, 0.3])# compute KL divergence loss
kl_loss = tf.keras.losses.KLDivergence()(p, q)print(kl_loss.numpy())

        在此示例中,和 是 TensorFlow 张量分别表示真实分布和预测分布。该函数用于计算 和 之间的 KL 散度损失。结果是一个表示损失值的标量张量。pqtf.keras.losses.KLDivergence()pq

        请注意,通过将 和 具有不同形状的情况广播到通用形状,自动处理这些情况。此外,您还可以通过设置函数的参数来调整 KL 散度损失相对于模型中其他损失的权重,该参数控制损失的聚合方式。tf.keras.losses.KLDivergence()pqreduction

8.3 在 PyTorch 中的实现

        在 PyTorch 中,KL 散度损失可以使用模块计算。下面是一个示例实现:torch.nn.KLDivLoss

import torchdef kl_divergence_loss(p, q):criterion = torch.nn.KLDivLoss(reduction='batchmean')loss = criterion(torch.log(p), q)return lossIn this implementation, p and q are PyTorch tensors representing the true distribution and predicted distribution, respectively. The torch.nn.KLDivLoss module is used to compute the KL divergence loss between p and q. The reduction parameter is set to 'batchmean' to compute the mean loss over the batch.

        请注意,和 应该是概率,沿最后一个维度的总和为 1。该函数用于在将 的对数传递给模块之前获取对数。这是因为模块期望输入是对数概率。pqtorch.logptorch.nn.KLDivLoss

九、平均绝对误差 (MAE) 损耗 / L1 损耗

        L1 损失,也称为平均绝对误差 (MAE) 损失,是深度学习中用于回归任务的常见损失函数。它测量目标变量的预测值和真实值之间的绝对差异。

        L1损失的公式为:

        L1 LOSS = 1/n * Σ|y_pred — y_true|

        其中 n 是样本数,y_pred 是预测值,y_true 是真实值。

        简单来说,L1 损失是预测值和真实值之间绝对差值的平均值。它对异常值的敏感度低于均方误差 (MSE) 损失,因此对于可能受异常值影响的模型来说,它是一个不错的选择。

9.1 在 Numpy 中的实现

import numpy as npdef l1_loss(y_pred, y_true):loss = np.mean(np.abs(y_pred - y_true))return loss

L1 损失的 NumPy 实现与公式非常相似,其中您从真实值中减去预测值并取绝对值。然后,取所有样本中这些绝对差异的平均值,以获得平均 L1 损失。

9.2 TensorFlow 中的实现

import tensorflow as tfdef l1_loss(y_pred, y_true):loss = tf.reduce_mean(tf.abs(y_pred - y_true))return loss

在 TensorFlow 中,您可以使用该函数计算所有样本中预测值和真实值之间的绝对差值的平均值。tf.reduce_mean()

9.3 在 PyTorch 中的实现

import torchdef l1_loss(y_pred, y_true):loss = torch.mean(torch.abs(y_pred - y_true))return loss

在 PyTorch 中,您可以使用该函数计算所有样本中预测值和真实值之间的绝对差值的平均值。torch.mean()

十、Huber 胡贝尔损失

        Huber 损失是回归任务中使用的损失函数,它对异常值的敏感度低于均方误差 (MSE) 损失。它被定义为MSE损失和平均绝对误差(MAE)损失的组合,其中损失函数是MSE表示小误差,MAE表示较大误差。这使得Huber损失比MSE损失对异常值更稳健。

        Huber 损失函数定义如下:

L(y_pred, y_true) = 1/n * sum(0.5 * (y_pred - y_true)^2)   if |y_pred - y_true| <= delta1/n * sum(delta * |y_pred - y_true| - 0.5 * delta^2)   otherwise

        其中 是样本数,是预测值,是真实值,并且是确定在 MSE 和 MAE 损失之间切换的阈值的超参数。ny_predy_truedelta

        当 ,损失函数是 MSE 损失。当 时,损失函数是斜率为 的 MAE 损失。|y_pred - y_true| <= delta|y_pred - y_true| > deltadelta

        在实践中,通常设置为平衡 MSE 和 MAE 损耗的值,例如 。delta1.0

10.1 在 Numpy 中的实现

import numpy as npdef huber_loss(y_pred, y_true, delta=1.0):error = y_pred - y_trueabs_error = np.abs(error)quadratic = np.minimum(abs_error, delta)linear = (abs_error - quadratic)return np.mean(0.5 * quadratic ** 2 + delta * linear)

        此函数将预测值、真值和超参数作为输入,并返回 Huber 损失。y_predy_truedelta

        该函数首先计算预测值和真值之间的绝对误差,然后根据超参数将误差拆分为两个分量。二次分量是 时的 MSE 损耗,线性分量是 时的 MAE 损耗。最后,该函数返回所有样本的平均Huber损失。deltaabs_error <= deltaabs_error > delta

        您可以在基于 numpy 的回归任务中使用此函数,方法是使用预测值和真实值以及所需值调用它。delta

10.2 TensorFlow 中的实现

import tensorflow as tfdef huber_loss(y_pred, y_true, delta=1.0):error = y_pred - y_trueabs_error = tf.abs(error)quadratic = tf.minimum(abs_error, delta)linear = (abs_error - quadratic)return tf.reduce_mean(0.5 * quadratic ** 2 + delta * linear)

此函数将预测值、真值和超参数作为输入,并返回 Huber 损失。y_predy_truedelta

该函数首先使用该函数计算预测值和真值之间的绝对误差,然后使用 and 运算符根据超参数将误差拆分为两个分量。二次分量是 时的 MSE 损耗,线性分量是 时的 MAE 损耗。最后,该函数使用该函数返回所有样本的平均Huber损失。tf.absdeltatf.minimum-abs_error <= deltaabs_error > deltatf.reduce_mean

您可以在基于 TensorFlow 的回归任务中使用此函数,方法是使用预测值和真实值以及所需值调用它。delta

10.3 在 PyTorch 中的实现

import torch.nn.functional as Fdef huber_loss(y_pred, y_true, delta=1.0):error = y_pred - y_trueabs_error = torch.abs(error)quadratic = torch.min(abs_error, delta)linear = (abs_error - quadratic)return 0.5 * quadratic ** 2 + delta * linear

        此函数将预测值、真值和超参数作为输入,并返回 Huber 损失。y_predy_truedelta

        该函数首先使用该函数计算预测值和真值之间的绝对误差,然后使用 and 运算符根据超参数将误差拆分为两个分量。二次分量是 时的 MSE 损耗,线性分量是 时的 MAE 损耗。最后,该函数使用公式返回 Huber 损失。torch.absdeltatorch.min-abs_error <= deltaabs_error > delta0.5 * quadratic ** 2 + delta * linear

        您可以在基于 PyTorch 的回归任务中使用此函数,方法是使用预测值和真实值以及所需值调用它。delta

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

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

相关文章

Python pycparser(c文件解析)模块使用教程

文章目录 安装 pycparser 模块模块开发者网址获取抽象语法树1. 需要导入的模块2. 获取 不关注预处理相关 c语言文件的抽象语法树ast3. 获取 预处理后的c语言文件的抽象语法树ast 语法树组成1. 数据类型定义 Typedef2. 类型声明 TypeDecl3. 标识符类型 IdentifierType4. 变量声明…

语聚AI公测发布,大语言模型时代下新的生产力工具

语聚AI 公测发布 距离语聚AI内测上线已经过去近1个月。 这期间&#xff0c;我们共邀请了近百位资深用户与行业专家加入语聚AI产品体验。通过大家的热情参与积极反馈&#xff0c;我们不断优化并完善了语聚AI的功能与使用体验。 经过研发团队不懈的努力&#xff0c;今天语聚AI终…

【Leetcode】88.合并两个有序数组

一、题目 1、题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并后数组不应由函数返回,而是存储在数…

梅赛德斯-奔驰将成为首家集成ChatGPT的汽车制造商

ChatGPT的受欢迎程度毋庸置疑。OpenAI这个基于人工智能的工具&#xff0c;每天能够吸引无数用户使用&#xff0c;已成为当下很受欢迎的技术热点。因此&#xff0c;有许多公司都在想方设法利用ChatGPT来提高产品吸引力&#xff0c;卖点以及性能。在汽车领域&#xff0c;梅赛德斯…

代码随想录算法训练营第59天|动态规划part16|583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

代码随想录算法训练营第59天&#xff5c;动态规划part16&#xff5c;583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇 583. 两个字符串的删除操作 583. 两个字符串的删除操作 思路&#xff1a; 思路见代码 代码&#xff1a; python class Solution(object):de…

[国产MCU]-BL602开发实例-I2C与总线设备地址扫描

I2C与总线设备扫描 文章目录 I2C与总线设备扫描1、I2C介绍2、I2C驱动API介绍3、I2C使用实例I2C (Inter-Intergrated Circuit)是一种串行通讯总线,使用多主从架构,用来连接低速外围装置。 每个器件都有一个唯一的地址识别,并且都可以作为一个发送器或接收器。每个连接到总线的…

node-sass是什么

一、Sass&#xff08;Syntactically Awesome Style Sheets&#xff09; 是一种CSS预处理器&#xff0c;它扩展了CSS的功能并提供了更强大的样式表语言。Sass允许开发人员使用变量、嵌套规则、混合&#xff08;Mixins&#xff09;、继承等高级功能来编写更简洁、可维护的样式代…

2023年国赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…

QT-Mysql数据库图形化接口

QT sql mysqloper.h qsqlrelationaltablemodelview.h /************************************************************************* 接口描述&#xff1a;Mysql数据库图形化接口 拟制&#xff1a; 接口版本&#xff1a;V1.0 时间&#xff1a;20230727 说明&#xff1a;支…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)九:自定义组件封装下

一、本章内容 续上一张,本章实现一些自定义组件的封装,包括文件上传组件封装、级联选择组件封装、富文本组件封装等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 基于VUE3+Layui从头搭建通用后台管

【软件工程】内聚

概念 是指一个模块内部个成分之间相互关联程度的度量。也就是说&#xff0c;凝聚是对模块内各处理动作组合强度的一种度量。很显然&#xff0c;一个模块的内聚越大越好。 偶然凝聚 一个模块内的各处理元素之间没有任何联系&#xff0c;只是偶然地被凑到一起。这种模块也称为…

mov转mp4格式怎么转?

mov转mp4格式怎么转&#xff1f;众所周知&#xff0c;MOV视频格式是由苹果公司推出的常用的视频格式&#xff0c;能够在苹果软件及设备上使用。但是&#xff0c;如果将其应用于其他软件和设备上的话&#xff0c;可能会遇到文件无法正常播放的情况。在这个时候&#xff0c;我们需…

Linux MQTT智能家居项目(LED界面的布局设置)

文章目录 前言一、LED界面布局准备工作二、LED界面布局三、逻辑实现总结 前言 上篇文章我们完成了主界面的布局设置那么这篇文章我们就来完成各个界面的布局设置吧。 一、LED界面布局准备工作 首先添加LED灯光控制的图标。 将选择好的LED图标添加进来&#xff1a; 图标可以…

drawio导出矢量图

1.选中要导出的图 2.导出为pdf 3.用adobe打开pdf&#xff0c;另存为eps

华为认证含金量如何

华为认证是指通过华为技术有限公司官方认证考试所获得的认证资格。华为认证主要分为三个级别&#xff1a;华为认证工程师&#xff08;HCIE&#xff09;、华为认证专家&#xff08;HCNP&#xff09;和华为认证技术专家&#xff08;HCNA&#xff09;&#xff0c;每个级别都有不同…

在测试环境进行sqlserver锁表测试

将某表设置X锁1分钟&#xff1a; begin tran select top 1 * from tableName with (tablockx) waitfor delay 00:01:00 commit tran 查询当前被锁的表&#xff1a; --查询锁表的事务ID&#xff0c;被锁表名&#xff0c;锁模式&#xff0c;客户端主机名&#xff0c;客户端程序…

你真的了解数据结构与算法吗?

数据结构与算法&#xff0c;是理论和实践必须紧密结合的一门学科&#xff0c;有关数据结构和算法同类的课程或书籍&#xff0c;有些只是名为“数据结构”&#xff0c;而非“数据结构与算法”&#xff0c;它们在内容上并无很大区别。 实际上&#xff0c;数据结构和算法&#xf…

【华为认证 Datacom 练习题(有答案哟)】

1&#xff08;单选题&#xff09;下列配置默认路由的命令中&#xff0c;正确的是&#xff08;&#xff09;。 A、 B、 C、 D、 正确答案A 2&#xff08;单选题&#xff09;UDP是面向无连接的&#xff0c;必须使用&#xff08;&#xff09;来提供传输的可靠性。 A、网络层…

深入源码分析kubernetes informer机制(零)简单了解informer

[阅读指南] 基于kubernetes 1.27 stage版本 为了方便阅读&#xff0c;后续所有代码均省略了错误处理及与关注逻辑无关的部分。 文章目录 关于client-goInformer是什么为什么需要informerInformer工作流程后续分析计划 关于client-go client-go是kubernetes节点与服务端进行资源…

揭秘热门工作秘籍:ChatGPT大显身手!轻松提升工作效率的高效Prompt技巧曝光!

目录 01 背景 福利&#xff1a;文末有chat-gpt纯分享&#xff0c;无魔法&#xff0c;无限制 02 AI 可以帮助程序员做什么&#xff1f; 2.1 技术知识总结 2.2 拆解任务 2.3 阅读代码/优化代码 2.4 代码生成 2.5 生成单测 2.6 更多 AI 应用/插件 AIPRM Voice Control for Ch…