专栏首页机器学习与统计学TensorFlow2.0(8):误差计算——损失函数总结

TensorFlow2.0(8):误差计算——损失函数总结

TensorFlow2.0(1):基本数据结构——张量

TensorFlow2.0(2):数学运算

TensorFlow2.0(3):张量排序、最大最小值

TensorFlow2.0(4):填充与复制

TensorFlow2.0(5):张量限幅

TensorFlow2.0(6):利用data模块进行数据预处理

TensorFlow2.0(7):4种常用的激活函数

1 均方差损失函数:MSE

均方误差(Mean Square Error),应该是最常用的误差计算方法了,数学公式为:

其中,是真实值,是预测值,通常指的是batch_size,也有时候是指特征属性个数。

import tensorflow as tf
y = tf.random.uniform((5,),maxval=5,dtype=tf.int32)  # 假设这是真实值
print(y)

y = tf.one_hot(y,depth=5)  # 转为热独编码
print(y)
tf.Tensor([2 4 4 0 2], shape=(5,), dtype=int32)
tf.Tensor(
[[0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0.]], shape=(5, 5), dtype=float32)
y
<tf.Tensor: id=7, shape=(5, 5), dtype=float32, numpy=
array([[0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 1.],
       [1., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0.]], dtype=float32)>
pred = tf.random.uniform((5,),maxval=5,dtype=tf.int32)  # 假设这是预测值
pred = tf.one_hot(pred,depth=5)  # 转为热独编码
print(pred)
tf.Tensor(
[[0. 1. 0. 0. 0.]
 [0. 0. 0. 1. 0.]
 [1. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]], shape=(5, 5), dtype=float32)
loss1 = tf.reduce_mean(tf.square(y-pred))
loss1
<tf.Tensor: id=19, shape=(), dtype=float32, numpy=0.4>

在tensorflow的losses模块中,提供能MSE方法用于求均方误差,注意简写MSE指的是一个方法,全写MeanSquaredError指的是一个类,通常通过方法的形式调用MSE使用这一功能。MSE方法返回的是每一对真实值和预测值之间的误差,若要求所有样本的误差需要进一步求平均值:

loss_mse_1 = tf.losses.MSE(y,pred)
loss_mse_1
<tf.Tensor: id=22, shape=(5,), dtype=float32, numpy=array([0.4, 0.4, 0.4, 0.4, 0.4], dtype=float32)>
loss_mse_2 = tf.reduce_mean(loss_mse_1)
loss_mse_2
<tf.Tensor: id=24, shape=(), dtype=float32, numpy=0.4>

一般而言,均方误差损失函数比较适用于回归问题中,对于分类问题,特别是目标输出为One-hot向量的分类任务中,下面要说的交叉熵损失函数就要合适的多。

2 交叉熵损失函数

交叉熵(Cross Entropy)是信息论中一个重要概念,主要用于度量两个概率分布间的差异性信息,交叉熵越小,两者之间差异越小,当交叉熵等于0时达到最佳状态,也即是预测值与真实值完全吻合。先给出交叉熵计算公式:

其中,是真实分布的概率,是模型通过数据计算出来的概率估计。

不理解?没关系,我们通过一个例子来说明。假设对于一个分类问题,其可能结果有5类,由表示,有一个样本,其真实结果是属于第2类,用One-hot编码表示就是,也就是上面公司中的。现在有两个模型,对样本的预测结果分别是 和 ,也就是上面公式中的。从直觉上判断,我们会认为第一个模型预测要准确一些,因为它更加肯定属于第二类,不过,我们需要通过科学的量化分析对比来证明这一点:

第一个模型交叉熵:

第二个模型交叉熵:

可见,,所以第一个模型的结果更加可靠。

在TensorFlow中,计算交叉熵通过tf.losses模块中的categorical_crossentropy()方法。

tf.losses.categorical_crossentropy([0,1,0,0,0],[0.1, 0.7, 0.05, 0.05, 0.1])
<tf.Tensor: id=41, shape=(), dtype=float32, numpy=0.35667497>
tf.losses.categorical_crossentropy([0,1,0,0,0],[0, 0.6, 0.2, 0.1, 0.1])
<tf.Tensor: id=58, shape=(), dtype=float32, numpy=0.5108256>

