繁体   English   中英

Class 在 tensorflow 上的 keras 中的明智分类

[英]Class wise classification in keras on tensorflow

我收到以下错误,我正在尝试获得训练数据的分类准确性。 我已经安装了最新的 TensorFlow 和 Keras,有人可以帮忙解决错误吗? 谢谢

错误:

**raise ValueError('Found two metrics with the same name: {}'.format(
    ValueError: Found two metrics with the same name: acc1**

代码:

resnet_model.summary()
from keras import backend as K

#interesting_class_id = 0  # Choose the class of interest

def single_class_accuracy(interesting_class_id):

    def acc1(y_true, y_pred):

        class_id_true = K.argmax(y_true)
        class_id_preds = K.argmax(y_pred)
        accuracy_mask = K.cast(K.equal(class_id_preds, interesting_class_id), 'int32')

        class_acc_tensor = K.cast(K.equal(class_id_true, class_id_preds), 'int32') * 
        accuracy_mask
        class_acc = K.cast(K.sum(class_acc_tensor), 'float32') / 
        K.cast(K.maximum(K.sum(accuracy_mask), 1), 'float32')
        return class_acc
    return acc1


def single_class_recall(interesting_class_id):

    def recall(y_true, y_pred):

        class_id_true = K.argmax(y_true, axis=-1)
        class_id_pred = K.argmax(y_pred, axis=-1)
        recall_mask = K.cast(K.equal(class_id_true, interesting_class_id), 'int32')

        class_recall_tensor = K.cast(K.equal(class_id_true, class_id_pred), 'int32') * 
        recall_mask
        class_recall = K.cast(K.sum(class_recall_tensor), 'float32') / 
        K.cast(K.maximum(K.sum(recall_mask), 1), 'float32')
        return class_recall
    return recall


def single_class_precision(interesting_class_id):
    def prec(y_true, y_pred):
        class_id_true = K.argmax(y_true, axis=-1)
        class_id_pred = K.argmax(y_pred, axis=-1)
        precision_mask = K.cast(K.equal(class_id_pred, interesting_class_id), 'int32') 
        class_prec_tensor = K.cast(K.equal(class_id_true, class_id_pred), 'int32') * 
        precision_mask 
        class_prec = K.cast(K.sum(class_prec_tensor), 'float32') / 
         K.cast(K.maximum(K.sum(precision_mask), 1), 'float32')
        return class_prec
    return prec

resnet_model.compile(optimizer=Adam(lr=0.01),loss='binary_crossentropy',metrics=[                                         
                         'accuracy',
                         single_class_accuracy(0),  
                         single_class_accuracy(1),
                         single_class_recall(0),
                         single_class_recall(1),
                         single_class_precision(0),  
                        single_class_precision(1)
                       ])


resnet_model.save('my_model')

history = resnet_model.fit(train_ds, validation_data=val_ds, epochs=20)

您不能在metrics参数中添加多个指标,只更改您调用指标的参数。 在拟合 model 期间,它会检测到您有多个具有相同名称的指标。 该名称会自动设置为内部度量的名称 function: acc1 ,在您的情况下recallprec 因此,当它通过您的metrics时,它会找到single_class_accuracy(0)并将其称为acc1 ,然后会找到single_class_accuracy(1)并尝试将其称为acc1 ,这会导致错误。

您可以为度量函数设置不同的名称,如下所示:

def single_class_accuracy(interesting_class_id):

    def acc1(y_true, y_pred):

        class_id_true = K.argmax(y_true)
        class_id_preds = K.argmax(y_pred)
        accuracy_mask = K.cast(K.equal(class_id_preds, interesting_class_id), 'int32')

        class_acc_tensor = K.cast(K.equal(class_id_true, class_id_preds), 'int32') * accuracy_mask
        class_acc = K.cast(K.sum(class_acc_tensor), 'float32') / K.cast(K.maximum(K.sum(accuracy_mask), 1), 'float32')
        return class_acc
    
    # setting a name according to your additional parameter
    acc1.__name__ = 'acc_1_{}'.format(interesting_class_id)
    return acc1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM