2016-06-06 46 views
9

ottengo questo errore:come implementare la metrica personalizzata in keras?

sum() ha ottenuto un argomento chiave inaspettato 'fuori'

quando si esegue questo codice:

import pandas as pd, numpy as np 
import keras 
from keras.layers.core import Dense, Activation 
from keras.models import Sequential 

def AUC(y_true,y_pred): 
    not_y_pred=np.logical_not(y_pred) 
    y_int1=y_true*y_pred 
    y_int0=np.logical_not(y_true)*not_y_pred 
    TP=np.sum(y_pred*y_int1) 
    FP=np.sum(y_pred)-TP 
    TN=np.sum(not_y_pred*y_int0) 
    FN=np.sum(not_y_pred)-TN 
    TPR=np.float(TP)/(TP+FN) 
    FPR=np.float(FP)/(FP+TN) 
    return((1+TPR-FPR)/2) 

# Input datasets 

train_df = pd.DataFrame(np.random.rand(91,1000)) 
train_df.iloc[:,-2]=(train_df.iloc[:,-2]>0.8)*1 


model = Sequential() 
model.add(Dense(output_dim=60, input_dim=91, init="glorot_uniform")) 
model.add(Activation("sigmoid")) 
model.add(Dense(output_dim=1, input_dim=60, init="glorot_uniform")) 
model.add(Activation("sigmoid")) 

model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=[AUC]) 


train_df.iloc[:,-1]=np.ones(train_df.shape[0]) #bias 
X=train_df.iloc[:,:-1].values 
Y=train_df.iloc[:,-1].values 
print X.shape,Y.shape 

model.fit(X, Y, batch_size=50,show_accuracy = False, verbose = 1) 

E 'possibile implementare un custom metrica oltre a fare un ciclo su lotti e modificare il codice sorgente?

risposta

4

Questo codice non funziona perché y_pred e y_true non sono array di tipo numpy ma tensori Theano o Tensor Flow. Ecco perché hai ricevuto questo errore.

È possibile definire le proprie metriche personalizzate, ma è necessario ricordare che i relativi argomenti sono quei Tensori, non gli array numpy.

+1

Potrebbe forse elaborare come risolvere questo? Come posso trasformare un Tensore in una serie numpy? – ste

+1

È necessario pensare a un tensore come variabile algebrica. Non è possibile trasformare l'array numpy in tensore. Si può solo assegnare l'array numpy come valore di un tensore. –

+3

Non voglio trasformare una matrice numpy in un tensore ma viceversa. Se prendiamo la funzione di OP, ho provato: 'def AUC (y_true, y_pred): numpy_y_true = y_true.eval() ... return ...' ma non ha funzionato. Come risolverebbe il problema dell'OP? – ste

3

è possibile passare un model.predict() nella funzione metrica AUC. [questo verrà iterato su bacthes in modo che tu possa stare meglio usando model.predict_on_batch(). Supponendo che tu abbia qualcosa come un layer softmax come output (qualcosa che genera probabilità), puoi usarlo insieme a sklearn.metric per ottenere l'AUC.

from sklearn.metrics import roc_curve, auc 

da here

def sklearnAUC(test_labels,test_prediction): 
    n_classes = 2 
    # Compute ROC curve and ROC area for each class 
    fpr = dict() 
    tpr = dict() 
    roc_auc = dict() 
    for i in range(n_classes): 
     # (actual labels, predicted probabilities) 
     fpr[i], tpr[i], _ = roc_curve(test_labels[:, i], test_prediction[:, i]) 
     roc_auc[i] = auc(fpr[i], tpr[i]) 

    return round(roc_auc[0],3) , round(roc_auc[1],3) 

ora rendere la vostra metrica

# gives a numpy array like so [ [0.3,0.7] , [0.2,0.8] ....]  
Y_pred = model.predict_on_batch (X_test ) 
# Y_test looks something like [ [0,1] , [1,0] .... ] 
# auc1 and auc2 should be equal 
auc1 , auc2 = sklearnAUC( Y_test , Y_pred) 
Problemi correlati