HuggingFace Transformers替换pad_to_max_length参数报错解决
问题根因
你对官方警告的说明确实存在理解偏差:旧版本的pad_to_max_length=True参数会同时触发两个逻辑:
- 将短于指定
max_length的序列填充到max_length长度 - 将长于
max_length的序列截断到max_length长度
新版本API把填充和截断拆成了两个独立参数,仅替换成padding='max_length'只会开启填充逻辑,不会自动截断超长文本,所以才会出现部分序列长度超过你设置的60(比如报错里的长度64),最终批量堆叠张量时触发长度不一致的错误。
正确修改方案
移除废弃的pad_to_max_length参数,补上truncation=True即可,修改后代码和旧版本行为完全一致:
encoding = self.tokenizer.encode_plus( poem, add_special_tokens=True, max_length=60, return_token_type_ids=False, padding='max_length', truncation=True, return_attention_mask=True, return_tensors='pt', )
新旧参数对应参考
几个常用场景的参数写法可以参考:
- 固定长度填充/截断(和原
pad_to_max_length=True行为一致):传padding='max_length'+truncation=True,可搭配自定义max_length参数指定长度,不传max_length则默认用模型支持的最大输入长度(比如BERT为512) - 按batch动态填充:传
padding=True(等价于padding='longest'),会把当前batch内所有序列填充到本batch最长序列的长度,一般也建议搭配truncation=True避免超长文本超出模型输入上限 - 仅截断不填充:传
truncation=True,padding=False即可
内容的提问来源于stack exchange,提问作者Peyman
相关产品推荐
相关产品推荐

