机器学习中交叉熵cross entropy是什么,怎么计算?
项目背景:人体动作识别(分类),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是什么,怎么计算?相关推荐
- 平均符号熵的计算公式_交叉熵(Cross Entropy)从原理到代码解读
交叉熵(Cross Entropy)是Shannon(香浓)信息论中的一个概念,在深度学习领域中解决分类问题时常用它作为损失函数. 原理部分:要想搞懂交叉熵需要先清楚一些概念,顺序如下:==1.自信息 ...
- 交叉熵(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 ...
- 相对熵与交叉熵_详解机器学习中的熵、条件熵、相对熵、交叉熵
目录 信息熵 条件熵 相对熵 交叉熵 总结 一 信息熵 (information entropy) 熵 (entropy) 这一词最初来源于热力学.1948年,克劳德·爱尔伍德·香农将热力学中的熵引 ...
- 解释机器学习中的熵、联合熵、条件熵、相对熵和交叉熵
原文地址:https://www.cnblogs.com/kyrieng/p/8694705.html 1.信息熵 (information entropy) 熵 (entropy) 这一词最初来源于 ...
- 详解机器学习中的熵、条件熵、相对熵、交叉熵
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 目录 信息熵 条件熵 相对熵 交叉熵 总结 一 信息熵 (info ...
- 熵,交叉熵,KL散度公式与计算实例 (转载学习)
交叉熵(Cross Entropy)和KL散度(Kullback–Leibler Divergence)是机器学习中极其常用的两个指标,用来衡量两个概率分布的相似度,常被作为Loss Function ...
- matlab计算kl散度命令,熵,交叉熵,KL散度公式与计算实例
交叉熵(Cross Entropy)和KL散度(Kullback–Leibler Divergence)是机器学习中极其常用的两个指标,用来衡量两个概率分布的相似度,常被作为Loss Function ...
- 深度学习中交叉熵_深度计算机视觉,用于检测高熵合金中的钽和铌碎片
深度学习中交叉熵 计算机视觉 (Computer Vision) Deep Computer Vision is capable of doing object detection and image ...
- pytorch中交叉熵
关于pytorch中交叉熵的使用,pytorch的交叉熵是其loss function的一种且包含了softmax的过程. pytorch中交叉熵函数是nn.CrossEntropyLoss().其参 ...
最新文章
- 利用数据寿命增加基于闪存的存储类存储器的使用寿命
- POJ2492 A Bug s Life 题解
- scss安装_安装了这9个免费PS插件后,终于能正常时间下班了……
- python求1到n的乘积_Python简单实现两个任意字符串乘积的方法示例
- Java 二维数组的初始化
- 联发科射频工程师题目_联发科技笔试题
- RedisTemplate中opsForValue()中的方法
- css vue 选项卡_vuejs实现标签选项卡动态更改css样式的方法
- python导入模块以及类_python模块的导入以及模块简介
- 系统架构设计师-软件水平考试(高级)-理论-项目管理
- 关于updatepanel回传之后JS失效问题
- vba动态二维数组_VBA学习笔记19:数组1
- 超变单职业传奇脱机辅助制作视频教程
- 软件质量管理体系 type:pdf_普宁iso14001环境管理体系AAA信用等级认证
- 第三方支付至支付宝对接
- LTspice使用第三方spice模型进行仿真
- 大学英语综合教程一 Unit 8 课文内容英译中 中英翻译
- Java 十进制转二进制
- Qt for WebAssembly in Windows
- 小学妹听了都说棒的:国王试毒酒问题