使用Python函数来计算交叉熵损失
交叉熵损失(Cross-Entropy Loss)是在深度学习中用来衡量模型预测结果与真实标签之间差异的一种损失函数,也是常用的分类问题损失函数之一。在本文中,我们将使用Python函数来计算交叉熵损失。
1. 交叉熵损失的定义
交叉熵损失是用来衡量两个概率分布之间的距离的一种函数。在深度学习中,通常使用交叉熵损失衡量模型预测结果与真实标签之间的距离。给定 $N$ 个样本的预测值 $\hat{y_i}$ 和真实标签 $y_i$,交叉熵损失定义为:
$$
\operatorname{Loss}=-\frac{1}{N} \sum_{i=1}^{N}\left(y_{i} \log \hat{y}_{i}+\left(1-y_{i}\right) \log \left(1-\hat{y}_{i}\right)\right)
$$
其中,$N$ 是样本数,$\hat{y_i}$ 是模型预测出的样本 $i$ 的类别概率分布,$y_i$ 是样本 $i$ 的真实标签。交叉熵损失的含义是:当模型的预测结果与真实标签一致时,交叉熵损失越小,反之则越大。
2. Python实现交叉熵损失函数
在Python中,我们可以通过使用NumPy库的数组操作和矩阵乘法来实现交叉熵损失函数。
import numpy as np
def cross_entropy_loss(y_pred, y_true):
"""
使用Python函数来计算交叉熵损失
:param y_pred: 模型预测出的样本的类别概率分布,形状为(N, C),N为样本数,C为类别数
:param y_true: 样本的真实标签,形状为(N, ),N为样本数,每个元素值为类别序号
:return: 交叉熵损失
"""
# 将y_true转化为one_hot编码
y_true = np.eye(y_pred.shape[1])[y_true]
# 计算交叉熵损失
loss = - np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
return loss
在函数中,我们使用了NumPy库中的eye函数来将 $y\_true$ 转换为one-hot编码形式,这样可以方便地与预测结果 $y\_pred$ 对应位置元素进行相乘。接着,我们使用了NumPy库中的mean函数来求出交叉熵损失的均值,即 $\frac{1}{N} \sum_{i=1}^{N}$。最后返回计算得到的交叉熵损失。
3. 案例演示
我们使用一个简单的分类问题数据集进行演示,该数据集有4个样本,每个样本有2个特征和1个标签。我们可以通过使用交叉熵损失函数来评估模型对该数据集的预测质量。
import matplotlib.pyplot as plt
# 定义数据集
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])
# 调用交叉熵损失函数
y_pred = np.array([[0.2, 0.8], [0.5, 0.5], [0.6, 0.4], [0.8, 0.2]])
loss = cross_entropy_loss(y_pred, y)
print("交叉熵损失为:", loss)
# 画出决策边界图(可视化)
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.05),
np.arange(x2_min, x2_max, 0.05))
Z = np.dot(np.c_[xx1.ravel(), xx2.ravel()], y_pred)
Z = np.argmax(Z, axis=1)
Z = Z.reshape(xx1.shape)
plt.contourf(xx1, xx2, Z, alpha=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.8)
plt.title('Decision Boundary')
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
运行代码,得到输出结果:
交叉熵损失为: 0.21616187468024224
同时也会得到可视化的决策边界图,如下图所示:

从可视化结果中可以看出,模型的预测结果准确地对这个简单的分类问题进行了拟合。
4. 总结
本文通过Python函数的方式演示了如何计算交叉熵损失。交叉熵损失在深度学习中是非常常用的损失函数之一,借助Python的强大生态,我们可以很方便地计算出这个损失函数的值,从而更好地评估模型的预测质量。
