Skip to main content
 首页 » 编程设计

python之为什么在使用softmax_cross_entropy_with_logits时网络的输出不能经过一个softmax

2025年05月04日9落叶

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

Do not call this op with the output of softmax, as it will produce incorrect results.

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) 

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

请您参考如下方法:

由于 tf.nn.softmax_cross_entropy_with_logits 在内部计算其输入的 softmax(以数字稳定的方式),您必须定义您的网络才能使用线性激活函数:tf .身份

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

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

因此,在您的代码中引入一个 is_training python bool 变量,并在您训练或测试时使用它来更改您的模型定义。

result = tf.layers.dense(input=dropout, classes_num, 
             tf.identity if is_training else tf.nn.softmax)