Пользовательская функция потерь Keras, объединяющая перекрестную потерю энтропии и потерю Мэй для Порядковой классификации
Я пытаюсь выполнить мультиклассовую классификацию. В идеале я бы использовал кросс-энтропийную потерю для обучения своей нейронной сети. Тем не менее, мои классы являются ординальными переменными. Следовательно, я бы хотел, чтобы моя функция потери обеспечивала какой-то порядок в прогнозе. Например, y_true = 2, тогда я бы предпочел y_predict = 3, а не y_predict = 4. Для этого я думаю об использовании пользовательской функции потерь с комбинацией перекрестных потерь энтропии и mean_absolute_loss после слоя softmax:
import from keras import backend as K
from keras import losses
loss_weight = [1,0.0001]
loss_weight_tensor = K.variable(value=loss_weight)
def custom_loss(y_true,y_pred):
l1 = K.sparse_categorical_crossentropy(y_true,y_pred)
y_pred_argmax = K.cast( K.argmax(y_pred,axis=1),dtype=K.tf.float32)
# y_pred_argmax get the class from softmax output
l2 = losses.mean_absolute_error(y_pred_argmax, y_true)
return l1*loss_weight_tensor[0] + l2*loss_weight_tensor[1]
Есть ли ошибка в моем мышлении или построении этой функции потери. Выглядит ли это как действительная функция потерь (кусочно-дифференцируемая и т. Д.), Если я использую argmax? И как вы думаете, тензор потока бэкэнда рассчитает правильный градиент? Или есть лучшая альтернатива для достижения порядковой классификации?