tensorflow 中的 cross_entropy

本文详细介绍了tf.nn.sigmoid_cross_entropy_with_logits、tf.nn.softmax_cross_entropy_with_logits和tf.nn.sparse_softmax_cross_entropy_with_logits三个深度学习中常用的损失函数。通过手动实现与官方函数对比,展示了它们的计算过程和输入输出要求。同时,强调了每个函数适用的场景,如二分类、多分类及稀疏标签的处理。

tf.nn.sigmoid_cross_entropy_with_logits

BinaryCrossentropy这个函数不接受整数的数据类型。
在这里插入图片描述labels 和 logits 中的每一个值一一对应计算了 cross_entropy 值。
输入的 logit 并不在 0,1 之间,而是会经过内部的 sigmoid 转换为概率,介于 0,1 之间。

z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))
= z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x)))
= z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x)))
= z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))
= (1 - z) * x + log(1 + exp(-x))
= x - x * z + log(1 + exp(-x))

自己手写一个计算方式如下

def sigmoid(x):
    return np.log(1/ (1 + np.exp(-x)) )

def cross_entropy(logit, label):
    ent = label * sigmoid(logit) + (1-label) * (1 - sigmoid(logit))
    return ent
cross_entropy(1, 0)

对比计算直接调用的结果

logits = tf.constant([[1., -1., 0., 1., -1., 0., 0.], [1., -1., 0., 1., -1., 0., 0.]])
labels = tf.constant([[0., 0., 0., 1., 1., 1., 0.5], [0., 0., 0., 1., 1., 1., 0.5]])
tf.nn.sigmoid_cross_entropy_with_logits(labels=labels, logits=logits).numpy()

输入输出形状

必须一一对应,完全一样。

tf.nn.softmax_cross_entropy_with_logits

softmax_cross_entropy_with_logits 适合处理多分类的情况,但是需要是 soft_multiclass_labels 的形式。
在这里插入图片描述

手写计算方式

def softmax_cross_entropy(logits, labels):
    probs = tf.nn.softmax(logits)
    s=0
    for prob, label in zip(probs, labels):
        s -= label * np.log(prob)
    return s

softmax_cross_entropy(logits=[0.0, 5.0, 1.0], labels=[0.0, 0.8, 0.2])

对比直接调用结果

logits = [[4.0, 2.0, 1.0], [0.0, 5.0, 1.0]]
labels = [[1.0, 0.0, 0.0], [0.0, 0.8, 0.2]]
tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)

tf.nn.sparse_softmax_cross_entropy_with_logits

相比于 softmax_cross_entropy_with_logits ,只是输入变了,是hard_label, 也就是没有 one-hot 或者multi-hot 处理的格式。

相类比的可以理解下面这些函数的计算。
tf.keras.losses.BinaryCrossentropy
tf.keras.losses.binary_crossentropy
tf.keras.metrics.BinaryCrossentropy

tf.keras.losses.CategoricalCrossentropy
tf.keras.losses.categorical_crossentropy
tf.keras.metrics.CategoricalCrossentropy

tf.keras.losses.SparseCategoricalCrossentropy
tf.keras.losses.sparse_categorical_crossentropy
tf.keras.metrics.SparseCategoricalCrossentropy

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RessCris

老铁门多支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值