当前位置: 首页 > 工具软件 > Bart > 使用案例 >

[DL]BART模型输入特征融合

梁丘佑运
2023-12-01

1-问题描述

特征向量存储格式为numpy数组,将该numpy数组与Bart模型的输入拼接在一起。

2-问题解决

首先需要将numpy数组转换为pytorch张量,然后通过pytorch的torch.cat()函数将特征向量与Bart模型的输入进行拼接。

3-具体步骤

  • 加载库函数

    import torch
    import numpy as np
    from transformers import BartTokenizer, BartModel  
    

    加载中文Bart模型需要导入的库函数与英文不同,可到Hugging Face官网搜索bart chinese查看使用方法

  • 创建Bart模型

    model = BartModel.from_pretrained('facebook/bart-large')
    
  • 加载数据集

    train_dataset = pd.DataFrame(train_data, columns=["input_text", "target_text"])
    train_dataloader = DataLoader(train_dataset)
    # 设置进度条
    batch_iterator = tqdm(
        train_dataloader,
        desc=f"Running Epoch {epoch_number} of {epochs}",
        disable=args.silent,
        mininterval=0,  # 最小的更新时间
    )    
    
  • 获取特征向量

    sememe_features = np.load('./data/train_SATvec.npz')  # 加载通过义原模型进行训练的特征向量
    

    训练义原特征向量的方法 paper

  • 向量拼接

    for step, batch in enumerate(batch_iterator):
        source_ids, source_mask, y = batch["source_ids"], batch["source_mask"], batch["target_ids"]
        y_ids = y[:, :-1].contiguous()
        labels = y[:, 1:].clone()
        labels[y[:, 1:] == pad_token_id] = -100
        
        num_vectors = len(batch["source_ids"])  
        fusion = []  # 存放特征融合后的向量
        tensor_length = 32768  # 指定拼接后向量的固定长度
        for i in range(num_vectors):
            key = str(i*step+i)  # 根据保存的特征向量的key进行特征向量获取,类似于字典的value取出
            sememe = sememe_features[key]
            sememe = torch.from_numpy(sememe)  # 将numpy数组转换为tensor向量
            connection = torch.cat([source_ids[i], sememe], dim=0)
                if len(connection) < tensor_length:
                    connection = torch.cat((connection, torch.zeros(tensor_length-len(connection))))
                elif len(connection) > tensor_length:
                    connection = connection[0: tensor_length]
                else:
                    connection = connection
                fusion.append(connection)
            source_ids = torch.stack(fusion, dim=0)  # torch.stack()将列表中的结果堆叠成一个张量
            source_ids = torch.tensor(source_ids, dtype=torch.long)  # pyTorch中的nn.Embedding模块期望输入tensor是一个整数类型(long或int)
        inputs = {
            "input_ids": source_ids.to(device),
            "attention_mask": source_mask.to(device),
            "decoder_input_ids": y_ids.to(device),
            "labels": labels.to(device),
        }
    
  • 将拼接后的向量输入到Bart模型进行预测

    outputs = model(**inputs)  # **会把接收到的参数按字典拆分成独立的参数
    
 类似资料: