对于我的问题,我希望预测客户评论得分介于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操作都应该是可区分的,但我也可能是错误的。
感谢您的帮助。