PyTorch BERT TypeError: forward() got an unexpected keyword argument 'labels'

Posted

技术标签:

【中文标题】PyTorch BERT TypeError: forward() got an unexpected keyword argument \'labels\'【英文标题】:PyTorch BERT TypeError: forward() got an unexpected keyword argument 'labels'PyTorch BERT TypeError: forward() got an unexpected keyword argument 'labels' 【发布时间】:2020-02-15 15:30:09 【问题描述】:

使用 PyTorch 转换器训练 BERT 模型(遵循教程 here)。

教程中的以下语句

loss = model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask, labels=b_labels)

导致

TypeError: forward() got an unexpected keyword argument 'labels'

这是完整的错误,

TypeError                                 Traceback (most recent call last)
<ipython-input-53-56aa2f57dcaf> in <module>
     26         optimizer.zero_grad()
     27         # Forward pass
---> 28         loss = model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask, labels=b_labels)
     29         train_loss_set.append(loss.item())
     30         # Backward pass

~/anaconda3/envs/systreviewclassifi/lib/python3.6/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    539             result = self._slow_forward(*input, **kwargs)
    540         else:
--> 541             result = self.forward(*input, **kwargs)
    542         for hook in self._forward_hooks.values():
    543             hook_result = hook(self, input, result)

TypeError: forward() got an unexpected keyword argument 'labels'

我似乎无法弄清楚 forward() 函数需要什么样的参数。

有一个类似的问题here,但我还是不明白解决方案是什么。

系统信息:

操作系统:Ubuntu 16.04 LTS Python 版本:3.6.x Torch 版本:1.3.0 Torch Vision 版本:0.4.1 PyTorch 转换器版本:1.2.0

【问题讨论】:

顺便说一句,你是如何定义你的模型的?我认为带有“...ForSequenceClassification”后缀的模型可以接受'labels'参数。 @AswinCandra 我使用了不接受标签的普通 BERT 模型,因为它没有任何此类参数。 【参考方案1】:

据我所知,BertModel 不会在 forward() 函数中使用标签。查看forward函数参数。

我怀疑您正在尝试对序列分类任务的 BertModel 进行微调,而 API 为 BertForSequenceClassification 提供了一个类。可以看到它的 forward() 函数定义:

def forward(self, input_ids, attention_mask=None, token_type_ids=None,
            position_ids=None, head_mask=None, labels=None):

请注意,forward() 方法返回以下内容。

Outputs: `Tuple` comprising various elements depending on the configuration (config) and inputs:
        **loss**: (`optional`, returned when ``labels`` is provided) ``torch.FloatTensor`` of shape ``(1,)``:
            Classification (or regression if config.num_labels==1) loss.
        **logits**: ``torch.FloatTensor`` of shape ``(batch_size, config.num_labels)``
            Classification (or regression if config.num_labels==1) scores (before SoftMax).
        **hidden_states**: (`optional`, returned when ``config.output_hidden_states=True``)
            list of ``torch.FloatTensor`` (one for the output of each layer + the output of the embeddings)
            of shape ``(batch_size, sequence_length, hidden_size)``:
            Hidden-states of the model at the output of each layer plus the initial embedding outputs.
        **attentions**: (`optional`, returned when ``config.output_attentions=True``)
            list of ``torch.FloatTensor`` (one for each layer) of shape ``(batch_size, num_heads, sequence_length, sequence_length)``:
            Attentions weights after the attention softmax, used to compute the weighted average in the self-attention heads. 

希望这会有所帮助!

【讨论】:

以上是关于PyTorch BERT TypeError: forward() got an unexpected keyword argument 'labels'的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch 1.7.0 | DataLoader 错误 - TypeError:“模块”对象不可调用

pytorch-pretrained-BERT:BERT PyTorch实现,可加载Google BERT预训练模型

踩坑笔记(pytorch-bert,dataframe,交叉熵)

小白学习PyTorch教程十五BERT:通过PyTorch来创建一个文本分类的Bert模型

从 `pytorch-pretrained-bert` 迁移到 `pytorch-transformers` 关于模型()输出的问题

使用 pytorch 进行 BERT 文本分类