我需要构建一个基于 BLEU 的自定义损失方法。我在构造函数中传递 LabelEncoder 以反转标签和预测并计算蓝色距离。
这是我的损失课
class CIMCodeSuccessiveLoss(Loss):
def __init__(self, labelEncoder: LabelEncoder):
super().__init__()
self.le = labelEncoder
def bleu_score(self, true_label, pred_label):
cim_true_label = self.le.inverse_transform(true_label.numpy())
cim_pred_label = self.le.inverse_transform(pred_label.numpy())
bleu_scores = [sentence_bleu(list(one_true_label),
list(one_pred_label),
weights=(0.5, 0.25, 0.125, 0.125)) for one_true_label, one_pred_label in
zip(cim_true_label, cim_pred_label)]
return np.float32(bleu_scores)
def call(self, y_true, y_pred):
labeled_y_pred = tf.cast(tf.argmax(y_pred, axis=-1), tf.int32)
bleu = tf.py_function(self.bleu_score, (tf.reshape(y_true, [-1]), labeled_y_pred), tf.float32)
return tf.reduce_sum(tf.square(1 - bleu))
Run Code Online (Sandbox Code Playgroud)
bleu_score 方法正在计算正确的分数并返回 NumPy 数组。当我尝试返回平方和时,出现此错误
raise ValueError(f"No gradients provided for any variable: {variable}.
Run Code Online (Sandbox Code Playgroud)
我还提供了模型:
inputs = tf.keras.Input(shape=(1,), dtype=tf.string)
x …Run Code Online (Sandbox Code Playgroud)