【问题标题】:Why can't the output of the network go through a softmax when using softmax_cross_entropy_with_logits?为什么使用softmax_cross_entropy_with_logits时网络的输出不能通过softmax?
【发布时间】:2018-04-17 15:44:36
【问题描述】:

我想使用 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 成本函数是正确的?)

【问题讨论】:

标签: python machine-learning tensorflow neural-network


【解决方案1】:

你提到的函数是tf.nn.softmax_cross_entropy_with_logits。顾名思义,它首先对 logits 执行 softmax(i.e scaling),然后计算 logits 和标签之间的熵。

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 我明白了。在您的实现中,仍然使用tf.losses.softmax_cross_entropy 是正确的,它本质上是tf.nn.softmax_cross_entropy_with_logits 作为训练期间的成本函数,对吗?
    猜你喜欢
    • 2016-03-18
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2018-12-01
    • 2016-10-15
    相关资源
    最近更新 更多