特征向量存储格式为numpy数组,将该numpy数组与Bart模型的输入拼接在一起。
首先需要将numpy数组转换为pytorch张量,然后通过pytorch的torch.cat()函数将特征向量与Bart模型的输入进行拼接。
加载库函数
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) # **会把接收到的参数按字典拆分成独立的参数