Tensorflow损失函数(一)

本文深入解析TensorFlow内置的四种损失函数,包括softmax交叉熵、sparse softmax交叉熵、sigmoid交叉熵及加权sigmoid交叉熵。文章详细介绍了这些函数的参数、应用场景及如何正确使用,帮助读者掌握损失函数在神经网络训练中的核心作用。

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

我主要分三篇文章给大家介绍tensorflow的损失函数,本篇为tensorflow内置的四个损失函数

(一)tensorflow内置的四个损失函数
(二)其他损失函数
(三)自定义损失函数

损失函数(loss function),量化了分类器输出的结果(预测值)和我们期望的结果(标签)之间的差距,这和分类器结构本身同样重要。有很多的学者花费心思探讨如何改良损失函数使得分类器的结果最优,因此学会如何使用Tensorflow中的损失函数以及学会自己构建损失函数是非常重要的。

首先我们先规定一些变量这样方便大家之后更加清楚的读懂如何使用损失函数。

  1. Labels :标签,在分类或者分割等问题中的标准答案。可以是1,2,3,4,5,6 。
  2. Labels_onehot : Onehot形式的标签,即如果有3类那么第一类表示为[1,0,0],第二类为[0,1,0],第三类为[0,0,1]。这种形式的标签更加的常见。
  3. Network.out : 网络最后一层的输出,注意是没有经过softmax的网络的输出,通常是softmax函数的输入值。
  4. Network.probs : 网络输出的概率结果,通常为网络最后一层输出经过softmax函数之后的结果,Network.probs=tf.nn.softmax(Network.out)
  5. Network.pred : 网络的预测结果,在onehot的形式中选择概率最大的一类作为最终的预测结果,Network.pred=tf.argmax(Network.probs
    , axis=n)。
  6. Tensor : 一个张量,可以简单的理解为是tensorflow中的一个数组。
  7. tf.reduce_sum(Tensor) : 降维加和,比如一个数组是333大小的,那么经过这个操作之后会变为一个数字,即所有元素的加和。
  8. tf.reduce_mean(Tensor):降维平均,和上面的reduce_sum一样,将高维的数组变为一个数,该数是数组中所有元素的均值。

Tensorflow 内置的四个损失函数 ↓

下面我们就进入正题啦。Tf内置的损失函数一共有四个,弄懂了一个其余的就基本理解了,下面我们就逐一的介绍,其中第一个重点介绍,其余的建立在大家对第一个理解的基础之上。

  • ① Tensor=tf.nn.softmax_cross_entropy_with_logits(logits= Network.out, labels= Labels_onehot)

上面是softmax交叉熵loss,参数为网络最后一层的输出和onehot形式的标签。切记输入一定不要经过softmax,因为在函数中内置了softmax操作,如果再做就是重复使用了。在计算loss的时候,输出Tensor要加上tf.reduce_mean(Tensor)或者tf.reduce_sum(Tensor),作为tensorflow优化器(optimizer)的输入。

  • ② Tensor=tf.nn.sparse_softmax_cross_entropy_with_logits (logits=Network.out, labels= Labels)

这个函数和上面的区别就是labels参数应该是没有经过onehot的标签,其余的都是一样的。另外加了sparse的loss还有一个特性就是标签可以出现-1,如果标签是-1代表这个数据不再进行梯度回传。

  • ③ Tensor=tf.nn. sigmoid_cross_entropy_with_logits (logits= Network.out, labels= Labels_onehot)

sigmoid交叉熵loss,与softmax不同的是,该函数首先进行sigmoid操作之后计算交叉熵的损失函数,其余的特性与tf.nn.softmax_cross_entropy_with_logits一致。

  • ④Tensor=tf.nn.weighted_cross_entropy_with_logits (logits=Network.out, labels=Labels_onehot, pos_weight=decimal_number)

这个loss与众不同的地方就是加入了一个权重的系数,其余的地方与tf.nn. sigmoid_cross_entropy_with_logits这个损失函数是一致的,加入的pos_weight函数可以适当的增大或者缩小正样本的loss,可以一定程度上解决正负样本数量差距过大的问题。对比下面两个公式我们可以更加清晰的看到,他和sigmoid的损失函数的区别,对于普通的sigmoid来说计算的形式如下:

targets * -log(sigmoid(logits)) + (1 - targets) * -log(1 - sigmoid(logits))

加入了pos_weight之后的计算形式如下:

targets * -log(sigmoid(logits)) * pos_weight + (1 - targets) * -log(1 - sigmoid(logits))

### 关于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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值