Фон
Я создаю простую модель с использованием керас (с бэкэндом тензорного потока)
model = Sequential()
...
model.compile(loss='mse', optimizer=Adam(), metrics=[average_precision])
, а затем хочу основать ранний останов на своей пользовательской метрике:
model.fit(x=x_train, y=y_train,
...
callbacks=[EarlyStopping(monitor='average_precision', mode='max', patience=3)])
пока все хорошо.Но проблема в том, что average_precision
реализован с использованием average_precision_score
из sklearn.metrics
:
def average_precision(y_true, y_pred):
return average_precision_score(y_true, y_pred, average="micro")
. Он принимает только массивы numpy.Но во время обучения функция снабжается тензорами.
Вопрос
Как использовать функцию sklearn для реализации пользовательской метрики.
Примечание:
Мне не нужно реализовывать потери, поэтому функция не должна быть дифференцируемой.
Что не работает
Я попытался провести жонглирование с некоторыми сеансами / прогонами / вычислениями, чтобы получить пустые массивы в функции, но мне это не удалось.
Временное решение, которое яЯ использую, но я не доволен:
Я написал свой обратный вызов для ранней остановки.Я предоставляю ему данные проверки в форме массивов в его конструкторе.У этого решения есть несколько недостатков, и я ищу более элегантный.
Чего я не хочу делать:
Переписывание вручную хорошо протестированных функций из sklearn с использованием keras backend.