Я понимаю, что это было опубликовано давным-давно, но я нашел этот вопрос, когда искал тот же ответ, и в конце концов понял это сам. Короче говоря, вы должны помнить, что оба должны определять метрику для обратного вызова EarlyStopping и как метрику при компиляции модели
ОК, поэтому вы определилипользовательская функция потерь или метрика с чем-то вроде этого (взято из https://github.com/keras-team/keras/issues/10018, которое само взято из https://stackoverflow.com/a/45305384/5210098):
#https://stackoverflow.com/a/45305384/5210098
def f1_metric(y_true, y_pred):
def recall(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
recall = (true_positives + K.epsilon()) / (possible_positives + K.epsilon())
return recall
def precision(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
precision = (true_positives + K.epsilon()) / (predicted_positives + K.epsilon())
return precision
precision = precision(y_true, y_pred)
recall = recall(y_true, y_pred)
return 2*((precision*recall)/(precision+recall+K.epsilon()))
Теперь, чтобы использовать это с обратным вызовом EarlyStopping, вы можете предоставить его какстрока типа EarlyStopping(monitor='f1_metric')
или, для контроля за проверкой используйте вместо нее EarlyStopping(monitor='val_f1_metric')
.
Но этого недостаточно! Если вы остановитесь там, вы получите ошибку, которую получили.Вам также необходимо указать фактическую функцию в качестве аргумента при компиляции модели с использованием model.compile(metrics=[f1_metric])
. Обратите внимание на отсутствие кавычек - вы ссылаетесь на саму функцию.
Если вы компилируете модель, включив функциюиспользуя ключевое слово metrics, а также включите функцию обратного вызова EarlyStopping, тогда она должна работать без ошибок.