Tensorflow“不要使用softmax交叉熵”和softmax输出?为什么?

时间:2017-11-05 10:49:43

标签: python machine-learning tensorflow neural-network

我想使用tensorflow内置的交叉熵函数。但是,在文档中,我正在阅读

  

请勿使用softmax的输出调用此op,因为它会产生   结果不正确。

https://www.tensorflow.org/api_docs/python/tf/nn/softmax_cross_entropy_with_logits

就像经常这样,我在最后一个输出层使用softmax激活,但是:

result = tf.layers.dense(input=dropout, classes_num, tf.nn.softmax)

使用此功能是不正确的,还是文件不正确?我不明白这一点,我会感谢一个简短的解释。 (那么,对于softmax输出层,哪个张量流成本函数是正确的?)

2 个答案:

答案 0 :(得分:4)

由于tf.identity在内部计算其输入的softmax(以数字稳定的方式),您必须定义网络才能使用线性激活函数:result = tf.layers.dense(input=dropout, classes_num, tf.identity)

is_training

此外,一旦网络经过培训并且您想使用该模型进行推理,您必须使用softmax替换激活。

因此,在您的代码中引入一个result = tf.layers.dense(input=dropout, classes_num, tf.identity if is_training else tf.nn.softmax) python布尔变量,并在您进行培训或测试时使用它来更改模型定义。

;

答案 1 :(得分:3)

您提到的功能是 tf.nn.softmax_cross_entropy_with_logits 。顾名思义,它首先对logits执行softmax(缩放),然后计算logits和标签之间的熵。

因此,如果您输入已经执行softmax的logits(如代码中的结果),那么您在logits上执行softmax两次,这将产生不正确的结果。

希望这有帮助。