Bert-LWAN pytorch版代码

本文介绍了一种基于Bert的大型多标签文本分类模型Bert-LWAN的PyTorch实现。该模型适用于包括少量和零样本标签的大规模多标签分类任务,并提供了详细的代码实现。
部署运行你感兴趣的模型镜像

Bert-LWAN pytorch版代码

模型来源《An Empirical Study on Large-Scale Multi-Label Text Classification Including Few and Zero-Shot Labels》

pytorch版代码地址:https://github.com/wcx881212/wcx881212.github.io/tree/Bert-LWAN
tensorflow版源码地址:https://github.com/iliaschalkidis/lmtc-emnlp2020

model 可参考CAML模型 来源《Explainable Prediction of Medical Codes from Clinical Text》

import torch
from torch.nn.init import xavier_uniform
from torch import nn
from torch.nn import functional as F
from transformers import AutoModel
from neural_networks.custom_layers.dropout import SpatialDropout
from neural_networks.custom_layers.masking import Camouflage

class Model(nn.Module):
    def __init__(self, n_classes=4654, dropout_rate=0.5):
        super(Model, self).__init__()
        self.bert = AutoModel.from_pretrained("bert-base-uncased")
        self.dropout = SpatialDropout(drop=dropout_rate)
        self.masking = Camouflage(mask_value=0)
        self.U = nn.Linear(768,n_classes)  # 输入 输出
        xavier_uniform(self.U.weight)
        self.final = nn.Linear(768,n_classes)
        xavier_uniform(self.final.weight)

    def forward(self,x_batch):
        bert_output = self.bert(x_batch)  # 32 512 768
        inner_out = self.dropout(bert_output[0])
        x = self.masking(inputs=[inner_out, bert_output[0]])  # 32 512 768
        alpha = F.softmax(torch.transpose(self.U(x),1,2), dim=-1)#32 4654 512
        m = alpha.matmul(x)#torch.Size([32, 4654, 768])
        # final layer classification
        y = self.final.weight.mul(m).sum(dim=2).add(self.final.bias)#torch.Size([32, 4654])
        y = torch.sigmoid(y)
        return y

实验数据
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### 实现和使用 BERT Adapter 的方法 #### 安装依赖库 为了在 PyTorch 中实现和使用 BERT Adapter,需要先安装必要的 Python 库。通常情况下,这包括 `transformers` 和其他辅助工具。 ```bash pip install transformers adapters torch ``` #### 配置环境 配置以 YAML 文件形式存在,在 Torchtune 中每个配置文件定义了一个完整的微调任务[^1]。对于 BERT Adapter 来说,主要涉及的是模型架构的选择以及特定于适配器的部分参数设定: - **数据集路径**: 指定用于训练的数据源位置。 - **模型结构**: 使用预训练好的 BERT 模型作为基础,并加载相应的适配器模块。 - **优化器设置**: 如 AdamW 是一种常见的选择。 - **训练细节**: 批量大小、初始学习率等超参需合理指定。 #### 示例代码:创建并训练带有 Adapter 的 BERT 模型 下面是一个简单的例子来说明如何初始化一个带有一个或多个适配器的 BERT 模型,并对其进行微调: ```python from transformers import BertModel, BertTokenizerFast, AdapterConfig import torch.nn as nn import torch.optim as optim from datasets import load_dataset # 加载预训练BERT模型及其分词器 model_name = "bert-base-uncased" tokenizer = BertTokenizerFast.from_pretrained(model_name) base_model = BertModel.from_pretrained(model_name) # 添加自定义适配器配置 config = AdapterConfig(mh_adapter=True, output_adapter=True, reduction_factor=16, non_linearity="relu") # 向模型添加新适配器 adapter_name = base_model.add_adapter("my_custom_adapter", config=config) # 设置当前使用的适配器 base_model.set_active_adapters([adapter_name]) # 将模型设为训练模式 base_model.train() # 准备下游任务分类头 (假设二元分类问题) classifier_head = nn.Linear(base_model.config.hidden_size, 2) # 组合整个网络结构 full_model = nn.Sequential( base_model, classifier_head ).cuda() if torch.cuda.is_available() else full_model.cpu() # 数据准备省略... # 构建损失函数与优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.AdamW(full_model.parameters(), lr=5e-5) for epoch in range(num_epochs): # num_epochs应由用户定义 for batch in dataloader: # 假设有dataloader对象可用 optimizer.zero_grad() input_ids = batch['input_ids'].to('cuda' if next(base_model.parameters()).is_cuda else 'cpu') attention_mask = batch['attention_mask'].to('cuda' if next(base_model.parameters()).is_cuda else 'cpu') labels = batch['labels'].to('cuda' if next(classifier_head.parameters()).is_cuda else 'cpu') outputs = full_model(input_ids=input_ids, attention_mask=attention_mask)[0] loss = criterion(outputs.view(-1, 2), labels.view(-1)) loss.backward() optimizer.step() ``` 此段代码展示了如何利用 Hugging Face 提供的 API 创建基于 BERT 的适配器,并将其应用于具体的自然语言处理任务上。注意这里简化了一些实际操作中的步骤,比如数据读取/预处理环节并未给出具体实现方式。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值