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。