2016-06-06 13 views
9

otrzymuję ten błąd:jak zaimplementować niestandardowe dane w kamerze?

sumy() dostał nieoczekiwaną argumentu słowa kluczowego 'out'

kiedy uruchomić ten kod:

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) 

jest to możliwe do wdrożenia niestandardowego metryczne oprócz robienia pętli na partiach i edycji kodu źródłowego?

Odpowiedz

4

Ten kod nie działa, ponieważ y_pred i y_true nie są tablicami numpy, ale tensorami Theano lub Tensor Flow. Właśnie dlatego masz ten błąd.

Możesz zdefiniować swoje własne dane, ale musisz pamiętać, że jego argumenty są tymi tablicami Tensor - a nie numpy.

+1

mógłbyś może wypracować jak rozwiązać ten problem? Jak mogę przekształcić Tensor w tablicę numpy? – ste

+1

Musisz myśleć o tensorze jako zmiennej algebraicznej. Nie możesz przekształcić numpy array w tensor. Możesz tylko przypisać tablicę numpy jako wartość tensora. –

+3

Nie chcę przekształcać tablicy numpy w tensor, ale na odwrót. Jeśli użyjemy funkcji OP, spróbowałem: 'def AUC (y_true, y_pred): numpy_y_true = y_true.eval() ... return ...' ale to nie zadziałało. Jak rozwiązałbyś problem OP? – ste

3

można przekazać metodę model.predict() w funkcji metrycznej AUC. [Powtarza to w plikach bacthes, więc możesz być lepiej używając metody model.predict_on_batch(). Zakładając, że masz coś takiego jak warstwa softmax jako wynik (coś, co daje prawdopodobieństwo), możesz użyć tego razem z sklearn.metric, aby uzyskać AUC.

from sklearn.metrics import roc_curve, auc 

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

teraz dokonać metryczny

# 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) 
Powiązane problemy