Керас не перестает меня удивлять. Это сделало глубокое обучение доступным для людей, не занимающихся информатикой, без ущерба для сложности сетей, которые можно спроектировать на его основе. На данный момент я не могу понять ни одной функции, которую предлагают другие библиотеки, такие как pytorch, tf и т. д., которые не могут быть реализованы в keras. Вчера я пытался сделать свою собственную модель для системы рекомендаций с использованием глубоких автоэнкодеров на основе этого блога, для которого требовалась функция потерь, отсутствующая в базовой библиотеке keras.

Позвольте мне кратко изложить постановку задачи. Задача состояла в том, чтобы предсказать отсутствующие рейтинги в рейтинговой матрице. Идея заключалась в том, что мы дадим матрицу оценок в качестве входных данных для автоэнкодера, и он восстановит недостающие элементы. Теперь при обучении пропущенные значения были заменены на 0, но при расчете функции потерь (mse) вклады этих условий не должны учитываться, поскольку эти рейтинги на самом деле не были равны нулю, а были заменены нулем для облегчения обучения. Поэтому я написал следующую функцию потерь (sparse_mse), используя бэкэнд keras.

from keras import backend as K
def sparse_mse(y_true, y_pred):
    y_true = K.flatten(y_true)          
    y_pred = K.flatten(y_pred)
### converting the datatypes of y_true, y_pred to make sure they  ### are of same dtypes
    y_true = K.cast(y_true, "float32")  
    y_pred = K.cast(y_pred, "float32")  
    y_zeros = K.zeros_like(y_true)    
    y_bool = K.equal(y_zeros, y_true)
    y_bool = K.cast(y_bool, "float32")
    error = K.mean(y_bool*K.square(y_true-y_pred))
    return error

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