【转载】Tensorflow 分类函数(交叉熵的计算)

https://www.cnblogs.com/guqiangjs/p/8202899.html


命名空间:tf.nn

函数作用说明

sigmoid_cross_entropy_with_logits计算 给定 logits 的S函数 交叉熵。测量每个类别独立且不相互排斥的离散分类任务中的概率。(可以执行多标签分类,其中图片可以同时包含大象和狗。)

weighted_cross_entropy_with_logits计算加权交叉熵。

softmax_cross_entropy_with_logits计算 logits 和 labels 之间的 softmax 交叉熵。测量类别相互排斥的离散分类任务中的概率(每个条目恰好在一个类别中)。(有一个且只有一个标签:图像可以是狗或卡车,但不能同时为两个。)

注意: 每行labels[i]必须是有效的概率分布。如果不是,梯度的计算将是不正确的。

警告此操作期望未缩放的logits,因为它softmax 在logits内部执行效率。不要用这个输出来调用这个op softmax,因为它会产生不正确的结果。

lables的数据必须经过One-Hot Encodingtf.one_hot)

sparse_softmax_cross_entropy_with_logits计算 logits 和 labels 之间的 稀疏softmax 交叉熵。测量类别相互排斥的离散分类任务中的概率(每个条目恰好在一个类别中)。(有一个且只有一个标签:图像可以是狗或卡车,但不能同时为两个。)

注意: 对于此操作,给定标签的概率被认为是独占的。也就是说,不允许使用软类,并且labels向量必须为每个logits(每个minibatch条目)的每一行的真类提供单个特定索引 。对于每个条目的概率分布的软softmax分类,请参阅 softmax_cross_entropy_with_logits

警告此操作期望未缩放的logits,因为它softmax 在logits内部执行效率。不要用这个输出来调用这个op softmax,因为它会产生不正确的结果。

softmax计算 softmax 激活。相当于 softmax = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), dim)

log_softmax计算 对数 softmax激活。logsoftmax = logits - log(reduce_sum(exp(logits), dim))

tf.nn.sigmoid_cross_entropy_with_logits

该函数计算的是 logits 与 lables 的每一个对应维度上对应元素的损失值。数值越小,表示损失值越小。

importtensorflowastf_logits = [[0.5,0.7,0.3], [0.8,0.2,0.9]]_one_labels = tf.ones_like(_logits)_zero_labels = tf.zeros_like(_logits)withtf.Session()assess:    loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=_logits, labels=_one_labels)# [[0.47407699  0.40318602  0.5543552]#  [0.37110069  0.59813887  0.34115386]]print(sess.run(loss))    loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=_logits, labels=_zero_labels)# [[0.97407699  1.10318601  0.85435522]#  [1.17110074  0.79813886  1.24115384]]print(sess.run(loss))

weighted_cross_entropy_with_logits

weighted_cross_entropy_with_logits 是 sigmoid_cross_entropy_with_logits 的拓展版,输入参数和实现和后者差不多,可以多支持一个 pos_weight 参数,目的是可以增加或者减小正样本在算 Cross Entropy 时的 Loss 。

通常的交叉熵成本定义为:targets * -log(sigmoid(logits)) + (1 - targets) * -log(1 - sigmoid(logits))

这个 pos_weight 被用作积极目标的乘数:targets * -log(sigmoid(logits)) * pos_weight + (1 - targets) * -log(1 - sigmoid(logits))

tf.nn.softmax_cross_entropy_with_logits

该函数与 sigmoid_cross_entropy_with_logits 的区别在于,sigmoid_cross_entropy_with_logits 中的labels 中每一维可以包含多个 1 ,而 softmax_cross_entropy_with_logits ,只能包含一个 1

