我目前正试图在设法获得培训和测试的情况下实施CBOW模型,但对于最终从模型中提取权重以用作词嵌入的“正确”方法面临一些困惑。 / p>
class CBOW(nn.Module):
def __init__(self, config, vocab):
self.config = config # Basic config file to hold arguments.
self.vocab = vocab
self.vocab_size = len(self.vocab.token2idx)
self.window_size = self.config.window_size
self.embed = nn.Embedding(num_embeddings=self.vocab_size, embedding_dim=self.config.embed_dim)
self.linear = nn.Linear(in_features=self.config.embed_dim, out_features=self.vocab_size)
def forward(self, x):
x = self.embed(x)
x = torch.mean(x, dim=0) # Average out the embedding values.
x = self.linear(x)
return x
在通过带有训练和测试数据的求解器运行模型之后,我基本上告诉了train
和test
函数也返回了所使用的模型。然后,我将嵌入权重分配给一个单独的变量,并将其用作单词嵌入。
使用交叉熵损失进行训练和测试,每个训练和测试样本的形式均为([context words], target word)
。
def run(solver, config, vocabulary):
for epoch in range(config.num_epochs):
loss_train, model_train = solver.train()
loss_test, model_test = solver.test()
embeddings = model_train.embed.weight
我不确定这是否是提取和使用嵌入的正确方法。通常有其他方法可以做到这一点吗?预先感谢。
答案 0 :(得分:1)
是的,model_train.embed.weight
将为您提供一个存储嵌入权重的火炬张量。但是请注意,该张量还包含最新的渐变。如果您不需要/不需要它们,model_train.embed.weight.data
将只为您提供权重。
更通用的选择是调用model_train.embed.parameters()
。这将为您提供该层所有权重张量的生成器。通常,一层中有多个权重张量,weight
仅会给您一个。 Embedding
恰好只有一个,因此这里使用哪个选项都没有关系。