我想使用 TensorFlow 内置的交叉熵函数。然而,在文档中我读到
不要将此操作与 softmax 的输出一起调用,因为它会产生错误的结果。
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 输出层,应该使用哪个 TensorFlow 成本函数呢?)
回答:
由于 tf.nn.softmax_cross_entropy_with_logits
会在内部以数值稳定的方式计算其输入的 softmax,因此您需要定义网络以使用线性激活函数:tf.identity
result = tf.layers.dense(input=dropout, classes_num, tf.identity)
此外,一旦网络训练完成,并且您想使用模型进行推理时,您需要将激活函数替换为 softmax。
因此,在您的代码中引入一个 Python 布尔变量 is_training
,并使用它在训练或测试时更改模型定义。
result = tf.layers.dense(input=dropout, classes_num, tf.identity if is_training else tf.nn.softmax)