Tensorflow 中的损失函数 —— loss 专题汇总

回归和分类是监督学习中的两个大类。自学过程中,阅读别人代码时经常看到不同种类的损失函数,到底 Tensorflow 中有多少自带的损失函数呢,什么情况下使用什么样的损失函数?这次就来汇总介绍一下。

一、处理回归问题

1. tf.losses.mean_squared_error:均方根误差(MSE) —— 回归问题中最常用的损失函数

优点是便于梯度下降,误差大时下降快,误差小时下降慢,有利于函数收敛。
缺点是受明显偏离正常范围的离群样本的影响较大

# Tensorflow中集成的函数
mse = tf.losses.mean_squared_error(y_true, y_pred)
# 利用Tensorflow基础函数手工实现
mse = tf.reduce_mean(tf.square(y_true -  y_pred))

2. tf.losses.absolute_difference:平均绝对误差(MAE) —— 想格外增强对离群样本的健壮性时使用

优点是其克服了 MSE 的缺点,受偏离正常范围的离群样本影响较小。
缺点是收敛速度比 MSE 慢,因为当误差大或小时其都保持同等速度下降,而且在某一点处还不可导,计算机求导比较困难。

maes = tf.losses.absolute_difference(y_true, y_pred)
maes_loss = tf.reduce_sum(maes)

3. tf.losses.huber_loss:Huber loss —— 集合 MSE 和 MAE 的优点,但是需要手动调超参数

核心思想是,检测真实值(y_true)和预测值(y_pred)之差的绝对值在超参数 δ 内时,使用 MSE 来计算 loss, 在 δ 外时使用类 MAE 计算 loss。sklearn 关于 huber 回归的文档中建议将 δ=1.35 以达到 95% 的有效性。

hubers = tf.losses.huber_loss(y_true, y_pred)
hubers_loss = tf.reduce_sum(hubers)

二、处理分类问题

1. tf.nn.sigmoid_cross_entropy_with_logits:先 sigmoid 再求交叉熵 —— 二分类问题首选

使用时,一定不要将预测值(y_pred)进行 sigmoid 处理,否则会影响训练的准确性,因为函数内部已经包含了 sigmoid 激活(若已先行 sigmoid 处理过了,则 tensorflow 提供了另外的函数) 。真实值(y_true)则要求是 One-hot 编码形式。

函数求得的结果是一组向量,是每个维度单独的交叉熵,如果想求总的交叉熵,使用 tf.reduce_sum() 相加即可;如果想求 loss ,则使用 tf.reduce_mean() 进行平均。

# Tensorflow中集成的函数
sigmoids = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=y_pred)
sigmoids_loss = tf.reduce_mean(sigmoids)# 利用Tensorflow基础函数手工实现
y_pred_si = 1.0/(1+tf.exp(-y_pred))
sigmoids = -y_true*tf.log(y_pred_si) - (1-y_true)*tf.log(1-y_pred_si)
sigmoids_loss = tf.reduce_mean(sigmoids)

2. tf.losses.log_loss:交叉熵 —— 效果同上,预测值格式略有不同

预测值(y_pred)计算完成后,若已先行进行了 sigmoid 处理,则使用此函数求 loss ,若还没经过 sigmoid 处理,可直接使用 sigmoid_cross_entropy_with_logits。

# Tensorflow中集成的函数
logs = tf.losses.log_loss(labels=y, logits=y_pred)
logs_loss = tf.reduce_mean(logs)# 利用Tensorflow基础函数手工实现
logs = -y_true*tf.log(y_pred) - (1-y_true)*tf.log(1-y_pred)
logs_loss = tf.reduce_mean(logs)

3. tf.nn.softmax_cross_entropy_with_logits_v2:先 softmax 再求交叉熵 —— 多分类问题首选

使用时,预测值(y_pred)同样是没有经过 softmax 处理过的值,真实值(y_true)要求是 One-hot 编码形式。

softmaxs = tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=y_pred)
softmaxs_loss = tf.reduce_mean(softmaxs)
v1.8之前为 tf.nn.softmax_cross_entropy_with_logits(),新函数修补了旧函数的不足,两者在使用方法上是一样的。

4. tf.nn.sparse_softmax_cross_entropy_with_logits:效果同上,真实值格式略有不同

若真实值(y_true)不是 One-hot 格式的,可以使用此函数,可省略一步转换

softmaxs_sparse = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=y_pred)
softmaxs_sparse_loss = tf.reduce_mean(softmaxs_sparse)

5. tf.nn.weighted_cross_entropy_with_logits:带权重的 sigmoid 交叉熵 —— 适用于正、负样本数量差距过大时

增加了一个权重的系数,用来平衡正、负样本差距,可在一定程度上解决差距过大时训练结果严重偏向大样本的情况。

