使用Helsinki-NLP/opus-mt-de-en翻译模型报KeyError: 'size'错误如何解决
报错根因
报错里的KeyError: 'size'是因为你直接把tokenizer返回的BatchEncoding字典对象作为位置参数传给了模型,AutoModelForSeq2SeqLM的forward方法不接收这种整体对象,会把它误判为输入张量尝试调用size()方法,从而触发报错。同时翻译属于序列生成任务,不能直接调用模型的forward方法,需要调用专门的generate接口。
修复后可运行代码
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM tokenizer = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-de-en") model = AutoModelForSeq2SeqLM.from_pretrained("Helsinki-NLP/opus-mt-de-en") batch = tokenizer( list(data_bert[:100]), padding=True, truncation=True, max_length=250, return_tensors="pt" ) # 解包传入参数,调用generate方法执行翻译 generated_tokens = model.generate( **batch, max_length=250, num_beams=4, early_stopping=True ) # 解码得到英文翻译结果 results = tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
关键修改说明
- 把
model(batch)改为model.generate(**batch),**操作符会把BatchEncoding对象里的input_ids、attention_mask等字段作为关键字参数传给模型,匹配forward方法的参数要求 - 翻译任务属于序列生成场景,必须调用
generate方法才能得到完整的输出序列,直接调用forward只会返回模型的中间隐层状态,不是最终翻译结果 - 最后用
batch_decode把生成的token id转为可读的英文文本,skip_special_tokens=True会去掉生成结果里的特殊标记符
内容的提问来源于stack exchange,提问作者soulwreckedyouth
相关产品推荐
相关产品推荐

