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

一、说明

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

二、内容提要 

我们本文所谈的代价函数如下所列:

  1. 均方误差 (MSE) 损失
  2. 二进制交叉熵损失
  3. 加权二进制交叉熵损失
  4. 分类交叉熵损失
  5. 稀疏分类交叉熵损失
  6. 骰子损失
  7. 吉隆坡背离损失
  8. 平均绝对误差 (MAE) / L1 损耗
  9. 胡贝尔损失

        在下文,我们将逐一演示其不同实现办法。 

三、均方误差 (MSE) 损失

        均方误差 (MSE) 损失是回归问题中常用的损失函数,其目标是预测连续变量。损失计算为预测值和真实值之间的平方差的平均值。MSE 损失的公式为:

MSE loss = (1/n) * sum((y_pred — y_true)²)

        这里:

  • n 是数据集中的样本数
  • 目标变量的预测值y_pred
  • y_true是目标变量的真实值

        MSE损失对异常值很敏感,并且会严重惩罚大误差,这在某些情况下可能是不可取的。在这种情况下,可以使用其他损失函数,如平均绝对误差(MAE)或Huber损失。

        在 NumPy 中的实现

import numpy as npdef mse_loss(y_pred, y_true):"""Calculates the mean squared error (MSE) loss between predicted and true values.Args:- y_pred: predicted values- y_true: true valuesReturns:- mse_loss: mean squared error loss"""n = len(y_true)mse_loss = np.sum((y_pred - y_true) ** 2) / nreturn mse_loss

        在此实现中,和 是分别包含预测值和真值的 NumPy 数组。该函数首先计算 和 之间的平方差,然后取这些值的平均值来获得 MSE 损失。该变量表示数据集中的样本数,用于规范化损失。y_predy_truey_predy_truen

TensorFlow 中的实现

import tensorflow as tfdef mse_loss(y_pred, y_true):"""Calculates the mean squared error (MSE) loss between predicted and true values.Args:- y_pred: predicted values- y_true: true valuesReturns:- mse_loss: mean squared error loss"""mse = tf.keras.losses.MeanSquaredError()mse_loss = mse(y_true, y_pred)return mse_loss

在此实现中,和是分别包含预测值和真值的 TensorFlow 张量。该函数计算 和 之间的 MSE 损耗。该变量包含计算出的损失。y_predy_truetf.keras.losses.MeanSquaredError()y_predy_truemse_loss

在 PyTorch 中的实现

import torchdef mse_loss(y_pred, y_true):"""Calculates the mean squared error (MSE) loss between predicted and true values.Args:- y_pred: predicted values- y_true: true valuesReturns:- mse_loss: mean squared error loss"""mse = torch.nn.MSELoss()mse_loss = mse(y_pred, y_true)return mse_loss

在此实现中,和 是分别包含预测值和真值的 PyTorch 张量。该函数计算 和 之间的 MSE 损耗。该变量包含计算出的损失。y_predy_truetorch.nn.MSELoss()y_predy_truemse_loss

四、二进制交叉熵损失

        二进制交叉熵损失,也称为对数损失,是二元分类问题中使用的常见损失函数。它测量预测概率分布与实际二进制标签分布之间的差异。

        二进制交叉熵损失的公式如下:

        L(y, ŷ) = -[y * log(ŷ) + (1 — y) * log(1 — ŷ)]

        其中 y 是真正的二进制标签(0 或 1),ŷ 是预测概率(范围从 0 到 1),log 是自然对数。

        等式的第一项计算真实标签为 1 时的损失,第二项计算真实标签为 0 时的损失。总损失是两个项的总和。

        当预测概率接近真实标签时,损失较低,当预测概率远离真实标签时,损失较高。此损失函数通常用于在输出层中使用 sigmoid 激活函数来预测二进制标签的神经网络模型。

4.1 在 NumPy 中的实现

        在numpy中,二进制交叉熵损失可以使用我们前面描述的公式来实现。下面是如何计算它的示例:

# define true labels and predicted probabilities
y_true = np.array([0, 1, 1, 0])
y_pred = np.array([0.1, 0.9, 0.8, 0.3])# calculate the binary cross-entropy loss
loss = -(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)).mean()# print the loss
print(loss)

4.2 TensorFlow 中的实现

        在 TensorFlow 中,二进制交叉熵损失可以使用 tf.keras.loss.BinaryCrossentropy() 函数实现。下面是如何使用它的示例:

import tensorflow as tf# define true labels and predicted probabilities
y_true = tf.constant([0, 1, 1, 0])
y_pred = tf.constant([0.1, 0.9, 0.8, 0.3])# define the loss function
bce_loss = tf.keras.losses.BinaryCrossentropy()# calculate the loss
loss = bce_loss(y_true, y_pred)# print the loss
print(loss)

