趋近智
在 Keras 模型训练前,需要对其进行配置或“编译”。compile() 方法用于设置模型以进行训练。您提供给 compile() 的一个最主要的参数 (parameter)是 loss 函数。
损失函数 (loss function),也称为目标函数或成本函数,用来衡量模型性能的优劣。在训练过程中,目标是使此函数的值最小化。它计算模型预测值 () 与实际目标值 () 之间的差异大小。较小的损失值表示模型的预测值更接近真实值。
损失函数的选择与您正在解决的机器学习 (machine learning)问题的类型直接相关。我们来看一下常见任务的标准选择。
回归问题涉及预测连续值,例如房价或温度。
均方误差 (MSE): 这可能是回归问题最常用的损失函数。它计算预测值与真实值之间平方差的平均值。对差值进行平方会更严厉地惩罚较大误差,并确保结果始终为正。
其中 是样本数量。在 Keras 中,通常使用字符串标识符 'mean_squared_error' 或 'mse' 来指定它。
平均绝对误差 (MAE): 此损失函数计算预测值与真实值之间绝对差值的平均值。与 MSE 不同,MAE 不会对误差进行平方,这使其对离群值不那么敏感。如果您的数据集中包含您不希望主导损失的显著离群值,MAE 可能是一个更好的选择。
您可以使用 'mean_absolute_error' 或 'mae' 来指定它。
分类问题涉及预测离散的类别标签,例如识别垃圾邮件或对图像进行分类。
二元交叉熵: 将此损失函数用于二元(两类)分类问题。它衡量真实概率分布(例如 [0, 1] 或 [1, 0])与预测概率分布之间的距离。它要求模型的最后一层具有一个带有 sigmoid 激活函数 (activation function)(输出 0 到 1 之间的概率)的单个输出单元,并且目标值应为 0 或 1。单个预测的二元交叉熵公式为:
最终损失值在所有样本上取平均。使用字符串 'binary_crossentropy' 来指定它。
分类交叉熵: 当您的目标标签是独热编码时,这是多类分类的标准损失函数。例如,如果您有三类,目标可能看起来像 [1, 0, 0]、[0, 1, 0] 或 [0, 0, 1]。它要求模型的最后一层具有 个输出单元(其中 是类别数量)并使用 softmax 激活函数,该函数输出所有类别的概率分布。单个样本的公式为:
其中 是类别数量。最终损失值在所有样本上取平均。使用字符串 'categorical_crossentropy' 来指定它。
稀疏分类交叉熵: 此损失函数与分类交叉熵用途相同,但用于目标标签以整数形式(例如,三类为 0、1、2)而不是独热编码向量 (vector)形式提供的情况。这通常更方便,因为它避免了将整数标签显式转换为独热向量的需要。模型输出要求( 个单元,softmax 激活)与分类交叉熵相同。使用 'sparse_categorical_crossentropy' 来指定它。与使用带有显式独热编码标签的 'categorical_crossentropy' 相比,这通常可以节省内存和计算量,特别是对于大量类别的情况。
您将选择的损失函数提供给 model.compile() 方法中的 loss 参数 (parameter)。您通常可以通过两种方式来执行此操作:
使用字符串标识符: 传入所需损失函数的字符串名称。Keras 识别常见的损失函数,例如 'mean_squared_error'、'binary_crossentropy'、'categorical_crossentropy' 和 'sparse_categorical_crossentropy'。这是标准损失最常用的方法。
# 对于回归问题
model.compile(optimizer='adam', loss='mean_squared_error')
# 对于二元分类问题
model.compile(optimizer='rmsprop', loss='binary_crossentropy')
# 对于多类分类问题(独热标签)
model.compile(optimizer='adam', loss='categorical_crossentropy')
# 对于多类分类问题(整数标签)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
使用损失函数对象: 从 tf.keras.losses 模块实例化一个损失函数对象。如果损失函数接受参数,这允许进行潜在的自定义,尽管标准使用通常不需要这样做。
import tensorflow as tf
mse_loss = tf.keras.losses.MeanSquaredError()
bce_loss = tf.keras.losses.BinaryCrossentropy()
cce_loss = tf.keras.losses.CategoricalCrossentropy()
scce_loss = tf.keras.losses.SparseCategoricalCrossentropy()
# 使用示例:
model.compile(optimizer='adam', loss=mse_loss)
# 或者直接传入类
model.compile(optimizer='adam', loss=tf.keras.losses.MeanSquaredError())
虽然 TensorFlow 提供了广泛的内置损失函数,但如果您的问题需要标准选项未涵盖的特定目标,您也可以定义自己的自定义损失函数。这通常涉及创建一个 Python 函数,该函数以 y_true 和 y_pred 作为参数,并返回计算出的损失值作为张量。
选择正确的损失函数是模型成功训练的基础。它直接定义了模型在优化过程中尝试实现的目标。定义损失后,编译模型的下一步是选择一个优化器,它规定了如何更新模型的权重 (weight)以最小化此损失。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造