# Tensorflow中集成的函数
sigmoids_weighted = tf.nn.weighted_cross_entropy_with_logits(targets=y, logits=y_pred, pos_weight)
sigmoids_weighted_loss = tf.reduce_mean(sigmoids_weighted)# 利用Tensorflow基础函数手工实现
sigmoids_weighted = -y_true*tf.log(y_pred) * weight - (1-y_true)*tf.log(1-y_pred)
sigmoids_loss = tf.reduce_mean(sigmoids)

6. tf.losses.hinge_loss:铰链损失函数 —— SVM 中使用

hing_loss 是为了求出不同类别间的“最大间隔”,此特性尤其适用于 SVM(支持向量机)。使用 SVM 做分类,与 LR(Logistic Regression 对数几率回归)相比,其优点是小样本量便有不错效果、对噪点包容性强,缺点是样本量大时效率低、有时很难找到合适的区分方法。

hings = tf.losses.hinge_loss(labels=y, logits=y_pred, weights)
hings_loss = tf.reduce_mean(hings)

三、自定义损失函数

标准的损失函数并不合适所有场景,有些实际的背景需要采用自己构造的损失函数,

Tensorflow 也提供了丰富的基础函数供自行构建。
例如下面的例子:当预测值(y_pred)比真实值(y_true)大时,使用 (y_pred-y_true)*loss_more 作为 loss,反之,使用 (y_true-y_pred)*loss_lessloss = tf.reduce_sum(tf.where(tf.greater(y_pred, y_true), (y_pred-y_true)*loss_more,(y_true-y_pred)*loss_less))
tf.greater(x, y):判断 x 是否大于 y,当维度不一致时广播后比较
tf.where(condition, x, y):当 condition 为 true 时返回 x,否则返回 y
tf.reduce_mean():沿维度求平均
tf.reduce_sum():沿维度相加
tf.reduce_prod():沿维度相乘
tf.reduce_min():沿维度找最小
tf.reduce_max():沿维度找最大
使用 Tensorflow 提供的方法可自行构造想要的损失函数。

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

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

相关文章

Vue组件点击事件不触发的问题,添加事件修饰符native解决

目录 一、父组件在子组件上绑定方法,点击不触发 .native是什么? 二、其他事件修饰符 .stop .prevent .capture .self .once .passive 三、子组件触发父组件方法 四、父组件调用子组件方法 一、父组件在子组件上绑定方法,点击不触发…

常见の算法

前言本文主要使用Java 什么,是快乐星球#¥%……什么是算法? 算法是一组完成任务的指令。任何代码片段都可视为算法,但我们主要介绍常见算法 一、引入——二分查找 二分查找是一种算法,其输入是一个有序的元素列表。如…

java获取一段音频/mp3的时长

引言 在日常开发中&#xff0c;经常会遇到产品经理提出一个需求“上传音乐/音频”&#xff0c;而且还得显示出音频的播放时长。那我们直接世界上最简单的实现方案&#xff0c;必须是最简单&#xff0c;多一句啰嗦不准点赞。 How to do 1.提前引入包 <!--视频多媒体工具包…

浏览器实用:禁止浏览器http自动转成https

前言 因为有些网站支持http和https两种协议访问&#xff0c;有些只支持一种协议访问。但根据动态域名安全策略&#xff08;HSTS&#xff09;&#xff0c;只要该域名在浏览器中访问过一次https&#xff0c;那么浏览器将强制使http的请求变为https。 虽然这条浏览器的策略有利于提…

【oshi-core依赖】Java获取计算机的内存信息、磁盘信息、CPU信息

这篇文章,主要介绍Java如何获取计算机内存信息、磁盘信息、CPU信息【知识星球】。 目录 一、获取系统信息 1.1、引入依赖 1.2、SystemInfo类

Flink入门教程

使用flink时需要提前准备好scala环境 一、创建maven项目 二、添加pom依赖 <properties><scala.version>2.11.12</scala.version></properties><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library<…

【蓝桥备赛】最大数组和——前缀和

题目链接 最大数组和 个人思路 一个需要简单操作的前缀和数组&#xff0c;因为需要对价值最大的宝石和价值最小的宝石进行操作&#xff0c;所以肯定少不了进行一个排序。然后&#xff0c;可能就有人想要不使用双指针进行处理&#xff0c;如果最小的两个数之和大于最大的数&a…

携程基于Jira Cloud的敏捷项目管理实践

好的工具可以满足团队在各个成长阶段的管理诉求 实践一&#xff1a;对齐目标/团队OKR/多团队协作战略项目 实践二&#xff1a;以产品为中心的协作框架 实践三&#xff1a;交付团队管理 实践四&#xff1a;和海外子公司对齐&#xff0c;协作

在linux、window环境搭建kafka环境

