如何将微调过的 bert 模型的输出作为输入提供给另一个微调过的 bert 模型?

Posted

技术标签:

【中文标题】如何将微调过的 bert 模型的输出作为输入提供给另一个微调过的 bert 模型?【英文标题】:How to feed the output of a finetuned bert model as inpunt to another finetuned bert model? 【发布时间】:2020-06-03 11:28:59 【问题描述】:

我在情绪分析和 pos 标记任务上微调了两个独立的 bert 模型(bert-base-uncased)。现在,我想将 pos 标记器的输出(batch、seqlength、hiddensize)作为情绪模型的输入。原始的 bert-base-uncased 模型位于“bertModel/”文件夹中,其中包含“model.bin”和“配置.json'。这是我的代码:

class DeepSequentialModel(nn.Module):
def __init__(self, sentiment_model_file, postag_model_file, device):
    super(DeepSequentialModel, self).__init__()

    self.sentiment_model = SentimentModel().to(device)
    self.sentiment_model.load_state_dict(torch.load(sentiment_model_file, map_location=device))
    self.postag_model = PosTagModel().to(device)
    self.postag_model.load_state_dict(torch.load(postag_model_file, map_location=device))

    self.classificationLayer = nn.Linear(768, 1)

def forward(self, seq, attn_masks):
    postag_context = self.postag_model(seq, attn_masks)
    sent_context = self.sentiment_model(postag_context, attn_masks)
    logits = self.classificationLayer(sent_context)
    return logits

class PosTagModel(nn.Module):
def __init__(self,):
    super(PosTagModel, self).__init__()
    self.bert_layer = BertModel.from_pretrained('bertModel/')
    self.classificationLayer = nn.Linear(768, 43)

def forward(self, seq, attn_masks):
    cont_reps, _ = self.bert_layer(seq, attention_mask=attn_masks)
    return cont_reps

class SentimentModel(nn.Module):
def __init__(self,):
    super(SentimentModel, self).__init__()
    self.bert_layer = BertModel.from_pretrained('bertModel/')
    self.cls_layer = nn.Linear(768, 1)

def forward(self, input, attn_masks):
    cont_reps, _ = self.bert_layer(encoder_hidden_states=input, encoder_attention_mask=attn_masks)
    cls_rep = cont_reps[:, 0]
    return cls_rep

但我收到以下错误。如果有人可以帮助我,我将不胜感激。谢谢!

    cont_reps, _ = self.bert_layer(encoder_hidden_states=input, encoder_attention_mask=attn_masks)
    result = self.forward(*input, **kwargs)
    TypeError: forward() got an unexpected keyword argument 'encoder_hidden_states'

【问题讨论】:

您使用的是哪个版本的transformers @dennlinger 变压器 2.1.1 那么是时候更新你的转换器版本了。 documentation for 2.1.1 清楚地列出了前向传递的非常过时的版本,因此这就是您无法访问(当时不存在的)参数的原因。 【参考方案1】:

也将其作为答案,并使其对未来的访问者正确可见,forward() 调用变形金刚does not support these arguments in version 2.1.1 或任何早期版本,就此而言。请注意,我评论中的链接实际上指向不同的转发功能,但除此之外,这一点仍然成立。

encoder_hidden_states 传递给forward() 是first possible in version 2.2.0。

【讨论】:

以上是关于如何将微调过的 bert 模型的输出作为输入提供给另一个微调过的 bert 模型?的主要内容,如果未能解决你的问题,请参考以下文章

将 LIME 解释应用于我的微调 BERT 以进行序列分类模型?

如何使用微调的 BERT 模型进行句子编码?

如何再次微调一个bert微调模型

中文情感分类任务如何对bert语言模型微调,微调后的模型如何使用

如何微调 HuggingFace BERT 模型以进行文本分类 [关闭]

针对特定领域微调 Bert(无监督)