jupyter快速实现单标签及多标签多分类的文本分类BERT模型

jupyter实现pytorch版BERT(单标签分类版)

nlp-notebooks/Text classification with BERT in PyTorch.ipynb

通过改写上述代码,实现多标签分类

参考解决方案 ,我选择的解决方案是继承BertForSequenceClassification并改写,即将上述代码的ln [9] 改为以下内容:

from transformers.modeling_bert import BertForSequenceClassification
from transformers.modeling_outputs import SequenceClassifierOutput

class BertForMultilabelSequenceClassification(BertForSequenceClassification):
   def __init__(self, config):
     super().__init__(config)

   def forward(self,
       input_ids=None,
       attention_mask=None,
       token_type_ids=None,
       position_ids=None,
       head_mask=None,
       inputs_embeds=None,
       labels=None,
       output_attentions=None,
       output_hidden_states=None,
       return_dict=None):
       return_dict = return_dict if return_dict is not None else self.config.use_return_dict

       outputs = self.bert(input_ids,
           attention_mask=attention_mask,
           token_type_ids=token_type_ids,
           position_ids=position_ids,
           head_mask=head_mask,
           inputs_embeds=inputs_embeds,
           output_attentions=output_attentions,
           output_hidden_states=output_hidden_states,
           return_dict=return_dict)

       pooled_output = outputs[1]
       pooled_output = self.dropout(pooled_output)
       logits = self.classifier(pooled_output)

       loss = None
       if labels is not None:
           loss_fct = torch.nn.BCEWithLogitsLoss()
           loss = loss_fct(logits.view(-1, self.num_labels), 
                           labels.float().view(-1, self.num_labels))

       if not return_dict:
           output = (logits,) + outputs[2:]
           return ((loss,) + output) if loss is not None else output

       return SequenceClassifierOutput(loss=loss,
           logits=logits,
           hidden_states=outputs.hidden_states,
           attentions=outputs.attentions)
           
model = BertForMultilabelSequenceClassification.from_pretrained(BERT_MODEL, num_labels = len(label2idx))
model.to(device)

相关推荐

  1. 标签分类区别

    2024-01-08 19:32:03       37 阅读
  2. 标签正则化和硬标签、软标签标签标签

    2024-01-08 19:32:03       43 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-08 19:32:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-08 19:32:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-08 19:32:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-08 19:32:03       18 阅读

热门阅读

  1. web学习笔记(十二)

    2024-01-08 19:32:03       22 阅读
  2. 安装jupyter notebook,jupyter notebook的简单使用

    2024-01-08 19:32:03       44 阅读
  3. ES6中WeakMap和Map的区别

    2024-01-08 19:32:03       32 阅读
  4. 若依用户端与管理端认证分离

    2024-01-08 19:32:03       44 阅读
  5. 【论文阅读】Variational Graph Auto-Encoder

    2024-01-08 19:32:03       35 阅读