为什么`K.cast`用于`categorical_accuracy`而不是`K.mean`?

Rac*_*fer 3 python keras

功能keras.metrics.binary_accuracy非常简单:

def binary_accuracy(y_true, y_pred):
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
Run Code Online (Sandbox Code Playgroud)

https://github.com/fchollet/keras/blob/master/keras/metrics.py#L20

但是功能keras.metrics.categorical_accuracy有所不同:

def categorical_accuracy(y_true, y_pred):
    return K.cast(K.equal(K.argmax(y_true, axis=-1),
                          K.argmax(y_pred, axis=-1)),
                  K.floatx())
Run Code Online (Sandbox Code Playgroud)

https://github.com/fchollet/keras/blob/master/keras/metrics.py#L24

我很困惑,为什么这个功能使用K.cast,而不是K.mean?因为我认为这个函数应该像函数一样返回一个数字keras.metrics.binary_accuracy

Dan*_*ler 5

原因cast是因为argmax返回一个整数,它是最高值的索引.但结果必须是浮动的.

argmax函数:

argmax功能还将降低输入的等级.注意它使用axis=-1,意味着它将采用最后一个轴的最大值的索引,消除该轴,但保持其他轴.

假设您的输入有形状(10 samples, 5 features),返回的张量就是这样(10 samples,)

mean使用功能axis=-1:

通常,mean函数返回标量,但是如果仔细观察binary_accuracy,您还会注意到,通过axis=-1mean函数中使用,它不会将输入减少到单个标量值.它以完全相同的方式减小张量argmax,但在这种情况下,计算平均值.

输入(10,5)也会出现(10,).

最后结果:

因此,我们可以得出结论,两个指标都返回具有相同形状的张量.现在,他们都没有减少标量值的原因是因为Keras提供了更多的可能性,例如样本加权和一些其他额外的操作与损失(包括你自己的自定义损失,如果你想把Keras'作为一个基础).这些将依赖于样品的损失.

在某个地方,Keras将计算最终的平均值.