交叉熵损失函数是模型中非常常见的一种损失函数,tensorflow中有一个计算交叉熵的函数:tf.nn.sigmoid_cross_entropy_with_logits,也可以调用keras中的函数: tf.keras.backend.binary_crossentropy,需要注意的是两者的输入有一些不同。
先来看看tf自带的sigmoid_cross_entropy_with_logits:
tf.nn.sigmoid_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
sigmoid_cross_entropy_with_logits()需要两个参数,神经网络最后一层的输出logits和真实值labels。内部会经过一次sigmoid再计算cross entropy loss,计算方式如下所示:
令x = logits, z = labels
Loss = - 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))
即后面代码中的prob_error2式
tf.keras.backend.binary_crossentropy与sigmoid_cross_entropy_with_logits输入有一些不一样,因为keras是已经内部封装好的函数,所以要求的输入是神经网络经过sigmoid后的输出,binary_crossentropy在内部会先将输入转化为logits,然后再调用tf.nn.sigmoid_cross_entropy_with_logits计算交叉熵。
下面做一个简单的验证,注意两个函数输入的不同
import numpy as np
import