tensorflow损失函数及实现

本文详细介绍了深度学习中常用的损失函数,包括分类任务中的交叉熵损失(多分类及二分类)以及回归任务中的MAE、MSE和Smooth L1损失,并提供了TensorFlow中的实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         在深度学习中, 损失函数是⽤来衡量模型参数的质量的函数, 衡量的⽅式是 ⽐较⽹络输出和真实输出的差异,损失函数在不同的⽂献中名称是不⼀样 的,主要有以下⼏种命名⽅式:

1.分类任务

        在深度学习的分类任务中使⽤最多的是交叉熵损失函数,所以在这⾥我们 着重介绍这种损失函数。

1.1 多分类任务

        在多分类任务通常使⽤softmax将logits转换为概率的形式,所以多分类的 交叉熵损失也叫做softmax损失,它的计算⽅法是:

 \mathcal{L}=-\sum_{i=1}^n \mathbf{y}_i \log \left(S\left(f_\theta\left(\mathbf{x}_i\right)\right)\right)

其中,y是样本x属于某⼀个类别的真实概率,⽽f(x)是样本属于某⼀类别 的预测分数,S是softmax函数,L⽤来衡量p,q之间差异性的损失结果。 例⼦:

上图中的交叉熵损失为:

-(0 \log (0.10)+1 \log (0.7)+0 \log (0.2))=-\log 0.7

从概率⻆度理解,我们的⽬的是最⼩化正确类别所对应的预测概率的对数 的负值,如下图所示:

在tf.keras中使⽤CategoricalCrossentropy实现,如下所示: 

# 导⼊相应的包 
import tensorflow as tf 
# 设置真实值和预测值 
y_true = [[0, 1, 0], [0, 0, 1]] 
y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]] 
# 实例化交叉熵损失 
cce = tf.keras.losses.CategoricalCrossentropy() 
# 计算损失结果 
cce(y_true, y_pred)
结果为:
1.176939

 1.2 ⼆分类任务

        在处理⼆分类任务时,我们不在使⽤softmax激活函数,⽽是使⽤sigmoid 激活函数,那损失函数也相应的进⾏调整,使⽤⼆分类的交叉熵损失函 数:

L=-y \log \hat{y}-(1-y) \log (1-\hat{y})

其中,y是样本x属于某⼀个类别的真实概率,⽽y^是样本属于某⼀类别的 预测概率,L⽤来衡量真实值与预测值之间差异性的损失结果。

        在tf.keras中实现时使⽤BinaryCrossentropy(),如下所示:

# 导⼊相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0], [1]]
y_pred = [[0.4], [0.6]]
# 实例化⼆分类交叉熵损失
bce = tf.keras.losses.BinaryCrossentropy()
# 计算损失结果
bce(y_true, y_pred)
结果为:
0.5108254

2.回归任务

 回归任务中常⽤的损失函数有以下⼏种:

2.1 MAE损失

Mean absolute loss(MAE)也被称为L1 Loss,是以绝对误差作为距离: 

\mathcal{L}=\frac{1}{n} \sum_{i=1}^n\left|y_i-f_\theta\left(x_i\right)\right|

曲线如下图所示:

        特点是:由于L1 loss具有稀疏性,为了惩罚较⼤的值,因此常常将其作为 正则项添加到其他loss中作为约束。L1 loss的最⼤问题是梯度在零点不平 滑,导致会跳过极⼩值。

在tf.keras中使⽤MeanAbsoluteError实现,如下所示:

# 导⼊相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0.], [0.]]
y_pred = [[1.], [1.]]
# 实例化MAE损失
mae = tf.keras.losses.MeanAbsoluteError()
# 计算损失结果
mae(y_true, y_pred)
结果为:
1.0

2.2 MSE损失

        Mean Squared Loss/ Quadratic Loss(MSE loss)也被称为L2 loss,或欧 ⽒距离,它以误差的平⽅和作为距离: 

\mathcal{L}=\frac{1}{n} \sum_{i=1}^n\left(y_i-f_\theta\left(x_i\right)\right)^2

