tf.nn.softmax_cross_entropy_with_logits()及tf.nn.sparse_softmax_cross_entropy_with_logits()函数的区别

这两个函数主要用于定义多分类问题的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)

猜你喜欢

转载自blog.csdn.net/sjtuxx_lee/article/details/82345214