【问题标题】:Evaluating Neural Network using accuracy in Keras model使用 Keras 模型中的准确性评估神经网络
【发布时间】:2018-06-19 08:12:25
【问题描述】:

在 Keras 中,当训练和评估神经网络模型(分类两个类别(0 和 1))时,模型会返回训练和测试的损失和准确率:

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=['accuracy'])

这种准确性代表什么?是两个类的平均准确率还是两个类之一的准确率?

【问题讨论】:

    标签: neural-network keras keras-layer


    【解决方案1】:

    准确率是正确分类的样本数除以所有样本数。它不涉及任何每个类的准确度。

    这是 Keras 用于计算二进制精度的代码示例:

    K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
    
    【解决方案2】:

    Keras 将从其代码中可能的指标列表中进行选择。从metrics源码来看,有五种可能:

    def binary_accuracy(y_true, y_pred):
        return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
    
    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())
    
    def sparse_categorical_accuracy(y_true, y_pred):
        return K.cast(K.equal(K.max(y_true, axis=-1),
        K.cast(K.argmax(y_pred, axis=-1), K.floatx())),
        K.floatx())
    
    def top_k_categorical_accuracy(y_true, y_pred, k=5):
        return K.mean(K.in_top_k(y_pred, K.argmax(y_true, axis=-1), k), axis=-1)
    
    def sparse_top_k_categorical_accuracy(y_true, y_pred, k=5):
        return K.mean(K.in_top_k(y_pred, K.cast(K.max(y_true, axis=-1), 'int32'), k), axis=-1)
    

    选择取决于您拥有的模型类型和损失函数。在training 模块中,您会看到它选择了准确度函数:

    if (output_shape[-1] == 1 or self.loss_functions[i] == losses.binary_crossentropy):
        # case: binary accuracy
        acc_fn = metrics_module.binary_accuracy
    
    elif self.loss_functions[i] == losses.sparse_categorical_crossentropy:
        # case: categorical accuracy with sparse targets
        acc_fn = metrics_module.sparse_categorical_accuracy
    
    else:
        acc_fn = metrics_module.categorical_accuracy
    

    在您的模型中,您有 2 个输出和一个 categorical_crossentropy 损失,因此您将属于第 3 种情况,您的准确度将是:

    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())
    

    翻译,你的模型期望只有一个类是真实的,如果预测类的最大值等于真实类的索引,它就被认为是正确的。

    例子:

    • 预测:[0.7; 0.3] /// true: [1 ; 0] --- 算对
    • 预测:[0.8; 0,2] /// 真:[0 ; 1] --- 算错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多