2017-04-06 8 views
6

Próbuję zaimplementować metrykę AUC dla kerasów, tak aby uzyskać pomiar AUC po uruchomieniu zestawu sprawdzania poprawności podczas działania metody model.fit().Definiowanie danych AUC dla aparatów obsługujących ocenę zestawu danych sprawdzania poprawności

zdefiniować metrykę jak to:

def auc(y_true, y_pred): 
    keras.backend.get_session().run(tf.global_variables_initializer()) 
    keras.backend.get_session().run(tf.initialize_all_variables()) 
    keras.backend.get_session().run(tf.initialize_local_variables()) 

    #return K.variable(value=tf.contrib.metrics.streaming_auc(
    # y_pred, y_true)[0], dtype='float32') 
    return tf.contrib.metrics.streaming_auc(y_pred, y_true)[0] 

Wynika to w następujący błąd, który nie wiem zrozumieć.

tensorflow.python.framework.errors_impl.FailedPreconditionError: 
Attempting to use uninitialized value auc/true_positives... 

od czytania online, wydaje się, że problem jest 2-krotnie, to błąd w tensorflow/Keras a częściowo i problem z tensorflow nie jest w stanie zainicjować zmiennych lokalnych od wnioskowania. Biorąc pod uwagę te 2 problemy, nie rozumiem, dlaczego dostaję tego błędu lub jak go pokonać. Jakieś sugestie?

Aby zademonstrować, że nie jestem leniwy, napisałem 2 inne parametry, które działają dobrze.

# PFA, prob false alert for binary classifier 
def binary_PFA(y_true, y_pred, threshold=K.variable(value=0.5)): 
    y_pred = K.cast(y_pred >= threshold, 'float32') 
    # N = total number of negative labels 
    N = K.sum(1 - y_true) 
    # FP = total number of false alerts, alerts from the negative class labels 
    FP = K.sum(y_pred - y_pred * y_true)  
    return FP/N 

# P_TA prob true alerts for binary classifier 
def binary_PTA(y_true, y_pred, threshold=K.variable(value=0.5)): 
    y_pred = K.cast(y_pred >= threshold, 'float32') 
    # P = total number of positive labels 
    P = K.sum(y_true) 
    # TP = total number of correct alerts, alerts from the positive class labels 
    TP = K.sum(y_pred * y_true)  
    return TP/P 

Odpowiedz

0

Musisz uruchomić tf.initialize_local_variables() przed powrotem AUC tensor

def auc(y_true, y_pred): 
    auc = tf.metrics.auc(y_true, y_pred)[1] 
    K.get_session().run(tf.local_variables_initializer()) 
    return auc 

ten inicjuje TP, FP, TN, FN do zera. Zauważ, że dałoby to prawidłowy wynik auc tylko przy pierwszym jego obliczeniu, ponieważ zmienne TP, FP, TN, FN muszą być po zesłaniu inicjalizowane zerami.

Powiązane problemy