文章目录
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

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

1万+

被折叠的 条评论
为什么被折叠?



