我想构建一个多类分类模型,将会话数据作为 BERT 模型的输入(使用 bert-base-uncased)。
提问:我想问一个问题。
答:当然可以,问吧。
询问:今天天气怎么样?
答:天气很好,阳光明媚。
问题:好的,很高兴知道。
回答:您还想了解其他信息吗?
除此之外,我还有两个输入。
我想知道是否应该在对话中添加特殊标记,以使其对 BERT 模型更有意义,例如:
[CLS]QUERY:我想问一个问题。[EOT]
答案:当然可以,问吧。[EOT]
查询:今天天气怎么样?[EOT]
答案:天气很好,阳光明媚。[EOT]
查询:好的,很高兴知道。[EOT]
解答:您还想了解其他信息吗?[九月]
但我无法添加新的 [EOT] 特殊令牌。
或者我应该为此使用 [SEP] 令牌?
编辑:重现步骤
from transformers import AutoTokenizer, AutoModelForSequenceClassification
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
print(tokenizer.all_special_tokens) # --> ['[UNK]', '[SEP]', '[PAD]', '[CLS]', '[MASK]']
print(tokenizer.all_special_ids) # --> [100, 102, 0, 101, 103]
num_added_toks = tokenizer.add_tokens(['[EOT]'])
model.resize_token_embeddings(len(tokenizer)) # --> Embedding(30523, 768)
tokenizer.convert_tokens_to_ids('[EOT]') # --> 30522
text_to_encode = '''QUERY: I want to ask a question. [EOT]
ANSWER: Sure, ask away. …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将标记生成器保存在 Huggingface 中,以便以后可以从不需要访问互联网的容器中加载它。
BASE_MODEL = "distilbert-base-multilingual-cased"
tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL)
tokenizer.save_vocabulary("./models/tokenizer/")
tokenizer2 = AutoTokenizer.from_pretrained("./models/tokenizer/")
Run Code Online (Sandbox Code Playgroud)
但是,最后一行给出了错误:
OSError: Can't load config for './models/tokenizer3/'. Make sure that:
- './models/tokenizer3/' is a correct model identifier listed on 'https://huggingface.co/models'
- or './models/tokenizer3/' is the correct path to a directory containing a config.json file
Run Code Online (Sandbox Code Playgroud)
变压器版本:3.1.0
不幸的是,如何从 Pytorch 中的预训练模型加载保存的标记器并没有帮助。
感谢下面@ashwin 的回答,我save_pretrained
改为尝试,但出现以下错误:
OSError: Can't load config for './models/tokenizer/'. Make sure that:
- './models/tokenizer/' is a correct model identifier listed on 'https://huggingface.co/models'
- or …
Run Code Online (Sandbox Code Playgroud) 我正在关注变压器的预训练模型xlm-roberta-large-xnli示例
from transformers import pipeline
classifier = pipeline("zero-shot-classification",
model="joeddav/xlm-roberta-large-xnli")
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
ValueError: Couldn't instantiate the backend tokenizer from one of: (1) a `tokenizers` library serialization file, (2) a slow tokenizer instance to convert or (3) an equivalent slow tokenizer class to instantiate and convert. You need to have sentencepiece installed to convert a slow tokenizer to a fast one.
Run Code Online (Sandbox Code Playgroud)
我用的是变形金刚版 '4.1.1'
我正在尝试向预训练的 HuggingFace Transformers 模型的词汇表中添加一些新单词。我执行了以下操作来更改分词器的词汇并增加模型的嵌入大小:
tokenizer.add_tokens(['word1', 'word2', 'word3', 'word4'])
model.resize_token_embeddings(len(tokenizer))
print(len(tokenizer)) # outputs len_vocabulary + 4
Run Code Online (Sandbox Code Playgroud)
但是在我的语料库上训练模型并保存后,我发现保存的分词器词汇量没有改变。再次检查后发现上述代码并没有改变词汇量大小(tokenizer.vocab_size仍然相同),只有len(tokenizer)发生了变化。
所以现在我的问题是;tokenizer.vocab_size 和 len(tokenizer) 有什么区别?
nlp tokenize huggingface-transformers huggingface-tokenizers
我正在按照 HuggingFace 的序列分类教程学习 NLP https://huggingface.co/transformers/custom_datasets.html#sequence-classification-with-imdb-reviews
原始代码运行没有问题。但是,当我尝试加载不同的标记生成器(例如来自 的标记生成器)时google/bert_uncased_L-4_H-256_A-4
,会出现以下警告:
Asking to truncate to max_length but no maximum length is provided and the model has no predefined maximum length. Default to no truncation.
from transformers import AutoTokenizer
from pathlib import Path
def read_imdb_split(split_dir):
split_dir = Path(split_dir)
texts = []
labels = []
for label_dir in ["pos", "neg"]:
for text_file in (split_dir/label_dir).iterdir():
texts.append(text_file.read_text())
labels.append(0 if label_dir is "neg" else 1)
return texts[:50], labels[:50]
if __name__ == '__main__':
test_texts, test_labels = read_imdb_split('aclImdb/test')
tokenizer …
Run Code Online (Sandbox Code Playgroud) 我正在关注这个使用 BERT 和Huggingface库编写情感分析分类器的教程,我有一个非常奇怪的行为。当使用示例文本尝试 BERT 模型时,我得到一个字符串而不是隐藏状态。这是我正在使用的代码:
import transformers
from transformers import BertModel, BertTokenizer
print(transformers.__version__)
PRE_TRAINED_MODEL_NAME = 'bert-base-cased'
PATH_OF_CACHE = "/home/mwon/data-mwon/paperChega/src_classificador/data/hugingface"
tokenizer = BertTokenizer.from_pretrained(PRE_TRAINED_MODEL_NAME,cache_dir = PATH_OF_CACHE)
sample_txt = 'When was I last outside? I am stuck at home for 2 weeks.'
encoding_sample = tokenizer.encode_plus(
sample_txt,
max_length=32,
add_special_tokens=True, # Add '[CLS]' and '[SEP]'
return_token_type_ids=False,
padding=True,
truncation = True,
return_attention_mask=True,
return_tensors='pt', # Return PyTorch tensors
)
bert_model = BertModel.from_pretrained(PRE_TRAINED_MODEL_NAME,cache_dir = PATH_OF_CACHE)
last_hidden_state, pooled_output = bert_model(
encoding_sample['input_ids'],
encoding_sample['attention_mask']
) …
Run Code Online (Sandbox Code Playgroud) bert-language-model huggingface-transformers huggingface-tokenizers
transformers
我通过以下方式从 HuggingFace 获得了预训练的 BERT 和相应的分词器:
from transformers import AutoTokenizer, TFBertModel
model_name = "dbmdz/bert-base-italian-xxl-cased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
bert = TFBertModel.from_pretrained(model_name)
Run Code Online (Sandbox Code Playgroud)
该模型将被输入一系列意大利推文,并需要确定它们是否具有讽刺意味。
我在构建模型的初始部分时遇到问题,该部分获取输入并将其提供给分词器,以获得可以提供给 BERT 的表示。
我可以在模型构建上下文之外做到这一点:
my_phrase = "Ciao, come va?"
# an equivalent version is tokenizer(my_phrase, other parameters)
bert_input = tokenizer.encode(my_phrase, add_special_tokens=True, return_tensors='tf', max_length=110, padding='max_length', truncation=True)
attention_mask = bert_input > 0
outputs = bert(bert_input, attention_mask)['pooler_output']
Run Code Online (Sandbox Code Playgroud)
但我在构建执行此操作的模型时遇到了麻烦。以下是构建此类模型的代码(问题出在前 4 行):
def build_classifier_model():
text_input = tf.keras.layers.Input(shape=(), dtype=tf.string, name='text')
encoder_inputs = tokenizer(text_input, return_tensors='tf', add_special_tokens=True, max_length=110, padding='max_length', truncation=True)
outputs = bert(encoder_inputs)
net = outputs['pooler_output'] …
Run Code Online (Sandbox Code Playgroud) keras tensorflow bert-language-model huggingface-transformers huggingface-tokenizers
我是 PyTorch 的新手,最近我一直在尝试使用 Transformers。我正在使用 HuggingFace 提供的预训练分词器。
我成功下载并运行它们。但如果我尝试保存它们并再次加载,则会发生一些错误。
如果我用来 AutoTokenizer.from_pretrained
下载分词器,那么它就可以工作。
[1]: tokenizer = AutoTokenizer.from_pretrained('distilroberta-base')
text = "Hello there"
enc = tokenizer.encode_plus(text)
enc.keys()
Out[1]: dict_keys(['input_ids', 'attention_mask'])
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用保存它tokenizer.save_pretrained("distilroberta-tokenizer")
并尝试在本地加载它,则会失败。
[2]: tmp = AutoTokenizer.from_pretrained('distilroberta-tokenizer')
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
/opt/conda/lib/python3.7/site-packages/transformers/configuration_utils.py in get_config_dict(cls, pretrained_model_name_or_path, **kwargs)
238 resume_download=resume_download,
--> 239 local_files_only=local_files_only,
240 )
/opt/conda/lib/python3.7/site-packages/transformers/file_utils.py in cached_path(url_or_filename, cache_dir, force_download, proxies, resume_download, user_agent, extract_compressed_file, force_extract, local_files_only)
266 # File, but it doesn't exist.
--> 267 raise EnvironmentError("file {} not found".format(url_or_filename))
268 else:
OSError: file …
Run Code Online (Sandbox Code Playgroud) python deep-learning pytorch huggingface-transformers huggingface-tokenizers
我有一个关于“即时”标记化的问题。这个问题是通过阅读“如何使用 Transformers 和 Tokenizers 从头开始训练新的语言模型”引发的。最后有这样一句话:“如果您的数据集非常大,您可以选择动态加载和标记示例,而不是作为预处理步骤”。我尝试提出一个将datasets
和结合起来的解决方案tokenizers
,但没有找到一个好的模式。
我想解决方案需要将数据集包装到 Pytorch 数据集中。
作为文档中的具体示例
import torch
class SquadDataset(torch.utils.data.Dataset):
def __init__(self, encodings):
# instead of doing this beforehand, I'd like to do tokenization on the fly
self.encodings = encodings
def __getitem__(self, idx):
return {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
def __len__(self):
return len(self.encodings.input_ids)
train_dataset = SquadDataset(train_encodings)
Run Code Online (Sandbox Code Playgroud)
如何利用标记器的矢量化功能通过“即时”标记化来实现这一点?
我正在使用 T5 模型和分词器来执行下游任务。我想向标记生成器添加某些空格,例如行结尾(\\t)
和制表符(\\t)
。添加这些标记可以工作,但不知何故标记器总是忽略第二个空格。因此,它将序列标记\xe2\x80\x9c\\n\\n\xe2\x80\x9d
为单行结尾,并将序列"\\n\\n\\n\\n"
标记为两个行结尾,依此类推。请参阅下文进行重现。
from transformers import T5Tokenizer\ntokenizer = T5Tokenizer.from_pretrained("t5-large")\ntokenizer.add_tokens(["\\n"])\n\ntokenizer.encode("\\n") # returns [32100, 1] as expected\ntokenizer.encode("\\n\\n") # returns [32100, 1] but expected would be [32100, 32100, 1]\ntokenizer.encode("\\n\\n\\n\\n") # returns [32100, 32100, 1] but expected would be [32100, 32100, 32100, 32100, 1]\n
Run Code Online (Sandbox Code Playgroud)\n这种行为背后的原因是什么?这是一个错误还是与分词器工作原理相关的东西?我注意到这只发生在添加的空格上,而不会发生在其他字符上。
\n有没有办法防止分词器忽略重复的空格?
\nhuggingface-transformers huggingface-tokenizers sentencepiece