交叉熵 CrossEntropy 在tensorflow中的实现方法

tensorflow 中交叉熵损失函数的计算方法

下列代码中

  1. l1 是自定义计算方式
  2. l2 是利用 tf.nn.softmax_cross_entropy_with_logits_v2 输入的真实标签需要onehot处理
  3. l3 是利用 tf.nn.sparse_softmax_cross_entropy_with_logits
    输入的真实标签是原始多分类中的为1的类别的索引
  4. l4 是losses方法直接计算出最终loss,相比于上述方法,多求了一个平均值。但是在函数内部,这个loss被收入到 GraphKeys.LOSSES 中。

一般不建议用自定义函数来实现交叉熵,因为会有边界条件的判断来自己设置,比如***“ z = - tf.log(y + 1e-12) ”*** ,这里加了一个极小值,保证log函数的输入不是0. 类似的情况在其他给定的函数api中都有解决方案,不用过多担心。

import tensorflow as tf

x = tf.constant([[0.1,0.5,1.1], [10,3,2.]])
label = tf.constant([2,0])
label_onehot = tf.one_hot(label, depth=3)

y = tf.nn.softmax(x)
z = - tf.log(y + 1e-12)
l1 =  tf.reduce_sum(label_onehot * z, axis=1)

l2 = tf.nn.softmax_cross_entropy_with_logits_v2(labels=label_onehot, logits=x)

l3 = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=label, logits=x)

l1_mean = tf.reduce_mean(l1)
l2_mean = tf.reduce_mean(l2)
l3_mean = tf.reduce_mean(l3)
l4 = tf.losses.softmax_cross_entropy(onehot_labels=label_onehot, logits=x) # 额外在ops.GraphKeys.LOSSES加入这个loss

with tf.Session() as sess:
    print("l1:", sess.run(l1), sess.run(l1_mean))
    print("l2:", sess.run(l2), sess.run(l2_mean))
    print("l3:", sess.run(l3), sess.run(l3_mean))

以上代码的输入结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值