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=0for prob, label in zip(probs, labels):s -= label * np.log(prob)return ssoftmax_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

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
