这两个函数主要用于定义多分类问题的loss。
tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)
解释该函数最重要的两个参数:
1. labels: 训练数据的标记真值,每一行为一个概率分布(可以直接使用one-hot编码)
2. logits: 训练数据的预测值,为未缩放的概率值(即加起来和不为1),执行此函数时会在内部自动执行softmax。即该参数直接传入最后一层fc后的未经softmax的结果即可。
示例:
import tensorflow as tf
labels = [[0,1,0],[1,0,0],[0,0,1]]
logits = [[3.0,7.8,0.2],[2.5,0.3,0.6],[2.7,3.6,5.4]]
logits_scaled = tf.nn.softmax(logits)
loss = tf.nn.softmax_cross_entropy_with_logits(labels = labels, logits = logits)
loss1 = -tf.reduce_sum(labels*tf.log(logits_scaled),1)
with tf.Session() as sess:
print(sess.run(loss))
print(sess.run(loss1))
>>>[0.00869229 0.23140666 0.20904817]
>>>[0.00869226 0.23140666 0.2090482 ]
tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None)
该函数与上一个函数唯一的区别在于labels,该函数的labels为排他的类别号(0,1,2,3这种),而不是类似于one-hot编码的概率向量。
示例
import tensorflow as tf
labels = [1,0,2]
logits = [[3.0,7.8,0.2],[2.5,0.3,0.6],[2.7,3.6,5.4]]
labels_one_hot = [[0,1,0],[1,0,0],[0,0,1]]
logits_scaled = tf.nn.softmax(logits)
loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels = labels, logits = logits)
loss1 = -tf.reduce_sum(labels_one_hot*tf.log(logits_scaled),1)
with tf.Session() as sess:
print(sess.run(loss))
print(sess.run(loss1))
>>>[0.00869229 0.23140666 0.20904817]
>>>[0.00869226 0.23140666 0.2090482 ]
结果一致。
tips:
这两个函数在调用的时候要写成tf.nn.softmax_corss_entropy_with_logits(labels = aaa, logits =bbb),不能只写tf.nn.softmax_corss_entropy_with_logits(aaa, bbb)