一、搭建环境前置准备 下载kafka的官网 http://kafka.apache.org/downloads根据自己的需求选择版本,安装包不区分linux和windows环境,这一个安装包均可部署。 源代码包含kafka的代码文件,使用scala编写的。 二、linux环境 1. 上传安装包 我下载的版本是kafka_2.12-3.6.1…

09.Elasticsearch应用(九)

Elasticsearch应用&#xff08;九&#xff09; 1.搜索结果处理包括什么 排序分页高亮返回指定字段 2.排序 介绍 Elasticsearch支持对搜索结果排序&#xff0c;默认是根据相关度算分来排序 支持排序的字段 keyword数值地理坐标日期类型 排序语法 GET /[索引名称]/_sear…

网络协议与攻击模拟_08DHCP协议

技术学习要了解某项技术能干什么&#xff1f;它的详细内容&#xff1f;发展走向&#xff1f; 一、DHCP协议 1、DHCP基本概念 dhcp动态主机配置协议&#xff0c;广泛应用于局域网内部 主要是为客户机提供TCP/IP 参数&#xff08;IP地址、子网掩码、网关、DNS等&#xff09;…

5G赋能智慧文旅:科技与文化的完美结合,打造无缝旅游体验,重塑旅游业的未来

一、5G技术&#xff1a;智慧文旅的强大引擎 5G技术的起源可以追溯到2010年&#xff0c;当时世界各国开始意识到4G技术已经达到了瓶颈&#xff0c;无法满足日益增长的移动通信需求。2013年&#xff0c;国际电信联盟&#xff08;ITU&#xff09;成立了5G技术研究组&#xff0c;开…

超融合系统疑难故障定位与解决实践 3 例(含信创技术栈)

当 IT 系统出现故障&#xff0c;问题定位往往是运维人员最头疼的环节。尤其是超融合系统&#xff0c;由于整体涉及的技术栈比较复杂&#xff0c;且有越来越多的用户基于信创环境进行部署&#xff0c;非常考验厂商和技术人员的专业能力&#xff1a;厂商研发和售后工程师不仅应能…

[pytorch入门] 6. 神经网络

基本介绍 torch.nn&#xff1a; Containers&#xff1a;基本骨架Convolution Layers&#xff1a; 卷积层Pooling layers&#xff1a;池化层Non-linear Activations (weighted sum, nonlinearity)&#xff1a;非线性激活Normalization Layers&#xff1a;正则化层 Container…

一文讲透Excel数据如何导入到Stata?

推荐采用《Stata统计分析从入门到精通》 杨维忠、张甜 清华大学出版社“1.2.6 导入其他格式的数据文件” 的解答。 在Stata主界面选择“文件|导入”命令&#xff08;如图所示&#xff09;&#xff0c;即可看到Stata支持的其他格式的数据文件类型&#xff0c;包括Excel电子表格…

【收藏】幻兽帕鲁创建服务器教程

创建幻兽帕鲁服务器1分钟部署教程&#xff0c;阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程&#xff0c;4核16G和4核32G配置可选&#xff0c;阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程&#xff1a; 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…

如何在 Linux 上安装 Docker?最权威指南来了!

docker文档&#xff1a;https://docs.docker.com/engine/ 打开docker文档 这里需要注意&#xff0c;服务器上一般是没有界面的&#xff0c;我们只需要安装docker Engine。 卸载历史版本 这一步是可选的&#xff0c;如果之前安装过旧版本的Docker&#xff0c;可以使用如下命令…

openssl3.2 - linux脚本(.sh)调用openssl命令行参数的简单确认方法

文章目录 openssl3.2 - linux脚本(.sh)调用openssl命令行参数的简单确认方法概述笔记修改openssl实现的前置条件修改debian12.4下编译好的openssl实现, 将入口参数记录下来测试效果备注补充 - 将管道文件记录到本地文件效果备注补充 - 要考虑到管道的读bug_fix - 补充-extfile时…

[RK-Linux] 移植Linux-5.10到RK3399(十)| 配置AP6256模组使能WIFI、BT功能

手上 ROC-RK3399-PC Pro 使用蓝牙 WIFI 模组是 AP6256。 一、AP6256 模组介绍 AP6256是正基科技(AMPAK)推出的一款低成本、低功耗的双模模块,它集成了Wi-Fi和蓝牙功能。这款模块支持SDIO接口,具有以下特点: 1、型号:AP6256 2、接口:SDIO(Secure Digital Input/Outp…

图像旋转角度计算并旋转

#!/usr/bin/python3 # -*- coding: utf-8 -*- import cv2 import numpy as np import timedef Rotate(img, angle0.0,fill0):"""旋转:param img:待旋转图像:param angle: 旋转角度:param fill&#xff1a;填充方式&#xff0c;默认0黑色填充:return: img: 旋转后…