TensorFlow tf.nn.softmax_cross_entropy_with_logits 函数原理与使用详解
本文深入解析 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 函数的用法、原理及代码示例已介绍完毕。如需了解更多相关内容,可查阅本站过往文章或继续关注后续更新。感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