用 mnist 数据举例,如果是目标值是3,那么 label 就是[0,0,0,1,0,0,0,0,0,0],除了第4个值为1,其他全为0。(数据必须经过 One-Hot Encoding 编码

该函数把一个维度上的 labels 作为一个整体判断,结果给出整个维度的损失值。(而 sigmoid_cross_entropy_with_logits 是每一个元素都有一个损失值)

如果是多目标问题,经过softmax就不会得到多个和为1的概率,而且label有多个1也无法计算交叉熵,因此这个函数只适合单目标的二分类或者多分类问题。

这个函数传入的 logits 是 unscaled 的,既不做 sigmoid 也不做 softmax ,因为函数实现会在内部更高效得使用 softmax 。

importtensorflowastf_logits = [[0.3,0.2,0.2], [0.5,0.7,0.3], [0.1,0.2,0.3]]_labels = [0,1,2]withtf.Session()assess:# Softmax本身的算法很简单,就是把所有值用e的n次方计算出来,求和后算每个值占的比率,保证总和为1,一般我们可以认为Softmax出来的就是confidence也就是概率# [[0.35591307  0.32204348  0.32204348]#  [0.32893291  0.40175956  0.26930749]#  [0.30060959  0.33222499  0.36716539]]print(sess.run(tf.nn.softmax(_logits)))# 对 _logits 进行降维处理,返回每一维的合计# [1.  1.  0.99999994]print(sess.run(tf.reduce_sum(tf.nn.softmax(_logits),1)))# 传入的 lables 需要先进行 独热编码 处理。loss = tf.nn.softmax_cross_entropy_with_logits(logits=_logits, labels=tf.one_hot(_labels,depth=len(_labels)))# [ 1.03306878  0.91190147  1.00194287]print(sess.run(loss))

tf.one_hot

独热编码

importtensorflowastfwithtf.Session()assess:    _v = tuple(range(0,5))# [[ 1.  0.  0.  0.  0.]#  [ 0.  1.  0.  0.  0.]#  [ 0.  0.  1.  0.  0.]#  [ 0.  0.  0.  1.  0.]#  [ 0.  0.  0.  0.  1.]]print(sess.run(tf.one_hot(_v, len(_v))))

sparse_softmax_cross_entropy_with_logits

sparse_softmax_cross_entropy_with_logits 是 softmax_cross_entropy_with_logits 的易用版本,除了输入参数不同,作用和算法实现都是一样的。

区别是:softmax_cross_entropy_with_logits 要求传入的 labels 是经过 one_hot encoding 的数据,而 sparse_softmax_cross_entropy_with_logits 不需要。

importtensorflowastf_logits = [[0.3,0.2,0.2], [0.5,0.7,0.3], [0.1,0.2,0.3]]_labels = [0,1,2]withtf.Session()assess:# loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=_logits, labels=_labels)# 结果与 softmax_cross_entropy_with_logits 相同,区别就是 labels 传入参数时不需要做 one_hot encoding。# [ 1.03306878  0.91190147  1.00194287]print(sess.run(loss))

softmax

softmax 公式:

Softmax本身的算法很简单,就是把所有值用e的n次方计算出来,求和后算每个值占的比率,保证总和为1,一般我们可以认为Softmax出来的就是confidence也就是概率

该功能执行相当于 softmax = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), dim)

importtensorflowastfwithtf.Session()assess:    _v = tf.Variable(tf.random_normal([1,5], seed=1.0))    sess.run(tf.global_variables_initializer())# [[-0.81131822  1.48459876  0.06532937 -2.4427042  0.0992484]]print(sess.run(_v))# [[0.06243069  0.6201579  0.15001042  0.01221508  0.15518591]]print(sess.run(tf.nn.softmax(_v)))# 1.0print(sess.run(tf.reduce_sum(tf.nn.softmax(_v))))

log_softmax

该功能执行相当于 logsoftmax = logits - log(reduce_sum(exp(logits), dim))

内容来源:

TensorFlow

TensorFlow四种Cross Entropy算法实现和应用

数据预处理:独热编码(One-Hot Encoding)

[Tensorflow]1.交叉熵(Cross Entropy)算法实现及应用

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容