RobertaTokenizer() 和 from_pretrained() 初始化 RobertaTokenizer 的方式有什么区别?
What is the difference in RobertaTokenizer() and from_pretrained() way of initialising RobertaTokenizer?
我是 huggingface transformers 的新手,在从头开始训练 RobertaForMaskedLM
LM 时遇到以下问题:
首先,我训练并保存了一个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)
然后,通过创建 RobertaTokenizer
使用此分词器训练 RobertaForMaskedLM
,如下所示:
roberta_tokenizer = RobertaTokenizer(tokenizer_mdl + "/vocab.json", tokenizer_mdl + "/merges.txt")
但是现在,当我尝试使用填充蒙版管道测试经过训练的 LM 时,
fill_mask_pipeline = pipeline("fill-mask", model=roberta_model, tokenizer=roberta_tokenizer)
我收到以下错误:
PipelineException: No mask_token () found on the input
所以,我意识到,我加载的分词器也在分词 <mask>
分词。但我不明白为什么要这样做。请帮助我理解这一点。
尝试了几种方法后,我以不同的方式加载了分词器,
roberta_tokenizer = RobertaTokenizer.from_pretrained(tokenizer_mdl)
并且,现在 fill_mask_pipeline
运行没有错误。那么,使用 RobertaTokenizer()
和使用 .from_pretrained()
方法加载分词器有什么区别?
当您比较 属性 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
是从预训练分词器初始化分词器的推荐方法,因此应该使用。
我是 huggingface transformers 的新手,在从头开始训练 RobertaForMaskedLM
LM 时遇到以下问题:
首先,我训练并保存了一个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)
然后,通过创建 RobertaTokenizer
使用此分词器训练 RobertaForMaskedLM
,如下所示:
roberta_tokenizer = RobertaTokenizer(tokenizer_mdl + "/vocab.json", tokenizer_mdl + "/merges.txt")
但是现在,当我尝试使用填充蒙版管道测试经过训练的 LM 时,
fill_mask_pipeline = pipeline("fill-mask", model=roberta_model, tokenizer=roberta_tokenizer)
我收到以下错误:
PipelineException: No mask_token () found on the input
所以,我意识到,我加载的分词器也在分词 <mask>
分词。但我不明白为什么要这样做。请帮助我理解这一点。
尝试了几种方法后,我以不同的方式加载了分词器,
roberta_tokenizer = RobertaTokenizer.from_pretrained(tokenizer_mdl)
并且,现在 fill_mask_pipeline
运行没有错误。那么,使用 RobertaTokenizer()
和使用 .from_pretrained()
方法加载分词器有什么区别?
当您比较 属性 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
是从预训练分词器初始化分词器的推荐方法,因此应该使用。