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)
任何帮助表示赞赏。提前致谢。
要计算损失函数,您可以使用“tf.argmax(y_pred, axis=-1)”方法,argmax不可微分,并且无法自动微分来计算梯度,您必须删除此方法,例如(根据您的数据)您可以将输出层更改为softmax,将标签更改为one_hot。
| 归档时间: |
|
| 查看次数: |
657 次 |
| 最近记录: |