在张量流上创建 BLEU 损失方法给出“未提供梯度”

Dje*_*iss 9 python deep-learning tensorflow

我需要构建一个基于 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 = vectorize_layer(inputs)
x = Embedding(vocab_size, embedding_dim, name="embedding")(x)
x = LSTM(units=32, name="lstm")(x)
outputs = Dense(classes_number, name="classification")(x)

model = tf.keras.Model(inputs=inputs, outputs=outputs, name="first_cim_classifier")

model.summary()


# we add early stopping for our model.
early_stopping = EarlyStopping(monitor='loss', patience=2)

model.compile(
    loss=CIMCodeSuccessiveLoss(le),
    optimizer=tf.keras.optimizers.Adam(),
    metrics=["accuracy", "crossentropy"],
    run_eagerly=True)

trained_model = model.fit(np.array(x_train), np.array(y_train), batch_size=64, epochs=10,
                          validation_data=(np.array(x_val), np.array(y_val)),
                          callbacks=[early_stopping])
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏。提前致谢。

Tou*_*You 0

要计算损失函数,您可以使用“tf.argmax(y_pred, axis=-1)”方法,argmax不可微分,并且无法自动微分来计算梯度,您必须删除此方法,例如(根据您的数据)您可以将输出层更改为softmax,将标签更改为one_hot。