4.3 在 PyTorch 中的实现

        在 PyTorch 中,二进制交叉熵损失可以使用该函数实现。下面是如何使用它的示例:torch.nn.BCELoss()

import torch# define true labels and predicted probabilities
y_true = torch.tensor([0, 1, 1, 0], dtype=torch.float32)
y_pred = torch.tensor([0.1, 0.9, 0.8, 0.3], dtype=torch.float32)# define the loss function
bce_loss = torch.nn.BCELoss()# calculate the loss
loss = bce_loss(y_pred, y_true)# print the loss
print(loss)

4.4 加权二进制交叉熵损失

        加权二元交叉熵损失是二元交叉熵损失的一种变体,允许为正熵和负示例分配不同的权重。这在处理不平衡的数据集时非常有用,其中一类与另一类相比明显不足。

        加权二元交叉熵损失的公式如下:

L(y, ŷ) = -[w_pos * y * log(ŷ) + w_neg * (1 — y) * log(1 — ŷ)]

        其中 y 是真正的二进制标签(0 或 1),ŷ 是预测概率(范围从 0 到 1),log 是自然对数,w_pos 和 w_neg 分别是正权重和负权重。

        等式的第一项计算真实标签为 1 时的损失,第二项计算真实标签为 0 时的损失。总损失是两个项的总和,每个项按相应的权重加权。

        可以根据每个类的相对重要性选择正权重和负权重。例如,如果正类更重要,则可以为其分配更高的权重。同样,如果负类更重要,则可以为其分配更高的权重。

        当预测概率接近真实标签时,损失较低,当预测概率远离真实标签时,损失较高。此损失函数通常用于在输出层中使用 sigmoid 激活函数来预测二进制标签的神经网络模型。

五、分类交叉熵损失

        分类交叉熵损失是多类分类问题中使用的一种常用损失函数。它衡量每个类的真实标签和预测概率之间的差异。

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

L = -1/N * sum(sum(Y * log(Y_hat)))

        其中 是单热编码格式的真实标签矩阵,是每个类的预测概率矩阵,是样本数,表示自然对数。YY_hatNlog

        在此公式中,形状为 ,其中是样本数,是类数。每行 表示单个样本的真实标签分布,列中的值 1 对应于真实标签,0 对应于所有其他列。Y(N, C)NCY

        类似地,具有 的形状,其中每行表示单个样本的预测概率分布,每个类都有一个概率值。Y_hat(N, C)

        该函数逐个应用于预测的概率矩阵。该函数使用两次来求和矩阵的两个维度。logY_hatsumY

        结果值表示数据集中所有样本的平均交叉熵损失。训练神经网络的目标是最小化这种损失函数。LN

        损失函数对模型的惩罚更大,因为在预测低概率的类时犯了大错误。目标是最小化损失函数,这意味着使预测概率尽可能接近真实标签。

5.1 在 NumPy 中的实现

        在numpy中,分类交叉熵损失可以使用我们前面描述的公式来实现。下面是如何计算它的示例:

import numpy as np# define true labels and predicted probabilities as NumPy arrays
y_true = np.array([[0, 1, 0], [0, 0, 1], [1, 0, 0]])
y_pred = np.array([[0.8, 0.1, 0.1], [0.2, 0.3, 0.5], [0.1, 0.6, 0.3]])# calculate the loss
loss = -1/len(y_true) * np.sum(np.sum(y_true * np.log(y_pred)))# print the loss
print(loss)In this example, y_true represents the true labels (in integer format), and y_pred represents the predicted probabilities for each class (in a 2D array). The eye() function is used to convert the true labels to one-hot encoding, which is required for the loss calculation. The categorical cross-entropy loss is calculated using the formula we provided earlier, and the mean() function is used to average the loss over the entire dataset. Finally, the calculated loss is printed to the console.

        在此示例中, 以独热编码格式表示真实标签,并表示每个类的预测概率,两者都为 NumPy 数组。使用上述公式计算损失,然后使用该函数打印到控制台。请注意,该函数使用两次来对矩阵的两个维度求和。y_truey_predprintnp.sumY

5.2 TensorFlow 中的实现

        在TensorFlow中,分类交叉熵损失可以使用该类轻松计算。下面是如何使用它的示例:tf.keras.losses.CategoricalCrossentropy

