как реализовать пользовательскую метрику в керасе?

Я получаю эту ошибку:

sum () получил неожиданный аргумент ключевого слова out

когда я запускаю этот код:

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)

Можно ли реализовать пользовательскую метрику помимо выполнения цикла для пакетов и редактирования исходного кода?

Ответы на вопрос(3)

а не на его точную проблему. Я делаю это, так как вопрос появляется в верхней части, когда я гуглю тему проблемы.

Вы можете реализовать собственную метрику двумя способами.

Как уже упоминалось вКерас Документ.

import keras.backend as K

def mean_pred(y_true, y_pred):
    return K.mean(y_pred)

model.compile(optimizer='sgd',
          loss='binary_crossentropy',
          metrics=['accuracy', mean_pred])

Но здесь вы должны помнить, как упоминалось в ответе Марцина Могейко, чтоy_true а такжеy_pred являются тензорами. Так что для правильного расчета метрики нужно использоватьkeras.backend функциональность. Пожалуйста, посмотрите на этот ТАК вопрос для деталейКак рассчитать F1 Макро в Керасе?

Или вы можете реализовать это хакерским способом, как указано вВыпуск Keras GH, Для этого вам нужно использоватьcallbacks аргументmodel.fit.

import keras as keras
import numpy as np
from keras.optimizers import SGD
from sklearn.metrics import roc_auc_score

model = keras.models.Sequential()
# ...
sgd = SGD(lr=0.001, momentum=0.9)
model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])


class Metrics(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self._data = []

    def on_epoch_end(self, batch, logs={}):
        X_val, y_val = self.validation_data[0], self.validation_data[1]
        y_predict = np.asarray(model.predict(X_val))

        y_val = np.argmax(y_val, axis=1)
        y_predict = np.argmax(y_predict, axis=1)

        self._data.append({
            'val_rocauc': roc_auc_score(y_val, y_predict),
        })
        return

    def get_data(self):
        return self._data

metrics = Metrics()
history = model.fit(X_train, y_train, epochs=100, validation_data=(X_val, y_val), callbacks=[metrics])
metrics.get_data()
 Dan Erez29 окт. 2018 г., 11:57
Я предлагаю использовать self.model, а не model, чтобы этот класс можно было спрятать в другом файле.
 saurabheights01 авг. 2019 г., 03:39
@ Для людей, работающих с большим набором данных проверки, вам придется удвоить время проверки. Одна проверка выполняется keras, а другая - вашими метриками, вызывая предикат. Другая проблема заключается в том, что теперь ваши метрики используют GPU для прогнозирования и CPU для вычисления метрик с использованием numpy, поэтому GPU и CPU работают последовательно. Если метрика требует больших вычислительных ресурсов, вы столкнетесь с худшим использованием графического процессора и должны будете выполнить оптимизацию, которая уже выполнена в керасе.

то будет повторяться на bacthes, так что вам может быть лучше использовать model.predict_on_batch (). Предполагая, что у вас есть что-то вроде слоя softmax в качестве вывода (то, что выводит вероятности), вы можете использовать это вместе с sklearn.metric для получения AUC.

from sklearn.metrics import roc_curve, auc

отВот

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)

Теперь сделайте свою метрику

# 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 )
Решение Вопроса

y_pred а такжеy_true это не пустые массивы, а тензоры Theano или Tensor Flow. Вот почему вы получили эту ошибку.

Вы можете определить свои собственные метрики, но вы должны помнить, что его аргументы - это те Тензоры, а не массивы.

 ste31 окт. 2016 г., 13:28
Я не хочу преобразовывать массив NumPy в тензор, но наоборот. Если мы возьмем функцию OP, я попытался:def AUC(y_true,y_pred): numpy_y_true = y_true.eval() ... return ... но это не сработало. Как бы вы решили проблему ОП?
 Marcin Możejko13 окт. 2016 г., 16:30
Вы должны думать о тензоре как алгебраической переменной. Вы не можете преобразовать массив NumPy в тензор. Вы можете назначить только массив numpy как значение тензора.
 Marcin Możejko22 сент. 2017 г., 18:50
Это правда. Но все же входные данные должны быть тензорами
 Dustin Boswell22 сент. 2017 г., 18:48
Пользовательская метрика не может быть типичной функцией, возвращающей число. Даже «def auc (y_true, y_pred): return 1.0» не будет работать. Функция metric вызывается один раз во время компиляции, прежде чем будут видны какие-либо обучающие примеры.
 ste13 окт. 2016 г., 15:58
Не могли бы вы уточнить, как решить эту проблему? Как я могу преобразовать Тензор в массив Numpy?

Ваш ответ на вопрос