交叉熵误差对于各种值保持不变

时间:2019-05-28 05:32:46

标签: neural-network classification conv-neural-network softmax cross-entropy

我正在使用带有Softmax的交叉熵作为神经网络的损失函数。 我写的交叉熵函数如下:

def CrossEntropy(calculated,desired):
    sum=0
    n=len(calculated)
    for i in range(0,n):
        sum+=(desired[i] * math.log(calculated[i])) + ((1-desired[i])* math.log(1-calculated[i]))

    crossentropy=(-1)*sum/n
    return crossentropy

现在,让我们假设期望的输出为[1,0,0,0] ,并且我们正在针对两个计算出的输出进行测试,即a = [0.1,0.9,0.1,0.1 ] b = [0.1,0.1,0.1,0.9] 问题是对于这两个计算出的输出,函数将返回完全相同的交叉熵值。那么,神经网络如何得知哪个输出是正确的?

1 个答案:

答案 0 :(得分:0)

这是可以预期的,因为在两种calculated情况下,您具有数据对称性

在您的示例中,所需的输出为[1, 0, 0, 0]。因此,真正的阶级是头等舱。但是,在ab中,您对第一类的预测都是相同的(0.1)。同样,对于其他类别(真实负数-第二,第三和第四类别),您也具有这种数据对称性(对于损失计算,类别2和类别4同样重要)。

 a -> 0.9,0.1,0.1
       ^
       |       |
               V
 b -> 0.1,0.1,0.9

因此,您的损失与预期相同。

如果删除此对称性,则会得到不同的交叉熵损失。请参阅以下示例:


# The first two are from your examples.
print CrossEntropy(calculated=[0.1,0.9,0.1,0.1], desired=[1, 0, 0, 0])
print CrossEntropy(calculated=[0.1,0.1,0.1,0.9], desired=[1, 0, 0, 0])

# below we have prediction for the last class as 0.75 thus break the data symmetry.
print CrossEntropy(calculated=[0.1,0.1,0.1,0.75], desired=[1, 0, 0, 0])

# below we have prediction for the true class as 0.45.
print CrossEntropy(calculated=[0.45,0.1,0.1,0.9], desired=[1, 0, 0, 0])


result:
1.20397280433
1.20397280433
0.974900121357
0.827953455132