我想使用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输出层,哪个张量流成本函数是正确的?)
答案 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两次,这将产生不正确的结果。
希望这有帮助。