如何使用拥抱脸变压器批量制作训练器垫输入?

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
)

我尝试将paddingtruncation 参数放入标记器、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])。

【讨论】:

以上是关于如何使用拥抱脸变压器批量制作训练器垫输入?的主要内容,如果未能解决你的问题,请参考以下文章

无法为拥抱脸变压器库安装 tensorflow

我们是不是应该小写输入数据以(预)使用拥抱脸训练 BERT 无大小写模型?

训练后如何查看拥抱脸模型的变化?

使用拥抱面变压器只保存最佳重量

训练使用 AutoConfig 定义的拥抱脸 AutoModel

基于 BERT 的 CNN - 卷积和 Maxpooling