交叉熵损失的背景和数学原理
交叉熵损失是用于度量模型输出与实际标签之间差异的一种损失函数。在分类问题中,我们希望模型的预测结果尽可能接近真实标签,交叉熵损失就是基于概率分布的思想,衡量模型输出概率分布与实际标签概率分布之间的差异。
对于单个样本,交叉熵损失的数学表达式为:
H ( y , y ^ ) = − ∑ i y i ⋅ log ( y ^ i ) H(y, \hat{y}) = -\sum_{i} y_i \cdot \log(\hat{y}_i) H(y,y^)=−i∑yi⋅log(y^i)
其中, y y y 表示真实标签的概率分布, y ^ \hat{y} y^ 表示模型的预测概率分布, y i y_i yi 和 y ^ i \hat{y}_i y^i 分别是真实标签和模型预测的第 i i i 类的概率。
TensorFlow 中的交叉熵损失应用
在 TensorFlow 中,可以使用 tf.keras.losses.CategoricalCrossentropy
或 tf.keras.losses.SparseCategoricalCrossentropy
来计算交叉熵损失。如果标签是独热编码的形式,可以使用 CategoricalCrossentropy
,如果标签是整数形式,可以使用 SparseCategoricalCrossentropy
。
import tensorflow as tf
# 创建模型
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)), # 将图像扁平化为 784 的形状
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss=tf.keras.losses.CategoricalCrossentropy(),
metrics=['accuracy'])
# 加载数据集并进行预处理
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
# 将标签进行独热编码
y_train = tf.keras.utils.to_categorical(y_train, num_classes=10)
y_test = tf.keras.utils.to_categorical(y_test, num_classes=10)
# 设置 TensorBoard 回调
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir="logs")
# 训练模型
model.fit(x_train, y_train, epochs=10,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback])
# 评估模型
model.evaluate(x_test, y_test, verbose=2)