这是一个使用模型进行序列分类的示例,以确定两个序列是否是彼此的意译。这两个例子给出了两个不同的结果。你能帮我解释一下为什么tokenizer.encode和tokenizer.encode_plus给出不同的结果吗?
示例1(使用.encode_plus()):
paraphrase = tokenizer.encode_plus(sequence_0, sequence_2, return_tensors="pt")
not_paraphrase = tokenizer.encode_plus(sequence_0, sequence_1, return_tensors="pt")
paraphrase_classification_logits = model(**paraphrase)[0]
not_paraphrase_classification_logits = model(**not_paraphrase)[0]示例2(使用.encode()):
paraphrase = tokenizer.encode(sequence_0, sequence_2, return_tensors="pt")
not_paraphrase = tokenizer.encode(sequence_0, sequence_1, return_tensors="pt")
paraphrase_classification_logits = model(paraphrase)[0]
not_paraphrase_classification_logits = model(not_paraphrase)[0]发布于 2020-05-11 22:33:04
主要区别在于encode_plus提供的附加信息。如果您阅读了关于各个函数的文档,那么对于encode()来说会有一些细微的不同
使用记号赋予器和词汇表转换in序列(整数)中的字符串。与执行
self.convert_tokens_to_ids(self.tokenize(text))相同。
以及对encode_plus()的描述
返回一个字典,其中包含已编码的序列或序列对和附加信息:用于序列分类的掩码和溢出元素(如果指定了
max_length)。
根据您指定的模型和输入句子,不同之处在于额外编码的信息,特别是输入掩码。由于您一次输入两个句子,BERT (以及可能的其他模型变体),预计会有某种形式的掩蔽,这允许模型区分两个序列,请参见here。因为encode_plus 是提供此信息,而encode 不是,所以您会得到不同的输出结果。
https://stackoverflow.com/questions/61708486
复制相似问题