详解TensorFlow的 tf.nn.softmax_cross_entropy_with_logits 函数:softmax 交叉熵损失函数

  • Post category:Python

TensorFlow 的tf.nn.softmax_cross_entropy_with_logits函数

TensorFlow中的tf.nn.softmax_cross_entropy_with_logits函数是一种用于测量分类问题中概率分布之间的差异的方法。它结合了前向传播和softmax函数,并自动计算softmax输出。另外,它还能避免由于数值运算引起的不稳定性和浮点数舍入误差,使实现更加高效和简单。

函数的用法

函数原型:

tensorflow.nn.softmax_cross_entropy_with_logits(logits,labels)

参数说明:

  • logits:神经网络最后一层的输出(即神经网络最后一层的结果)(不包含激活函数)
  • labels:真实值,与logits shape一样

返回值:

  • cross entropy损失

函数实例

#案例1
import tensorflow as tf

a = tf.constant([0.7, 0.8, 0.1], dtype = tf.float32)
b = tf.constant([1, 0, 0], dtype = tf.float32)

# 使用tf.nn.sigmoid_cross_entropy_with_logits计算cross entropy
loss1 = tf.nn.sigmoid_cross_entropy_with_logits(labels=b, logits=a)
# 使用tf.nn.softmax_cross_entropy_with_logits计算cross entropy
loss2 = tf.nn.softmax_cross_entropy_with_logits(labels=b, logits=a)

print("Sigmoid loss: ", loss1.numpy())
print("Softmax loss: ", loss2.numpy())

#案例2
import tensorflow as tf

a = tf.constant([[1.0, 2.0], [3.0, 4.0]])
b = tf.constant([[0, 1], [1, 0]], dtype = tf.float32)

# 使用tf.nn.sigmoid_cross_entropy_with_logits计算cross entropy
loss1 = tf.nn.sigmoid_cross_entropy_with_logits(labels=b, logits=a)
# 使用tf.nn.softmax_cross_entropy_with_logits计算cross entropy
loss2 = tf.nn.softmax_cross_entropy_with_logits(labels=b, logits=a)

print("Sigmoid loss: ", loss1.numpy())
print("Softmax loss: ", loss2.numpy())

解析:

  • 案例1中的输入数组a和b都是一维数组。在此基础上,使用tf.nn.sigmoid_cross_entropy_with_logits和tf.nn.softmax_cross_entropy_with_logits计算cross entropy的结果不同。

对于一维数组类型的tensor,softmax和sigmoid的计算结果是相同的。故loss1和loss2的结果相同。

  • 案例2中的输入数组a和b都是二维数组。在此基础上,使用tf.nn.sigmoid_cross_entropy_with_logits和tf.nn.softmax_cross_entropy_with_logits计算cross entropy的结果不同。

对于二维数组类型的tensor,softmax和sigmoid的计算结果是不同的。故loss1和loss2的结果不同。

总结:

  • 当神经网络最后一层输出进行softmax时,使用tf.nn.softmax_cross_entropy_with_logits计算cross entropy。
  • 当神经网络最后一层输出进行sigmoid时,使用tf.nn.sigmoid_cross_entropy_with_logits计算cross entropy。