TensorFlow2.0损失函数基本原理、调用及自定义
目录
1 基础数学知识
1.1 数学分布
1.2 信息熵
1.3 条件熵
1.4 交叉熵(entropy)
1.5 散度(divergency)
2 典型损失函数调用
2.1 均方差损失函数MSE
2.2 平均绝对误差MAE
2.3 BinaryCrossentropy()
2.4 SparseCategoricalCrossentropy()
2.5 CategoricalCrossentropy()
2.6 KLDivergence()
3 自定义损失函数
3.1 计算分布的相似度
1 基础数学知识
1.1 数学分布
分布可能指代不同的东西,比如数据分布或概率分布。这两种分布其实没有本质的区别,可以将x看做随机点,某一数据分布P为目标分布,概率分布f为x落在P上的概率值,形式化表示为f(x)。
假设我们是一组正在广袤无垠的太空中进行研究的科学家。我们发现了一些太空蠕虫,这些太空蠕虫的牙齿数量各不相同。现在我们需要将这些信息发回地球。但从太空向地球发送信息的成本很高,所以我们需要用尽量少的数据表达这些信息。我们有个好方法:我们不发送单个数值,而是绘制一张图表,其中 X 轴表示所观察到的不同牙齿数量(0,1,2…),Y 轴是看到的太空蠕虫具有 x 颗牙齿的概率(即具有 x 颗牙齿的蠕虫数量/蠕虫总数量)。这样,我们就将观察结果转换成了分布。
1.2 信息熵
熵是信息混乱程度的度量,信息越混乱越不确定熵越小。
我们对于信息内容的度量依赖于概率分布p(x),因此我们想要寻找一个函数h(x),它是概率p(x)的单调函数,表达了信息的内容。h()的形式可以这样寻找:如果我们有两个不相关的事件x和y,那么我们观察到两个事件同时发生时获得的信息应该等于观察到事件各自发生时获得的信息之和,即h(x, y)=h(x)+h(y)。两个不相关事件是统计独立的,因此p(x, y)=p(x)*p(y)。根据这两个关系,很容易看出h(x)一定与p(x) 的对数有关。因此,我们有:
其中负号使信息量取值为非负,一个事件发生的概率越大则信息量越小。该公式定义了概率分布和信息量函数成反比的关系。
现在假设一个发送者想传输一个随机变量的值给接收者。这个过程中,他们传输的平均信息量通可以通过计算概率分布p(x) 的期望得到。这个期望值为:
事实上H(x)就是随机变量x的熵,熵计算公式:
y1 = tf.constant([0.25, 0.25, 0.25, 0.25])
y2 = tf.constant([0.1, 0.1, 0.1, 0.7])
y3 = tf.constant([0.01, 0.01, 0.01, 0.97])loss1 = -tf.reduce_sum(y1*tf.math.log(y1)) # 1.3862944
loss2 = -tf.reduce_sum(y2*tf.math.log(y2)) # 0.94044805
loss3 = -tf.reduce_sum(y3 * tf.math.log(y3)) # 0.1677005
1.3 条件熵
条件熵H(Y∣X)定义为X给定条件下Y的条件概率分布的熵对X的数学期望:
条件概率P(y|x)为已知x的情况下y的概率,p(y|x)=p(x, y)-p(x)。
1.4 交叉熵(entropy)
交叉熵是度量两个数学分布的相似度。
交叉熵(针对onehot编码)计算公式:
y = tf.constant([0., 1., 0., 0.])
p = tf.constant([1., 10.2, 3.2, 0.5])
loss5 = losses.categorical_crossentropy(y, p, from_logits=True) # 0.0010736184
1.5 散度(divergency)
散度度量了两个分布的匹配程度,经常作为优化的目标。
1.5.1 KL散度
KL 散度,又称相对熵,是一种衡量两个概率分布的匹配程度的指标,两个分布差异越大,KL散度越大。公式:
其中 p(x) 是目标分布,q(x)是去匹配的分布,如果两个分布完全匹配,则KL为0,若完全没有交集则无穷大。
2 典型损失函数调用
tensorfow2.0中的损失函数调用。
2.1 均方差损失函数MSE
回归问题中最常用的损失函数;
优点是便于梯度下降,误差大时下降快,误差小时下降慢,有利于函数收敛;
缺点是受明显偏离正常范围的离群样本的影响较大。
公式:
y_true = tf.random.uniform(shape=[5, 9])
y_pred = tf.random.uniform(shape=[5, 9])Mse = losses.MeanSquaredError()
m = Mse(y_true, y_pred)mse = losses.mean_squared_error(y_true, y_pred)
mse_mean = tf.reduce_mean(tf.square(y_true - y_pred))print(mse) # tf.Tensor([0.21396121 0.16804615 0.18875246 0.13844354 0.13452384], shape=(5,), dtype=float32)
print(mse_mean) # tf.Tensor(0.16874544, shape=(), dtype=float32)
print(m) # tf.Tensor(0.16874544, shape=(), dtype=float32)
2.2 平均绝对误差MAE
计算标签和预测之间的绝对差的平均值,想格外增强对离群样本的健壮性时使用;
优点是其克服了 MSE 的缺点,受偏离正常范围的离群样本影响较小;
缺点是收敛速度比 MSE 慢,因为当误差大或小时其都保持同等速度下降,而且在某一点处还不可导,计算机求导比较困难。
公式:
y_true = tf.random.uniform(shape=[5, 9])
y_pred = tf.random.uniform(shape=[5, 9])Mae = losses.MeanAbsoluteError()
m = Mae(y_true, y_pred)
mae = losses.mean_absolute_error(y_true, y_pred)
mae_mean = tf.reduce_mean(tf.square(y_true - y_pred))
print(mae) # tf.Tensor([0.35941643 0.3585953 0.34886912 0.24132997 0.3855058 ], shape=(5,), dtype=float32)
print(mae_mean) # tf.Tensor(0.17012018, shape=(), dtype=float32)
print(m) # tf.Tensor(0.17012018, shape=(), dtype=float32)
2.3 BinaryCrossentropy()
二分类问题
y_true = tf.constant([[0.], [0.], [1.], [0.]]) # (2, 1)
y_pred = tf.constant([[0.01], [0.02], [0.8], [0.1]]) # (2, 1)losser = losses.BinaryCrossentropy(from_logits=False)
loss1 = losser(y_true, y_pred)loss2 = losses.binary_crossentropy(y_true, y_pred)print(loss1) # tf.Tensor(0.08968914, shape=(), dtype=float32)
print(loss2) # tf.Tensor([0.01005021 0.02020257 0.22314338 0.10536041], shape=(4,), dtype=float32)
2.4 SparseCategoricalCrossentropy()
from_logits:True就是需要经过softmax进行概率化,默认False,即y_pred是经过softmax处理的 reduction:False:返回一个list, True:默认返回一个平均值
比起CategoricalCrossentropy(),其实就多个自动one-hot的功能。
y_true = tf.constant([0., 0., 1., 0.])
y_pred = tf.constant([[0.1, 0.2, 0.7], [0.2, 0.3, 0.5], [0.5, 0.6, 0.1], [0.2, 0.2, 0.6]])Scc = losses.SparseCategoricalCrossentropy()
m = Scc(y_true, y_pred)
scc = losses.sparse_categorical_crossentropy(y_true, y_pred)
scc_mean = tf.reduce_mean(scc)
print(scc) # tf.Tensor([2.3025851 1.609438 0.6931471 1.609438 ], shape=(4,), dtype=float32)
print(scc_mean) # tf.Tensor(1.553652, shape=(), dtype=float32)
print(m) # tf.Tensor(1.553652, shape=(), dtype=float32)
2.5 CategoricalCrossentropy()
from_logits:True就是需要经过softmax进行概率化,默认False,即y_pred是经过softmax处理的 reduction:False:返回一个list, True:默认返回一个平均值。
y_true = tf.constant([[0., 0., 1.], [0., 1., 0.], [0., 0., 1.], [1., 0., 0.]])
y_pred = tf.constant([[0.1, 0.2, 0.7], [0.2, 0.3, 0.5], [0.5, 0.6, 0.1], [0.2, 0.2, 0.6]])Cc = losses.CategoricalCrossentropy()
m = Cc(y_true, y_pred)
cc = losses.categorical_crossentropy(y_true, y_pred)
cc_mean = tf.reduce_mean(cc)
print(cc) # tf.Tensor([2.3025851 1.609438 0.6931471 1.609438 ], shape=(4,), dtype=float32)
print(cc_mean) # tf.Tensor(1.553652, shape=(), dtype=float32)
print(m) # tf.Tensor(1.553652, shape=(), dtype=float32)
2.6 KLDivergence()
y_true = tf.constant([[0., 0., 1.], [0., 1., 0.], [0., 0., 1.], [1., 0., 0.]])
y_pred = tf.constant([[0.1, 0.2, 0.7], [0.2, 0.3, 0.5], [0.5, 0.6, 0.1], [0.2, 0.2, 0.6]])KL = losses.KLDivergence()
kl = losses.kl_divergence(y_true, y_pred)
m = KL(y_true, y_pred)
print(m) # tf.Tensor(1.3681648, shape=(), dtype=float32)
print(kl) # tf.Tensor([0.35667214 1.2039698 2.302582 1.609435 ], shape=(4,), dtype=float32)
3 自定义损失函数
3.1 计算分布的相似度
class SequenceKL(losses.Loss):def __init__(self, from_logits=False):super(SequenceKL, self).__init__()self.from_logits = from_logitsdef call(self, data, fake):"""计算分布的相似度:param data: 真实分布 is a tuple shape: labels * (b, features):param fake: 生成的虚假分布is a tensor shape: (labels, features, b):return:"""kl_lossor = losses.KLDivergence()loss = [] # 存储labels个分类的损失值labels = fake.shape[0]features = fake.shape[1]for i in range(labels):dis = tf.transpose(data[i])kl_d = [] # 存储features个分布的相似度for j in range(features):kl_d.append(kl_lossor(dis[j], fake[i][j]))loss.append(tf.reduce_mean(kl_d))return tf.reduce_sum(loss)
TensorFlow2.0损失函数基本原理、调用及自定义相关推荐
- Tensorflow2.0入门教程12:自定义循环训练模型
自动求导机制 在机器学习中,梯度下降时候需要计算函数的导数,TensorFlow 提供了强大的自动求导机制来计算导数, 使用tf.GradientTape()自动求导: tf.Variable():定 ...
- Tensorflow2.0 + Transformers 实现Bert FGM对抗训练惩罚梯度损失函数
Tensorflow2.0 + Transformers 实现Bert FGM对抗训练惩罚梯度损失函数 前言 变种实现 Transformers中的word_embeddings 代码修改 实验效果 ...
- 〖TensorFlow2.0笔记21〗自定义数据集(宝可精灵数据集)实现图像分类+补充:tf.where!
自定义数据集(宝可精灵数据集)实现图像分类+补充:tf.where! 文章目录 一. 数据集介绍以及加载 1.1. 数据集简单描述 1.2. 程序实现步骤 1.3. 加载数据的格式 1.4. map函 ...
- Tensorflow2.0实战练习之猫狗数据集(包含自定义训练和迁移学习)
最近在学习使用Tenforflow2.0,写下这篇文章,用来帮助和我一样的初学者,文章中如果存在某些问题,还希望各位指出. 目录 数据集介绍 数据处理及增强 VGG模型介绍 模型搭建 训练及结果展示 ...
- Tensorflow2.0:使用Keras自定义网络实战
tensorflow2.0建议使用tf.keras作为构建神经网络的高级API 接下来我就使用tensorflow实现VGG16去训练数据 背景介绍: 2012年 AlexNet 在 ImageNet ...
- 【深度学习】(6) tensorflow2.0使用keras高层API
各位同学好,今天和大家分享一下TensorFlow2.0深度学习中借助keras的接口减少神经网络代码量.主要内容有: 1. metrics指标:2. compile 模型配置:3. fit 模型训练 ...
- TensorFlow2.0正式版发布,极简安装TF2.0(CPUGPU)教程
作者 | 小宋是呢 转载自CSDN博客 [导读]TensorFlow 2.0,昨天凌晨,正式放出了2.0版本. 不少网友表示,TensorFlow 2.0比PyTorch更好用,已经准备全面转向这个新 ...
- TensorFlow2.0学习
文章目录 一.TensorFlow的建模流程 1.1 结构化数据建模流程范例 1.1.1 准备数据 1.1.2 定义模型 1.1.3 训练模型 1.1.4 评估模型 1.1.5 使用模型 1.1.6 ...
- TensorFlow2.0教程-使用keras训练模型
TensorFlow2.0教程-使用keras训练模型 Tensorflow 2.0 教程持续更新: https://blog.csdn.net/qq_31456593/article/details ...
最新文章
- geany怎么创建文件夹_教程详情|Geany怎么使用,Geany安装使用教程_234游戏网
- BCH社区意见分歧:引领市场VS迎合市场?
- 百度增长复苏,市值一夜涨160亿;李彦宏:技术价值再度闪耀,宁可创新冒险也不平庸保守...
- 如何将mysql5的sql文件导入到mysql4?
- codeforces 1027 B - Numbers on the Chessboard(规律)
- 用Windows 10自带的paint/画图 软件删除图片中的文字,并且添加新文字,适合学术应用,有截图
- CDN和CDN加速原理
- 2020跨境电商独立站将喷发式增长?
- linux杀死网络,Linux下kill杀死进程详解
- 3.2 Hadoop生态
- Axure RP 8管理团队项目中遇到的问题
- discuz文件结构详解,discuz模板文件介绍
- 简明现代魔法 php,PHP生成强密码
- Windows主机和Linux主机之间连接网线共享网络上网设置
- 阿里云服务器更改时区
- WinSvr:在 Windows Server 中启用无线连接
- 征信篇: 如何保护个人隐私,防止征信受损?
- php fpm failed,ubuntu环境下启动php-fpm失败Job for php-fpm.service failed...
- 0506-Scrum 项目 2.0视频
- Java如何判断一个上传文件的内容类型