模型在最后一层隐含层的输出可能并不是概率的形式,不过可以通过softmax函数转换为概率形式输出,然后计算交叉熵,但有时候可能会出现不稳定的情况,即输出结果是NAN或者inf,这种情况下可以通过直接计算隐藏层输出结果的交叉熵,不过要给categorical_crossentropy()方法传递一个from_logits=True参数。

x = tf.random.normal([1,784])
w = tf.random.normal([784,2])
b = tf.zeros([2])
logits = x@w + b  # 最后一层没有激活函数的层称为logits层
logits
<tf.Tensor: id=75, shape=(1, 2), dtype=float32, numpy=array([[ 5.236802, 18.843138]], dtype=float32)>
prob = tf.math.softmax(logits, axis=1)  # 转换为概率的形式
prob
<tf.Tensor: id=77, shape=(1, 2), dtype=float32, numpy=array([[1.2326591e-06, 9.9999881e-01]], dtype=float32)>
tf.losses.categorical_crossentropy([0,1],logits,from_logits=True)  # 通过logits层直接计算交叉熵
<tf.Tensor: id=112, shape=(1,), dtype=float32, numpy=array([1.1920922e-06], dtype=float32)>
tf.losses.categorical_crossentropy([0,1],prob)  # 通过转换后的概率计算交叉熵
<tf.Tensor: id=128, shape=(1,), dtype=float32, numpy=array([1.1920936e-06], dtype=float32)>

作者博客:

https://www.cnblogs.com/chenhuabin

作者github:

https://github.com/ChenHuabin321/tensorflow2_tutorials

本文分享自微信公众号 - 机器学习与统计学(tjxj666),作者:奥辰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【实验楼-Python 科学计算】SciPy - 科学计算库(下)

    使用 eigvals 计算矩阵的特征值,使用 eig 同时计算矩阵的特征值与特征向量:

    统计学家
  • Python数据分析之scikit-learn与数据预处理​

    预处理操作是机器学习整个周期中必不可少的一个过程,也是最能快速改善模型性能的一个过程,往往稍微转换一下特征属性的形态,就能得到性能的极大提升。当然,数据预处理绝...

    统计学家
  • 要强大的“黑匣子”,还是“可解释”的机器学习?| 清华AI Time激辩

    要不要用准确性换可解释性?这可能是许多资源有限的创业公司,在技术研发中面临的重要问题,同时也是机器学习可解释性研究中的重要议题。

    统计学家
  • python读取文件——python读取和保存mat文件

        首先我们谈谈MarkDown编辑器,我感觉些倒是挺方便的,因为用惯了LaTeX,对于MarkDown还是比较容易上手的,但是我发现,MarkDown中有...

    zhaozhiyong
  • 用Python开始机器学习:文本特征抽取与向量化

    假设我们刚看完诺兰的大片《星际穿越》,设想如何让机器来自动分析各位观众对电影的评价到底是“赞”(positive)还是“踩”(negative)呢? 这类问题就...

    机器学习AI算法工程
  • python机器学习速成|1|数据导入

    主要任务: ①完成常见的数据导入操作,包括数据导入,缺失值填充 ②完成常见的机器学习数据准备,包括特征二值化和训练集测试集的划分等

    用户1359560
  • 投稿 | 图卷积网络 GCN: Graph Convolutional Networks

    上面左图是2D卷积神经网络,其输入是4行4列的矩阵,通过卷积核逐步移动实现对整个输入的卷积操作;而右图输入是图网络,其结构和连接是不规则的,无法像卷积神经网络那...

    磐创AI
  • python读取文件——python读取和保存mat文件

        首先我们谈谈MarkDown编辑器,我感觉些倒是挺方便的,因为用惯了LaTeX,对于MarkDown还是比较容易上手的,但是我发现,MarkDown中有...

    zhaozhiyong
  • 人工智能_1_初识_机器学习介绍_特征工程和文本特征提取

    Dean0731
  • 从锅炉工到AI专家(6)

    俺踏月色而来

扫码关注云+社区

领取腾讯云代金券