gpt4 book ai didi

python - pytorch 或 Huggingface/transformer 标签代码中的何处将 "renamed"放入标签中?

转载 作者:行者123 更新时间:2023-12-03 08:42:07 24 4
gpt4 key购买 nike

我的问题涉及示例,可在伟大的 Huggingface/transformers 库中找到。

我正在使用 notebook ,由库创建者提供作为我的管道的起点。它提供了一个在 Glue 数据集上微调 BERT 进行句子分类的流程。

当进入代码时,我注意到一个非常奇怪的事情,我无法解释。

在示例中,输入数据作为 here 中的 InputFeatures 类的实例引入到模型中。 :

该类有 4 个属性,其中包括 label 属性:

class InputFeatures:
...
input_ids: List[int]
attention_mask: Optional[List[int]] = None
token_type_ids: Optional[List[int]] = None
label: Optional[Union[int, float]] = None

随后将其作为输入字典传递给模型的 forward() 方法。这是由 Trainer 类完成的,例如第 573-576 here 行。 :

    def _training_step(
self, model: nn.Module, inputs: Dict[str, torch.Tensor], optimizer: torch.optim.Optimizer
) -> float:
model.train()
for k, v in inputs.items():
inputs[k] = v.to(self.args.device)

outputs = model(**inputs)

但是,forward() 方法需要标签(注意复数形式)输入参数(取自 here ):

    def forward(
self,
input_ids=None,
attention_mask=None,
head_mask=None,
inputs_embeds=None,
labels=None,
output_attentions=None,
):

所以我的问题是在这个管道中标签在哪里成为标签

为了提供有关该问题的一些额外信息,我创建了自己的管道,它不使用任何与 Glue 数据和管道相关的内容,基本上它仅依赖于 Transformer 的 Trainer 类。我什至使用另一个模型(福楼拜)。我复制了 InputFeature 类,我的代码适用于以下两种情况:

class InputFeature:
def __init__(self, text, label):
self.input_ids = text
self.label = label

class InputFeaturePlural:
def __init__(self, text, label):
self.input_ids = text
self.labels = label

但是,如果我将第二个属性命名为 self.labe 或任何其他名称,则它不起作用。 为什么可以使用两个属性名称?

这对我来说并不是非常重要,但我对传递变量中的数据感到不舒服,因为变量会在某个地方“更改名称”。

最佳答案

重命名发生在整理器中。在 trainer init 时,当 data_collat​​orNone 时,使用默认值:

class Trainer:
# ...
def __init__(...):
# ...
self.data_collator = data_collator if data_collator is not None else default_data_collator
# ...

仅供引用,当您获得 dataloader 时,稍后会使用 self.data_collat​​or :

data_loader = DataLoader(
self.train_dataset,
batch_size=self.args.train_batch_size,
sampler=train_sampler,
collate_fn=self.data_collator, # <-- here
drop_last=self.args.dataloader_drop_last,
)

默认整理器有 special handling for labels ,如果需要的话,它会进行重命名:

# Special handling for labels.
# Ensure that tensor is created with the correct type
# (it should be automatically the case, but let's make sure of it.)
if hasattr(first, "label") and first.label is not None:
if type(first.label) is int:
labels = torch.tensor([f.label for f in features], dtype=torch.long)
else:
labels = torch.tensor([f.label for f in features], dtype=torch.float)
batch = {"labels": labels} # <-- here is where it happens
elif hasattr(first, "label_ids") and first.label_ids is not None:
if type(first.label_ids[0]) is int:
labels = torch.tensor([f.label_ids for f in features], dtype=torch.long)
else:
labels = torch.tensor([f.label_ids for f in features], dtype=torch.float)
batch = {"labels": labels}
else:
batch = {}

关于python - pytorch 或 Huggingface/transformer 标签代码中的何处将 "renamed"放入标签中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62435022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com