函数原型
tf.keras.losses.BinaryCrossentropy(
from_logits=False,
label_smoothing=0.0,
axis=-1,
reduction=losses_utils.ReductionV2.AUTO,
name='binary_crossentropy'
)
函数说明
BinaryCrossentropy函数用于计算二分类问题的交叉熵。交叉熵出自信息论中的一个概念,原来的含义是用来估算平均编码长度的。在机器学习领域中,其常常作为分类问题的损失函数。
交叉熵函数使用的公式如下:
参数from_logits默认为False,表示输出的logits需要经过激活函数的处理。比如,如果logits经过sigmoid函数处理后,logits的值域为(-1, 1);经过softmax激活函数处理,logits的取值范围为(0, 1)。但是如果没有经过激活函数处理,输出logits的值域为负无穷到正无穷之间。
函数使用
第一种情况,模型使用softmax激活函数输出logits:
# y_true使用one-hot编码,[0, 1]对应的是类型1,[1, 0]对应的类型0
# y_pred使用softmax激活函数,[0.8, 0.2]表示对应类型0的概率为0.8,对应类型1的概率为0.2
# batch_size=1
>>> y_true = [[0, 1]]
>>> y_pred = [[0.8, 0.2]]
>>> loss = tf.keras.losses.BinaryCrossentropy()
>>> loss_cal = loss(y_true, y_pred)
>>> loss_cal
<tf.Tensor: shape=(), dtype=float32, numpy=1.6094375>
# 使用数学公式实现
>>> a = 0 * math.log(0.8) + (1 - 0) * math.log(1 - 0.8)
>>> b = 1 * math.log(0.2) + (1 - 1) * math.log(1 - 0.2)
>>> loss_calc = - (a + b) / 2
>>> loss_calc
1.6094379124341005
# batch_size=2
>>> y_true = [[0, 1], [1, 0]]
>>> y_pred = [[0.8, 0.2], [0.5, 0.5]]
>>> loss_cal = loss(y_true, y_pred)
>>> loss_cal
<tf.Tensor: shape=(), dtype=float32, numpy=1.1512922>
第二种情况,模型使用sigmoid激活函数输出logits:
# y_true使用标签形式,1对应类型1,0对应类型0
# y_pred使用sigmoid激活函数,由于0.6相比0和1更靠近1,所以0.6更卡能对应的分类为1
# batch_size=1
>>> y_true = [1]
>>> y_pred = [0.6]
>>> loss_cal = loss(y_true, y_pred)
>>> loss_cal
<tf.Tensor: shape=(), dtype=float32, numpy=0.5108254>
# batch_size=4
>>> y_true = [1, 1, 0, 0]
>>> y_pred = [0.6, 0.5, 0.2, -0.5]
>>> loss_cal = loss(y_true, y_pred)
>>> loss_cal
<tf.Tensor: shape=(), dtype=float32, numpy=0.35677892>