RobertaTokenizer和初始化RobertaTokenizer的from_pretrained方法有什么区别?

问题描述

我是拥抱脸部变形器的新手,并且在从头开始训练import path from 'path' const uid = 'image-id' const fileName = uid + path.extname(uri) const response = await fetch(uri) const blob = await response.blob() const uploadImage = firebase .storage() .ref() .put(blob,{ contentType: `image/${path.extname(uri).split('.').pop()}` }) uploadImage.on( 'state_changed',snapshot => { // progress },err => { // error },() => { // complete } LM时面临以下问题:

首先,我已经按照以下步骤训练并保存了RobertaForMaskedLM

ByteLevelBPetokenizer

然后通过如下创建tokenizer = ByteLevelBPetokenizer() print('Saving tokenizer at:',training_file) tokenizer.train(files=training_file,vocab_size=VOCAB_SIZE,min_frequency=2,special_tokens=["<s>","<pad>","</s>","<unk>","<mask>"]) tokenizer.save_model(tokenizer_mdl_dir) ,使用此令牌生成器训练RobertaForMaskedLM

RobertaTokenizer

但是现在,当我尝试使用填充蒙版管道测试经过训练的LM时,

roberta_tokenizer = RobertaTokenizer(tokenizer_mdl + "/vocab.json",tokenizer_mdl + "/merges.txt")

我遇到以下错误

PipelineException:在输入中找不到mask_token()

因此,我意识到,我已加载的令牌生成器也在对fill_mask_pipeline = pipeline("fill-mask",model=roberta_model,tokenizer=roberta_tokenizer) 令牌进行令牌化。但是我不明白为什么要这么做。请帮助我理解这一点。

尝试了几件事之后,我以不同的方式加载了令牌生成器,

<mask>

而且,roberta_tokenizer = RobertaTokenizer.from_pretrained(tokenizer_mdl) 现在可以正常运行了。那么,使用fill_mask_pipeline加载标记器和使用RobertaTokenizer()方法加载标记符之间有什么区别?

解决方法

当比较属性unique_no_split_tokens时,您会看到它是为from_pretrained标记程序初始化的,而不是为其他标记程序初始化的。

#from_pretrained
t1.unique_no_split_tokens
['</s>','<mask>','<pad>','<s>','<unk>']

#__init__
t2.unique_no_split_tokens
[]

此属性由from_pretrained调用的_add_tokens()填充,而不由__init__调用。我实际上不确定这是错误还是功能。建议使用from_pretrained从预训练的令牌生成器初始化令牌生成器的方法,因此应使用。