项目背景:人体动作识别(分类),CNN或者RNN网络,softmax分类输出,输出为one-hot型标签。


loss可以理解为预测输出pred与实际输出Y之间的差距,其中pred和Y均为one-hot型。

计算loss的意义在于为接下来的optimizer提供优化的指标,即optimizer优化的目的为最小化loss。

在使用softmax层进行分类时,loss一般使用交叉熵cross_entropy:

cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=Y, logits=pred)
loss = tf.reduce_sum(cross_entropy)

假设每批训练数据量(batch_size)为N,那么cross_entropy的数量也为N,loss为将所有N个交叉熵相加的值。

其中涉及了两个函数:


(1)tf.nn.softmax_cross_entropy_with_logits_v2()

英文说明:

Computes softmax cross entropy between `logits` and `labels`.

即计算预测量与实际量的交叉熵(简单来说就是偏离值),另外它是适用于softmax输出的。

① 先看输入参数和返回值:

def softmax_cross_entropy_with_logits_v2(_sentinel=None,  # pylint: disable=invalid-namelabels=None,logits=None,dim=-1,name=None):# ···return cost

其中labels为实际标签的概率比值,举例说明:

import numpy as np
import pandas as pd
labels = np.array(['Cat', 'Dog', 'Fish'])
print(pd.get_dummies(labels))
labels_onehot = np.asarray(pd.get_dummies(labels))
print(labels_onehot)

是指现在有三个input,标签labels分别是Cat、Dog和Fish:

我们可以对此这么理解:

input[0]的概率为Cat:100%, Dog:0%,Fish:0%

input[1]的概率为Cat:0%, Dog:100%,Fish:0%

input[2]的概率为Cat:0%, Dog:0%,Fish:100%

one-hot型式为:

这三个input在经过神经网络直到最后的softmax层后,会产生一组新的预测,即为logits:

logits = np.array(([[0.7, 0.3, 0.1], [0.3, 0.9, 0.1], [0.1, 0.1, 0.8]]))

这组数据可以理解为:

input[0]的概率为Cat:70%, Dog:30%,Fish:10%

input[1]的概率为Cat:30%, Dog:90%,Fish:10%

input[2]的概率为Cat:10%, Dog:10%,Fish:80%

那么计算预测与实际之间的偏差,即可以得到cost返回值,也就是cross_entropy。

cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=labels_onehot)with tf.Session() as sess:print(sess.run(cross_entropy))

这与我们的逻辑想法也是相符的,因为我们从上面可以看出对input[1]的预测是比input[0]的预测准确的,所以对input[1]的交叉熵计算也比input[0]小。

那么,这个函数是怎么计算交叉熵的呢?

② 直接上代码,自己写一个相同原理的函数softmax_cross_entropy(labels, logits):

cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=labels_onehot)
loss = tf.reduce_sum(cross_entropy)softmax_logits = tf.nn.softmax(logits)def softmax_cross_entropy(labels, logits):cross_entropy_all = np.array([])for m in range(len(labels)):cross_entropy = 0for n in range(len(labels[0])):cross_entropy += math.log(logits[m][n]) * float(labels[m][n])cross_entropy_all = np.append(cross_entropy_all, -cross_entropy)return cross_entropy_allwith tf.Session() as sess:print("tf.nn.softmax_cross_entropy_with_logits_v2", sess.run(cross_entropy))# print("loss = ", sess.run(loss))real_softmax_logits = sess.run(softmax_logits)print("softmax_cross_entropy", softmax_cross_entropy(labels_onehot, real_softmax_logits))

用公式表达就是:

* 需要注意的是softmax_cross_entropy_with_logits_v2会将输入自动用softmax函数计算一遍,

softmax = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), axis)

这意味着在实际的应用中,如果你最后的输出层以及是softmax输出层(或者利用softmax做激励函数)

那么loss直接用以下方法计算即可等同于计算交叉熵。

loss = -tf.reduce_sum(Y * tf.log(tf.clip_by_value(pred, 1e-36, 1.0)))

(2)tf.reduce_sum()

英文说明:

Computes the sum of elements across dimensions of a tensor.

即计算一个多维tensor变量的相加值,举例说明:

For example:```python
x = tf.constant([[1, 1, 1], [1, 1, 1]])
tf.reduce_sum(x)  # 6
tf.reduce_sum(x, 0)  # [2, 2, 2]
tf.reduce_sum(x, 1)  # [3, 3]
tf.reduce_sum(x, 1, keepdims=True)  # [[3], [3]]
tf.reduce_sum(x, [0, 1])  # 6
```
cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=labels_onehot)
loss = tf.reduce_sum(cross_entropy)with tf.Session() as sess:print(sess.run(cross_entropy))print("loss = ", sess.run(loss))

