Функция пользовательских потерь в Keras

Я работаю над подходом класса class-incremental classifier с использованием CNN в качестве экстрактора функций и полностью подключенного блока для классификации.

Во-первых, я сделал тонкую настройку VGG для каждой тренированной сети, чтобы выполнить новую задачу. Когда сеть обучается новой задаче, я храню несколько примеров для каждого класса, чтобы не забывать, когда доступны новые классы.

Когда некоторые классы доступны, я должен вычислить каждый вывод экземпляров, включенных в примеры для новых классов. Теперь добавив нули к выводам для старых классов и добавив метку, соответствующую каждому новому классу, на выходе новых классов, у меня есть мои новые ярлыки, т.е. если вводятся 3 новых класса.

Старый тип типа: [0.1, 0.05, 0.79, ..., 0 0 0]

Новый тип типа: [0.1, 0.09, 0.3, 0.4, ..., 1 0 0] ** последние выходы соответствуют классу.

Мой вопрос в том, как я могу изменить функцию потерь для пользовательской, которая будет тренироваться для новых классов? Функция потери, которую я хочу реализовать, определяется как:

функция потерь

где потери дистилляции соответствуют выходам старых классов, чтобы избежать забывания, а потеря классификации соответствует новым классам.

Если вы можете предоставить мне образец кода для изменения функции потерь в keras, было бы неплохо.

Спасибо!!!!!

Ответ 1

Все, что вам нужно сделать, это определить функцию для этого, используя функции keras для расчетов. Функция должна принимать истинные значения и прогнозные значения модели.

Теперь, поскольку я не уверен в том, что такое g, q, x и y в вашей функции, я просто создам здесь базовый пример, не заботясь о том, что это значит или действительно ли это полезная функция:

import keras.backend as K

def customLoss(yTrue,yPred):
    return K.sum(K.log(yTrue) - K.log(yPred))

Все бэкэнд-функции можно посмотреть здесь: https://keras.io/backend/#backend-functions

После этого скомпилируйте свою модель, используя эту функцию вместо обычной:

model.compile(loss=customLoss, optimizer = .....)