添加自定义token后BertTokenizer的vocab_size未更新,如何更新并保存?
问题解决方法
首先明确:vocab_size是预训练tokenizer初始化时固定的原始词汇表大小,属于只读属性,不会随新增token自动更新;而len(tokenizer)返回的是包含新增token后的总词汇量,这才是实际有效的数值。要保存更新后的tokenizer并确保新增token生效,按以下步骤操作:
1. 正确保存更新后的tokenizer
执行add_tokens()后,直接调用save_pretrained()方法即可完成保存,重新加载后的tokenizer会正确识别新增token,len(tokenizer)也会保持更新后的数值。示例代码:
from transformers import BertTokenizer # 加载预训练tokenizer tokenizer = BertTokenizer.from_pretrained("fnlp/bart-base-chinese") # 添加新token tokenizer.add_tokens(["new_token"]) # 保存更新后的tokenizer到本地目录 tokenizer.save_pretrained("./updated_bart_tokenizer") # 重新加载验证 new_tokenizer = BertTokenizer.from_pretrained("./updated_bart_tokenizer") print("重新加载后的总词汇量:", len(new_tokenizer)) # 输出51272 print("新增token是否存在:", "new_token" in new_tokenizer.get_vocab()) # 输出True
2. 手动同步vocab_size(可选)
如果需要让vocab_size显示更新后的数值,可手动修改该属性,但这仅为表面调整,实际生效的词汇量仍以len(tokenizer)为准:
tokenizer.vocab_size = len(tokenizer) print("修改后的vocab_size:", tokenizer.vocab_size) # 输出51272
更推荐依赖len(tokenizer)获取真实词汇量,因为vocab_size的语义本身就是预训练模型的原始词汇表大小。
内容的提问来源于stack exchange,提问作者Raptor
相关产品推荐
相关产品推荐