import tensorflow as tf# define true labels and predicted probabilities as TensorFlow Tensors
y_true = tf.constant([[0, 1, 0], [0, 0, 1], [1, 0, 0]])
y_pred = tf.constant([[0.8, 0.1, 0.1], [0.2, 0.3, 0.5], [0.1, 0.6, 0.3]])# create the loss object
cce_loss = tf.keras.losses.CategoricalCrossentropy()# calculate the loss
loss = cce_loss(y_true, y_pred)# print the loss
print(loss.numpy())

        在此示例中,以独热编码格式表示真实标签,并表示每个类的预测概率,两者都作为 TensorFlow 张量。该类用于创建损失函数的实例,然后通过将真实标签和预测概率作为参数传递来计算损失。最后,使用该方法将计算出的损失打印到控制台。y_truey_predCategoricalCrossentropy.numpy()

请注意,该类在内部处理将真实标签转换为独热编码,因此无需显式执行此操作。如果你的真实标签已经是独热编码格式,你可以将它们直接传递给损失函数,没有任何问题。CategoricalCrossentropy

5.3 在 PyTorch 中的实现

        在 PyTorch 中,分类交叉熵损失可以使用该类轻松计算。下面是如何使用它的示例:torch.nn.CrossEntropyLoss

import torch# define true labels and predicted logits as PyTorch Tensors
y_true = torch.LongTensor([1, 2, 0])
y_logits = torch.Tensor([[0.8, 0.1, 0.1], [0.2, 0.3, 0.5], [0.1, 0.6, 0.3]])# create the loss object
ce_loss = torch.nn.CrossEntropyLoss()# calculate the loss
loss = ce_loss(y_logits, y_true)# print the loss
print(loss.item())

        在此示例中, 以整数格式表示真实标签,并表示每个类的预测对数,两者都作为 PyTorch 张量。该类用于创建损失函数的实例,然后通过将预测的对数和 true 标签作为参数传递来计算损失。最后,使用该方法将计算出的损失打印到控制台。y_truey_logitsCrossEntropyLoss.item()

        请注意,该类将 softmax 激活函数和分类交叉熵损失组合到一个操作中,因此您无需单独应用 softmax。另请注意,真正的标签应采用整数格式,而不是独热编码格式。CrossEntropyLoss

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

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

相关文章

“深入解析JVM内部机制:探索Java虚拟机的奥秘“

标题:深入解析JVM内部机制:探索Java虚拟机的奥秘 JVM(Java虚拟机)是Java程序的核心执行环境,它负责将Java字节码转换为机器码并执行。了解JVM的内部机制对于理解Java程序的执行过程和性能优化至关重要。本文将深入解析…

开启想象翅膀:轻松实现文本生成模型的创作应用,支持LLaMA、ChatGLM、UDA、GPT2、Seq2Seq、BART、T5、SongNet等模型,开箱即用

开启想象翅膀:轻松实现文本生成模型的创作应用,支持LLaMA、ChatGLM、UDA、GPT2、Seq2Seq、BART、T5、SongNet等模型,开箱即用 TextGen: Implementation of Text Generation models 1.介绍 TextGen实现了多种文本生成模型,包括&a…

c++——::作用域、命名空间、using(声明和编译指令)

c 作用域和名字控制 一、::(双冒号) 作用域 <::>运算符是一个作用域如果<::>前面什么都没有加 代表是全局作用域 二、命名空间&#xff08;namespace) 1、namespace 本质是作用域,可以更好的控制标识符的作用域命名空间 就可以存放 变量 函数 类 结构体 … 2…

【kubernetes】在k8s集群环境上,部署kubesphere

部署kubesphere 学习于尚硅谷kubesphere课程 前置环境配置-部署默认存储类型 这里使用nfs #所有节点安装 yum install -y nfs-utils# 在master节点执行以下命令 echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports # 执行以下命令&#xff…

QML与C++交互

目录 1 QML获取C的变量值 2 QML获取C创建的自定义对象 3 QML发送信号绑定C端的槽 4 C端发送信号绑定qml端槽 5 C调用QML端函数 1 QML获取C的变量值 QQmlApplicationEngine engine; 全局对象 上下文属性 QQmlApplicationEngine engine; QQmlContext *context1 engine.…

flowable流程移植新项目前端问题汇总

flowable流程移植到新项目时&#xff0c;出现一些前端问题&#xff0c;汇总如下&#xff1a; PS F:\khxm\NBCIO_VUE> yarn run serve yarn run v1.21.1 $ vue-cli-service serve INFO Starting development server... ERROR Error: Vue packages version mismatch: -…

25 | 葡萄酒质量数据分析

基于kaggle提供的公开数据集,对全球葡萄酒分布情况和质量情况进行数据探索和分析 from kaggle: https://www.kaggle.com/zynicide/wine-reviews 分析思路: 0、数据准备 1、葡萄酒的种类 2、葡萄酒质量 3、葡萄酒价格 4、葡萄酒描述词库 5、品鉴师信息 6、总结 0、数据准备 …

