如何使用拥抱脸变压器批量制作训练器垫输入?
Posted
技术标签:
【中文标题】如何使用拥抱脸变压器批量制作训练器垫输入?【英文标题】:How to make a Trainer pad inputs in a batch with huggingface-transformers? 【发布时间】:2021-01-10 19:03:59 【问题描述】:我正在尝试使用 Trainer 训练模型,根据文档 (https://huggingface.co/transformers/master/main_classes/trainer.html#transformers.Trainer),我可以指定标记器:
tokenizer (PreTrainedTokenizerBase, optional) – 用于 预处理数据。如果提供,将用于自动填充 批处理输入时输入的最大长度,它将是 沿模型保存,以便更轻松地重新运行中断的 训练或重用微调后的模型。
所以填充应该被自动处理,但是当尝试运行它时我得到这个错误:
ValueError: 无法创建张量,您应该激活 用 'padding=True' 'truncation=True' 截断和/或填充 具有相同长度的批量张量。
tokenizer 是这样创建的:
tokenizer = BertTokenizerFast.from_pretrained(pretrained_model)
还有这样的教练:
trainer = Trainer(
tokenizer=tokenizer,
model=model,
args=training_args,
train_dataset=train,
eval_dataset=dev,
compute_metrics=compute_metrics
)
我尝试将padding
和truncation
参数放入标记器、Trainer 和training_args 中。什么都没有。有什么想法吗?
【问题讨论】:
您是否尝试在模型配置中查看? config = AutoConfig.from_pretrained(...) 同样的问题,你找到解决办法了吗? 【参考方案1】:查看您的分词器返回的列。您可能希望仅将其限制为必需的列。
举例
def preprocess_function(examples):
#function to tokenize the dataset.
if sentence2_key is None:
return tokenizer(examples[sentence1_key], truncation=True,padding=True)
return tokenizer(examples[sentence1_key], examples[sentence2_key], truncation=True,padding=True)
encoded_dataset = dataset.map(preprocess_function,
batched=True,load_from_cache_file=False)
#Thing you should do is
columns_to_return = ['input_ids', 'label', 'attention_mask']
encoded_dataset.set_format(type='torch', columns=columns_to_return)
希望对你有帮助。
【讨论】:
这里的sentence1_key和sentence2_key是什么?【参考方案2】:我能够通过向训练器添加一个数据收集器来解决这个问题。
from transformers import DataCollatorForTokenClassification
data_collator = DataCollatorForTokenClassification(tokenizer)
trainer = Trainer(
model=model,
args=args,
train_dataset=...,
eval_dataset=...,
compute_metrics=compute_metrics,
data_collator=data_collator,
tokenizer=tokenizer,
optimizers=(optimizer, None),
)
【讨论】:
【参考方案3】:当标记器的输入之一是 None
时,我遇到了同样的错误。
我的分词器同时接收两个文本(因此 Bert 将在它们之间添加 [SEP])。
【讨论】:
以上是关于如何使用拥抱脸变压器批量制作训练器垫输入?的主要内容,如果未能解决你的问题,请参考以下文章
我们是不是应该小写输入数据以(预)使用拥抱脸训练 BERT 无大小写模型?