我正在通过以下方式计算成本:
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y, y_)
cost = tf.reduce_mean(cross_entropy);
对于第一个成本,我得到 0.693147,这是在参数/权重初始化为 0 时的二进制分类中预期的。
我正在使用 one_hot 标签。
然而,在使用随机梯度下降完成一个训练时期后,我发现成本大于 1。
这是可以预料的吗?
我正在通过以下方式计算成本:
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y, y_)
cost = tf.reduce_mean(cross_entropy);
对于第一个成本,我得到 0.693147,这是在参数/权重初始化为 0 时的二进制分类中预期的。
我正在使用 one_hot 标签。
然而,在使用随机梯度下降完成一个训练时期后,我发现成本大于 1。
这是可以预料的吗?
以下代码基本上完成了 TFsoftmax_cross_entropy_with_logits函数的工作(softmaxedy_和上的交叉熵y):
import scipy as sp
import numpy as np
def softmax(x):
e_x = np.exp(x - np.max(x))
return e_x / e_x.sum(axis=0)
def crossentropy(true, pred):
epsilon = 1e-15
pred = sp.maximum(epsilon, pred)
pred = sp.minimum(1-epsilon, pred)
ll = -sum(
true * sp.log(pred) + \
sp.subtract(1,true) * \
sp.log(sp.subtract(1, pred))
) / len(true)
return ll
==
true = [1., 0.]
pred = [5.0, 0.5]
true = softmax(true)
pred = softmax(pred)
print true
print pred
print crossentropy(true, pred)
==
[ 0.73105858 0.26894142]
[ 0.98901306 0.01098694]
1.22128414101
正如你所看到的,二进制分类的交叉熵没有理由不能> 1,而且提出这样的例子并不难。
** 上面的交叉熵在 https://www.kaggle.com/wiki/LogarithmicLoss 中计算, softmax 在https://en.wikipedia.org/wiki/Softmax_function中计算
UPD:有一个很好的解释,当 logloss > 1 在 SO:https ://stackoverflow.com/a/35015188/1166478