学习Vue:组件的概念和优势

在现代的前端开发中&#xff0c;组件化开发是一种重要的方法&#xff0c;它可以将复杂的应用程序拆分成多个独立的、可复用的组件。Vue.js 是一个流行的前端框架&#xff0c;它支持组件化开发&#xff0c;让开发者能够更轻松地构建和维护复杂的用户界面。在本文中&#xff0c;我…

计算机组成部分

计算机的五大部件是什么&#xff1f;答案&#xff1a;计算机的五大部件是运算器&#xff0c;控制器&#xff0c;存储器&#xff0c;输入设备和输出设备。 其中运算器和控制器合称中央处理器&#xff0c;是计算机的核心部件&#xff1b; 存储器是用来存储程序指令和数据用的&am…

修改第三方组件默认样式

深度选择器 修改el-input的样式&#xff1a; <el-input class"input-area"></el-input>查看DOM结构&#xff1a; 原本使用 /deep/ 但是可能不兼容 使用 :deep .input-area {:deep(.el-input__inner){background-color: blue;} }将 input 框背景色改为…

【Kubernetes】Kubernetes的Pod进阶

Pod进阶 一、资源限制和重启策略1. 资源限制2. 资源单位2.1 CPU 资源单位2.2 内存 资源单位 3. 重启策略&#xff08;restartPolicy&#xff09; 二、健康检查的概念1. 健康检查1.1 探针的三种规则1.2 Probe 支持三种检查方法 2. 示例2.1 exec 方式2.2 httpGet 方式2.3 tcpSock…

临床试验三原则-对照、重复、随机

临床试验必须遵循三个基本原则&#xff1a;对照、重复、随机。 一、对照原则和对照的设置 核心观点&#xff1a;有比较才有鉴别。 对照组和试验组同质可比。 三臂试验 安慰剂&#xff1a;试验组&#xff1a;阳性对照组1&#xff1a;n&#xff1a;m&#xff08;n≥m&#xff…

FFmpeg常见命令行(五):FFmpeg滤镜使用

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。本文是音视频系…

Nginx反向代理服务流式输出设置

Nginx反向代理服务流式输出设置 1.问题场景 提问&#xff1a;为什么我部署的服务没有流式响应 最近在重构原有的GPT项目时&#xff0c;遇到gpt回答速度很慢的现象。在使用流式输出的接口时&#xff0c;接口响应速度居然还是达到了30s以上。 2.现象分析 分析现象我发现&…

Leetcode链表篇 Day3

.24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 1.构建虚拟结点 2.两两一组&#xff0c;前继结点一定在两两的前面 3.保存结点1和结点3 19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 1.双指针&#xff1a;快慢指针 两个指针的差…

新能源汽车需要检测哪些项目

截至2022年底&#xff0c;中国新能源车保有量达1310万辆&#xff0c;其中纯电动汽车保有量1045万辆。为把好新能源汽车安全关&#xff0c;我国新能源汽车除了完善的强制性产品认证型式实验外&#xff0c;还建立了“车企-地方-国家”逐级上报的三级监管体系实行新能源汽车全生命…

2023.8.14论文阅读

文章目录 ESPNet: Efficient Spatial Pyramid of Dilated Convolutions for Semantic Segmentation摘要本文方法实验结果 DeepFusion: Lidar-Camera Deep Fusion for Multi-Modal 3D Object Detection摘要本文方法实验结果 ESPNet: Efficient Spatial Pyramid of Dilated Convo…

vue 路由地址把#去掉

在路由对象里边添加history模式就不显示# mode:history // 4.通过规则创建对象 const router new VueRouter({routes,// 默认模式为hash 带# // history 不带#mode:history })想把端口号8000换成其他的 比如我这样的3000更换端口号教程

Android Framework 动态更新插拔设备节点执行权限

TF卡设备节点是插上之后动态添加&#xff0c;所以不能通过初始化设备节点权限来解决&#xff0c;需要监听TF插入事件&#xff0c;在init.rc 监听插入后动态更新设备节点执行权限 添加插拔TF卡监听 frameworks/base/services/core/java/com/android/server/StorageManagerServic…

IL汇编ldc指令学习

ldc指令是把值送到栈上&#xff0c; 说明如下&#xff0c; ldc.i4 将所提供的int32类型的值作为int32推送到计算堆栈上&#xff1b; ldc.i4.0 将数值0作为int32推送到计算堆栈上&#xff1b; ... ldc.i4.8 将数值8作为int32推送到计算堆栈上&#xff1b; ldc.i4.m1 将数值-…