【问题标题】: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(...)
  • 同样的问题,你找到解决办法了吗?

标签: python pytorch huggingface-transformers


【解决方案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])。

    【讨论】:

      猜你喜欢
      • 2021-08-16
      • 2022-06-28
      • 2021-12-06
      • 2021-12-21
      • 2023-04-10
      • 2020-06-17
      • 2021-01-26
      • 2021-09-15
      • 2021-08-10
      相关资源
      最近更新 更多