TensorFlow tf.nn.softmax_cross_entropy_with_logits 函数原理与使用详解

追风的人
追风的人
发布时间:2026-10-13 | 4人浏览过
原创

本文深入解析 TensorFlow 中 tf.nn.softmax_cross_entropy_with_logits 函数的内部机制。该函数将 softmax 归一化与交叉熵计算合并,直接接收 logits 和真实标签。文章详细说明了参数含义、数学公式推导,并通过 Python 代码对比手动计算与函数调用的结果,帮助开发者理解其返回值特性及 reduce_sum/mean 的必要性。

TensorFlow softmax_cross_entropy_with_logits 函数概述

在构建神经网络模型时,计算损失函数(loss)是核心环节,其中 tf.nn.softmax_cross_entropy_with_logits 是最常用的函数之一。许多开发者在使用时仅知其然,却不知其所以然。本文将详细拆解该函数的具体执行逻辑与数学原理。

首先需要明确概念:Loss 代表代价值,即模型训练过程中需要最小化的目标函数值。

该函数的标准调用格式为:tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)。

除了用于指定操作名称的 name 参数外,该函数主要涉及两个关键参数:

第一个参数是 logits,代表神经网络最后一层的原始输出。若存在批量数据(batch),其形状为 [batch_size, num_classes];若是单样本,则形状为 [num_classes]。

第二个参数是 labels,表示样本的真实标签,其形状需与 logits 保持一致。

函数执行流程与数学原理

该函数的内部执行流程主要包含两个步骤:

第一步是对网络最后一层的输出 logits 进行 softmax 处理。这一步旨在计算输出属于各个类别的概率。对于单样本,输出是一个包含 num_classes 个元素的向量 [Y1, Y2, Y3...],其中每个 Yi 代表样本属于第 i 类的概率。

Softmax 的计算公式如下:

关于该公式的理论推导及为何采用此形式,涉及较多数学证明,此处不再赘述。

第二步是将 softmax 输出的概率向量 [Y1, Y2, Y3...] 与样本的真实标签进行交叉熵计算。具体公式如下:


其中 表示真实标签向量中第 i 个位置的值。以 MNIST 数据集为例,若数字为 3,其 one-hot 编码标签为 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],即第 4 个位置(索引从 1 开始计数时)为 1,其余均为 0。

代表 softmax 输出向量 [Y1, Y2, Y3...] 中第 i 个元素的值。

显然,预测结果 越接近真实值,交叉熵的结果值越小(注意公式前带有负号)。最后对所有样本求平均值,即可得到最终的 Loss。

特别注意:该函数的返回值并非标量,而是一个向量。若需计算总的交叉熵,必须执行 tf.reduce_sum 操作,对向量内所有元素求和,从而得到 。若需计算 Loss,则需执行 tf.reduce_mean 操作,对向量求均值。

代码实现与结果验证

理论讲解结束后,以下提供具体的代码实现示例。


import tensorflow as tf
 
#our NN's output
logits=tf.constant([[1.0,2.0,3.0],[1.0,2.0,3.0],[1.0,2.0,3.0]])
#step1:do softmax
y=tf.nn.softmax(logits)
#true label
y_=tf.constant([[0.0,0.0,1.0],[0.0,0.0,1.0],[0.0,0.0,1.0]])
#step2:do cross_entropy
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
#do cross_entropy just one step
cross_entropy2=tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(logits, y_))#dont forget tf.reduce_sum()!!
 
with tf.Session() as sess:
  softmax=sess.run(y)
  c_e = sess.run(cross_entropy)
  c_e2 = sess.run(cross_entropy2)
  print("step1:softmax result=")
  print(softmax)
  print("step2:cross_entropy result=")
  print(c_e)
  print("Function(softmax_cross_entropy_with_logits) result=")
  print(c_e2)

代码运行后的输出结果如下:

step1:softmax result= [[ 0.09003057 0.24472848 0.66524094] [ 0.09003057 0.24472848 0.66524094] [ 0.09003057 0.24472848 0.66524094]] step2:cross_entropy result= 1.22282 Function(softmax_cross_entropy_with_logits) result= 1.2228

读者可以尝试验证 e^1/(e^1+e^2+e^3) 是否等于 0.09003057,结果确实一致。这证明了 我们的输出是符合公式逻辑的。

至此,关于 TensorFlow 中 tf.nn.softmax_cross_entropy_with_logits 函数的用法、原理及代码示例已介绍完毕。如需了解更多相关内容,可查阅本站过往文章或继续关注后续更新。感谢大家的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表