import numpy as np
import tensorflow as tf
y_true = np.array([0, 1, 0]) # 独热编码
y_pred = np.array([0.5, 0.2, 0.3]) # 预测概率
delta = 1e-7
计算公式
l o s s = 1 n ∑ i t r u e i × ( − l o g e p r e d i + l e − 7 ) loss = \frac{1}{n}\sum_{i}^{}true_{i}\times \left ( -log_{e}^{pred_{i}+le^{-7}}\right ) loss=n1∑itruei×(−logepredi+le−7)
n:样本数
true : y_true
pred : y_pred
计算过程
− [ ( 0 × l o g e 0.5 + l e − 7 ) + ( 1 × l o g e 0.2 + l e − 7 ) + ( 0 × l o g e 0.3 + l e − 7 ) ] = 1.6094374124342252 -[(0 \times log_{e}^{0.5+le^{-7}})+(1 \times log_{e}^{0.2+le^{-7}})+(0 \times log_{e}^{0.3+le^{-7}})]=1.6094374124342252 −[(0×loge0.5+le−7)+(1×loge0.2+le−7)+(0×loge0.3+le−7)]=1.6094374124342252
tf.keras.losses.CategoricalCrossentropy 实现
cce = tf.keras.losses.CategoricalCrossentropy()
cce(y_true, y_pred).numpy()
1.6094377040863037
numpy 实现
y_pred = y_pred+delta # 添加一个微小值可以防止负无限大(np.log(0))的发生。
print(y_pred)
[0.5000001 0.2000001 0.3000001]
y_pred_log = np.log(y_pred) # log表示以e为底数的自然对数
print(y_pred_log)
[-0.69314698 -1.60943741 -1.20397247]
print(y_true*y_pred_log)
[-0. -1.60943741 -0. ]
loss = -np.sum(y_true*y_pred_log)
print(loss)
1.6094374124342252