Keras预训练BERT MaskedLM预测结果不一致的原因排查
问题原因及解决方案
你的核心问题是只向模型传入了input_ids,没有提供掩码位置信息,导致BertMaskedLM无法定位需要预测的token位置,输出结果自然不符合预期。
修正后的代码
import keras import keras_nlp import tensorflow as tf # 加载预处理器与预训练模型 preprocessor = keras_nlp.models.BertMaskedLMPreprocessor.from_preset("bert_base_en") masked_lm = keras_nlp.models.BertMaskedLM.from_preset( "bert_base_en", load_weights=True, preprocessor=None, ) # 处理输入,获取模型所需的完整输入数据(含input_ids、mask_positions等) test_data = preprocessor(["The capital of France is Paris."]) # 传入完整输入数据,而非单独的input_ids outputs = masked_lm(test_data) # 对掩码位置的预测结果取argmax,得到token id predicted_ids = tf.math.argmax(outputs, axis=-1) # 解码预测的token tokenizer = keras_nlp.models.BertTokenizer.from_preset("bert_base_en") print(tokenizer.decode(predicted_ids[0])) # 输出应为 "is Paris"
关键说明
BertMaskedLMPreprocessor处理文本后,返回的是包含input_ids、mask_positions、segment_ids等的结构化数据,这些都是模型预测必需的参数。- 原代码中
test_sequence[0]仅提取了input_ids,模型无法识别哪些位置是被掩码的目标,因此输出错误结果。 - 传入完整的预处理数据后,模型会自动针对
mask_positions指定的位置生成预测,解码后即可得到预期的token。
内容的提问来源于stack exchange,提问作者user3085693
相关产品推荐
相关产品推荐