loss =  2.1790596743922306

机器学习中交叉熵cross entropy是什么,怎么计算?相关推荐

  1. 平均符号熵的计算公式_交叉熵(Cross Entropy)从原理到代码解读

    交叉熵(Cross Entropy)是Shannon(香浓)信息论中的一个概念,在深度学习领域中解决分类问题时常用它作为损失函数. 原理部分:要想搞懂交叉熵需要先清楚一些概念,顺序如下:==1.自信息 ...

  2. 交叉熵(cross entropy)概念整理

    网上写得实在是太乱,整理下: 交叉熵函数: H(p,q)=Ep[−logq]=−∑x∈χp(x)logq(x)①H(p,q)=E_p[-log\ q]=-\sum_{x\in \chi}p(x)log ...

  3. 相对熵与交叉熵_详解机器学习中的熵、条件熵、相对熵、交叉熵

    目录 信息熵 条件熵 相对熵 交叉熵 总结 一  信息熵 (information entropy) 熵 (entropy) 这一词最初来源于热力学.1948年,克劳德·爱尔伍德·香农将热力学中的熵引 ...

  4. 解释机器学习中的熵、联合熵、条件熵、相对熵和交叉熵

    原文地址:https://www.cnblogs.com/kyrieng/p/8694705.html 1.信息熵 (information entropy) 熵 (entropy) 这一词最初来源于 ...

  5. 详解机器学习中的熵、条件熵、相对熵、交叉熵

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 目录 信息熵 条件熵 相对熵 交叉熵 总结 一 信息熵 (info ...

  6. 熵,交叉熵,KL散度公式与计算实例 (转载学习)

    交叉熵(Cross Entropy)和KL散度(Kullback–Leibler Divergence)是机器学习中极其常用的两个指标,用来衡量两个概率分布的相似度,常被作为Loss Function ...

  7. matlab计算kl散度命令,熵,交叉熵,KL散度公式与计算实例

    交叉熵(Cross Entropy)和KL散度(Kullback–Leibler Divergence)是机器学习中极其常用的两个指标,用来衡量两个概率分布的相似度,常被作为Loss Function ...

  8. 深度学习中交叉熵_深度计算机视觉,用于检测高熵合金中的钽和铌碎片

    深度学习中交叉熵 计算机视觉 (Computer Vision) Deep Computer Vision is capable of doing object detection and image ...

  9. pytorch中交叉熵

    关于pytorch中交叉熵的使用,pytorch的交叉熵是其loss function的一种且包含了softmax的过程. pytorch中交叉熵函数是nn.CrossEntropyLoss().其参 ...

最新文章

  1. 利用数据寿命增加基于闪存的存储类存储器的使用寿命
  2. POJ2492 A Bug s Life 题解
  3. scss安装_安装了这9个免费PS插件后,终于能正常时间下班了……
  4. python求1到n的乘积_Python简单实现两个任意字符串乘积的方法示例
  5. Java 二维数组的初始化
  6. 联发科射频工程师题目_联发科技笔试题
  7. RedisTemplate中opsForValue()中的方法
  8. css vue 选项卡_vuejs实现标签选项卡动态更改css样式的方法
  9. python导入模块以及类_python模块的导入以及模块简介
  10. 系统架构设计师-软件水平考试(高级)-理论-项目管理
  11. 关于updatepanel回传之后JS失效问题
  12. vba动态二维数组_VBA学习笔记19:数组1
  13. 超变单职业传奇脱机辅助制作视频教程
  14. 软件质量管理体系 type:pdf_普宁iso14001环境管理体系AAA信用等级认证
  15. 第三方支付至支付宝对接
  16. LTspice使用第三方spice模型进行仿真
  17. 大学英语综合教程一 Unit 8 课文内容英译中 中英翻译
  18. Java 十进制转二进制
  19. Qt for WebAssembly in Windows
  20. 小学妹听了都说棒的:国王试毒酒问题

热门文章

  1. 工作分析文献综述_文献综述的写作步骤和注意事项
  2. Android各大发布市场
  3. 神经网络优化:病态矩阵与条件数
  4. tornado中数据库ORM操作(二):通过peewee-async集成到tornado中
  5. 务实推进中国云计算事业发展
  6. cmd修改dns指令
  7. 根据ip地址获取地理位置及坐标
  8. 电路板的地直接与外壳地通过并联电阻/电容相连接分析-ESD/EMC
  9. MTK LCM驱动知识
  10. 对VMware已经创建的虚拟机进行磁盘扩容