自定义损失函数的一部分不可区分

时间:2019-05-02 18:26:18

标签: python tensorflow keras loss-function

对于我的问题,我希望预测客户评论得分介于1到5之间。我认为将其作为回归问题来实施将是一件好事,因为根据模型预测的1表示真实值为5,则应为“比4更糟糕”的预测。我们还希望该模型在某种程度上对所有评论得分类别都表现良好。因为我的数据集高度不平衡,所以我想创建自己的损失函数。如果采用正常的MSE实施,该模型将只擅长预测多数阶层。因此,我想估算每个评论类别(1、2、3、4和5星评论)的MSE,然后取这五个MSE得分的平均值。这就是应该激励模型以在预测较小的类时表现出色的方式。

以下代码显示了我的张量流损失函数:

def custom_loss_function(y_true, y_pred):
    y_true_t = tf.cast(tf.Variable(y_true, validate_shape=False),dtype="float16")
    y_pred_t = tf.cast(tf.Variable(y_pred, validate_shape=False),dtype="float16")

    one = tf.cast(tf.Variable([1]),dtype="float16")
    two = tf.cast(tf.Variable([2]),dtype="float16")
    three = tf.cast(tf.Variable([3]),dtype="float16")
    four = tf.cast(tf.Variable([4]),dtype="float16")
    five = tf.cast(tf.Variable([5]),dtype="float16")

    # index for a given review class
    i_one = tf.where(tf.equal(y_true_t, one))
    i_two = tf.where(tf.equal(y_true_t, two))
    i_three = tf.where(tf.equal(y_true_t, three))
    i_four = tf.where(tf.equal(y_true_t, four))
    i_five = tf.where(tf.equal(y_true_t, five))

    # predictions for the found indicies for a review class
    y_pred_one=tf.gather(y_pred_t,i_one)
    y_pred_two=tf.gather(y_pred_t,i_two)
    y_pred_three=tf.gather(y_pred_t,i_three)
    y_pred_four=tf.gather(y_pred_t,i_four)
    y_pred_five=tf.gather(y_pred_t,i_five)

    y_true_one=tf.gather(y_true_t,i_one)
    y_true_two=tf.gather(y_true_t,i_two)
    y_true_three=tf.gather(y_true_t,i_three)
    y_true_four=tf.gather(y_true_t,i_four)
    y_true_five=tf.gather(y_true_t,i_five)

    mse1 = tf.reduce_mean(tf.cast(tf.square(y_true_one-y_pred_one),dtype="float"))
    mse2 = tf.reduce_mean(tf.cast(tf.square(y_true_two-y_pred_two),dtype="float"))
    mse3 = tf.reduce_mean(tf.cast(tf.square(y_true_three-y_pred_three),dtype="float"))
    mse4 = tf.reduce_mean(tf.cast(tf.square(y_true_four-y_pred_four),dtype="float"))
    mse5 = tf.reduce_mean(tf.cast(tf.square(y_true_five-y_pred_five),dtype="float"))

    mse = (mse1+mse2+mse3+mse4+mse5)/5

    return mse

当我尝试在NN中使用此损失函数时,会收到以下消息:

  

ValueError:操作具有None用于渐变。请确定   您所有的操作都定义了渐变(即   可区分的)。不带渐变的常见操作:K.argmax,K.round,   埃瓦尔。

我不知道为什么会发生此错误。我以为所有tf操作都应该是可区分的,但我也可能是错误的。

感谢您的帮助。

0 个答案:

没有答案