GloVe词向量自定义函数实现词向量降维_深度学习

TEXT.build_vocab(train_data, max_size=10000, vectors='glove.6B.100d')
LABEL.build_vocab(train_data)
pretrained_embedding = TEXT.vocab.vectors

上面代码加载了glove.6B.100d词向量,假设我需要设计一个函数,将词向量长为100映射到长为50,这个映射方法就是取每个向量的前50个元素,现在用torch代码实现这个功能,并将50维的向量加载到bi-lstm神经网络模型中

以下是将100维的GloVe词向量映射到50维的PyTorch代码:

import torch.nn as nn
import torch.nn.functional as F

# 假设词向量已经加载到pretrained_embedding变量中

# 取前50个元素作为新的词向量
new_embeddings = pretrained_embedding[:, :50]

# 构建Bi-LSTM模型
class BiLSTM(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim, embeddings):
        super(BiLSTM, self).__init__()

        # 将新的50维词向量加载到Embedding层中
        self.embedding = nn.Embedding.from_pretrained(embeddings, freeze=True)

        # Bi-LSTM网络
        self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers=2, batch_first=True, bidirectional=True)
        self.fc = nn.Linear(hidden_dim*2, output_dim)

    def forward(self, text):
        embedded = self.embedding(text)
        output, (hidden, cell) = self.lstm(embedded)
        hidden_concat = torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim=1)
        output = self.fc(hidden_concat)
        return output

# 初始化模型
input_dim = 50  # 50维的词向量
hidden_dim = 256
output_dim = 2
model = BiLSTM(input_dim, hidden_dim, output_dim, new_embeddings)

其中,nn.Embedding.from_pretrained()函数用于将预训练的词向量加载到Embedding层中,参数freeze=True表示冻结词向量,不参与模型的训练过程。在BiLSTM类中,self.embedding表示Embedding层,self.lstm表示Bi-LSTM层,self.fc表示全连接层。torch.cat()函数用于将前向和后向LSTM的最后一层输出进行拼接。

续上要求, TEXT.build_vocab(train_data, max_size=10000, vectors='glove.6B.100d')中的词向量是100维的,假设我要逐一的将每一个词的向量用映射函数A降维到50维,再将各个降维的结果拼凑到TEXT.build_vocab里面,pretrained_embedding = TEXT.vocab.vectors后,每次调用的词向量都是50维的词向量

以下是将100维的GloVe词向量逐一映射到50维并拼凑到TEXT.vocab.vectors中的代码:

import torch.nn.functional as F

# 假设词向量已经加载到TEXT.vocab.vectors变量中

# 逐一将每个词的向量用映射函数A降维到50维
new_vectors = []
for i, word in enumerate(TEXT.vocab.itos):
    old_vector = TEXT.vocab.vectors[i]
    new_vector = F.linear(old_vector, torch.eye(100, 50))
    new_vectors.append(new_vector)

# 将降维后的词向量拼凑成张量
new_embeddings = torch.stack(new_vectors, dim=0)

# 构建Bi-LSTM模型
class BiLSTM(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim, embeddings):
        super(BiLSTM, self).__init__()

        # 将新的50维词向量加载到Embedding层中
        self.embedding = nn.Embedding.from_pretrained(embeddings, freeze=True)

        # Bi-LSTM网络
        self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers=2, batch_first=True, bidirectional=True)
        self.fc = nn.Linear(hidden_dim*2, output_dim)

    def forward(self, text):
        embedded = self.embedding(text)
        output, (hidden, cell) = self.lstm(embedded)
        hidden_concat = torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim=1)
        output = self.fc(hidden_concat)
        return output

# 初始化模型
input_dim = 50  # 50维的词向量
hidden_dim = 256
output_dim = 2
model = BiLSTM(input_dim, hidden_dim, output_dim, new_embeddings)

其中,torch.eye(100, 50)用于生成100x50的单位矩阵,作为映射函数A。在循环中,对于每个词向量,都通过F.linear()函数与单位矩阵进行映射,将100维的词向量降维到50维,并将结果保存到new_vectors列表中。最后,通过torch.stack()函数将所有降维后的词向量拼凑成张量,并将其加载到Embedding层中,构建Bi-LSTM模型。