曲线如下图所示:

 特点是:L2 loss也常常作为正则项。当预测值与⽬标值相差很⼤时, 梯度 容易爆炸。

        在tf.keras中通过MeanSquaredError实现:

# 导⼊相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0.], [1.]]
y_pred = [[1.], [1.]]
# 实例化MSE损失
mse = tf.keras.losses.MeanSquaredError()
# 计算损失结果
mse(y_true, y_pred)
结果为:
0.5

2.3 smooth L1

损失 Smooth L1损失函数如下式所示:

\operatorname{smooth}_{L_1}(x)=\left\{\begin{array}{ll}0.5 x^2 & \text { if }|x|<1 \\ |x|-0.5 & \text { otherwise }\end{array}\right.

其中:𝑥=f(x)−y 为真实值和预测值的差值。

         从上图中可以看出,该函数实际上就是⼀个分段函数,在[-1,1]之间实际 上就是L2损失,这样解决了L1的不光滑问题,在[-1,1]区间外,实际上就 是L1损失,这样就解决了离群点梯度爆炸的问题。通常在⽬标检测中使⽤ 该损失函数。

         在tf.keras中使⽤Huber计算该损失,如下所示:

# 导⼊相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0], [1]]
y_pred = [[0.6], [0.4]]
# 实例化smooth L1损失
h = tf.keras.losses.Huber()
# 计算损失结果
h(y_true, y_pred)
结果:
0.18

总结

        知道分类任务的损失函数

多分类的交叉熵损失函数和⼆分类的交叉熵损失函数。

        知道回归任务的损失函数

MAE,MSE,smooth L1损失函数。

### 关于TensorFlow中自定义损失函数实现TensorFlow框架下,可以通过多种方式构建和修改损失函数来满足特定需求。以下是关于如何创建并应用自定义损失函数的一个具体实例。 #### 创建自定义损失函数 通过继承`tf.keras.losses.Loss`类或者直接编写一个返回标量张量的函数可以完成自定义损失函数的设计。下面展示了一个基于均方误差(MSE)的简单扩展版本: ```python import tensorflow as tf class CustomLoss(tf.keras.losses.Loss): def __init__(self, regularization_factor=0.1, name="custom_loss"): super().__init__(name=name) self.regularization_factor = regularization_factor def call(self, y_true, y_pred): mse = tf.reduce_mean(tf.square(y_true - y_pred)) reg_term = self.regularization_factor * tf.reduce_sum([tf.nn.l2_loss(var) for var in model.trainable_variables]) return mse + reg_term ``` 此代码片段展示了如何将L2正则化项加入到标准MSE损失之中[^1]。 #### 使用指数衰减学习率优化器配合自定义损失函数训练模型 为了提高模型收敛速度以及最终效果,在实际项目里通常会采用动态调整的学习策略比如指数衰减法。这里给出一段完整的例子说明如何设置这种机制并与上述定制好的损失一起工作: ```python initial_learning_rate = 0.1 decay_steps = 10000 decay_rate = 0.96 learning_schedule = tf.keras.optimizers.schedules.ExponentialDecay( initial_learning_rate, decay_steps, decay_rate) optimizer = tf.keras.optimizers.SGD(learning_rate=learning_schedule) model.compile(optimizer=optimizer, loss=CustomLoss()) history = model.fit(x_train, y_train, epochs=num_epochs, batch_size=batch_size) ``` 这段脚本首先定义了一个随时间逐步减少初始值为0.1的学习速率计划;接着利用该方案初始化随机梯度下降(SGD)算法作为我们的求解工具;最后把之前建立起来的新颖型态的目标函数装配进整个神经网络体系结构当中去执行正式的教学过程[^2]。 #### 结合北大资源探讨更深层次的应用场景 除了基本操作之外,还可以考虑引入更多高级特性例如但不限于:多任务联合学习、对抗生成网络(GANs)中的判别器损耗设计等等复杂情形下的解决方案探索。对于中文环境特别关注领域内的朋友来说,则不妨尝试融合诸如PKUSeg之类的本土优秀成果来进行跨学科交叉创新实践尝试[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XMM-struggle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值