问题描述
我是拥抱脸部变形器的新手,并且在从头开始训练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
从预训练的令牌生成器初始化令牌生成器的方法,因此应使用。