自定义损失函数Keras结合交叉熵损失和mae损失进行序数分类

时间:2018-07-30 20:40:31

标签: tensorflow machine-learning keras deep-learning loss

我正在尝试执行多类分类。理想情况下,我将使用交叉熵损失来训练我的神经网络。但是,我的班级是序数变量。因此,我将使用我的损失函数在预测中执行某种顺序。例如y_true = 2,那么我更喜欢y_predict = 3而不是y_predict =4。为此,我正在考虑在softmax层之后结合使用交叉熵损失和mean_absolute_loss的自定义损失函数:

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的情况,它是否看起来像是有效的损失函数(逐段可微分等)?您认为tensorflow后端会计算出有效的梯度吗?还是有更好的选择来实现序数分类?

0 个答案:

没有答案