You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用Gensim加载预训练词嵌入并导入PyTorch嵌入层?

没问题,我来一步步教你怎么实现把Gensim加载的预训练Word2Vec权重导入PyTorch嵌入层的操作,流程其实很清晰,咱们分步骤来:

1. 先搞定依赖和加载预训练Word2Vec模型

首先确保你已经安装了gensimtorch,如果没装的话,先跑这两行命令:

pip install gensim torch

接下来用Gensim加载预训练的Word2Vec模型——不管是公开的预训练模型(比如Google的GoogleNews-vectors-negative300.bin),还是你自己用Gensim训练好的模型,都可以这么加载:

from gensim.models import KeyedVectors

# 加载二进制格式的预训练模型,文本格式可去掉binary=True参数
word2vec_model = KeyedVectors.load_word2vec_format('path/to/your/word2vec/model.bin', binary=True)
2. 构建词到索引的映射表

PyTorch的Embedding层是通过词的索引来获取嵌入向量的,所以我们需要先建立一个词到索引的字典,这里分两种常见场景:

场景A:直接用预训练模型的词汇表

如果你的任务不需要额外词汇,直接用预训练模型的词汇表就行:

word_to_idx = {word: idx for idx, word in enumerate(word2vec_model.index_to_key)}
vocab_size = len(word_to_idx)
embedding_dim = word2vec_model.vector_size

场景B:结合自定义数据集词汇表

如果你的任务有专属数据集词汇表(包含预训练模型里没有的OOV词),就把自定义词汇表转成索引映射:

# 假设dataset_vocab是你的数据集专属词汇列表
word_to_idx = {}
for idx, word in enumerate(dataset_vocab):
    word_to_idx[word] = idx

vocab_size = len(word_to_idx)
embedding_dim = word2vec_model.vector_size
3. 初始化PyTorch Embedding层并导入权重

现在我们要把预训练的向量权重导入到PyTorch的Embedding层里:

第一步:创建权重矩阵

先初始化一个和Embedding层尺寸匹配的权重矩阵,默认用随机初始化来填充OOV词的向量:

import torch
import torch.nn as nn

# 用正态分布随机初始化权重矩阵
embedding_weights = torch.randn(vocab_size, embedding_dim)

# 遍历词汇表,把预训练中存在的词的向量替换进去
for word, idx in word_to_idx.items():
    if word in word2vec_model:
        embedding_weights[idx] = torch.FloatTensor(word2vec_model[word])

第二步:创建Embedding层并加载权重

把刚才的权重矩阵传入Embedding层,如果你不想让预训练权重在训练中更新,可以设置requires_grad=False来冻结权重:

# 创建Embedding层
embedding_layer = nn.Embedding(
    num_embeddings=vocab_size,
    embedding_dim=embedding_dim
)

# 加载预训练权重
embedding_layer.weight.data.copy_(embedding_weights)

# 可选:冻结权重,不参与后续训练
embedding_layer.weight.requires_grad = False
4. 验证导入是否成功

你可以随便拿个词测试,看看PyTorch嵌入层输出的向量和Gensim里的是否一致:

# 以"apple"为例
word = "apple"
idx = word_to_idx[word]

# 从PyTorch嵌入层获取向量
torch_embedding = embedding_layer(torch.tensor([idx])).detach().numpy()[0]
# 从Gensim获取向量
gensim_embedding = word2vec_model[word]

# 由于浮点精度问题,用近似相等判断
print(torch.allclose(torch.tensor(torch_embedding), torch.tensor(gensim_embedding)))
# 正常情况会输出True
一些额外注意事项
  • 务必保证预训练模型的向量维度embedding_dim和你创建的Embedding层维度一致,否则会报错。
  • 对于OOV词,除了随机初始化,你也可以用预训练所有向量的均值来初始化,根据任务需求调整。
  • 如果加载的是自己用Gensim训练的完整Word2Vec模型(不是KeyedVectors格式),可以通过model.wv获取KeyedVectors对象,比如word2vec_model = your_trained_model.wv

内容的提问来源于stack exchange,提问作者MBT

火山引擎 最新活动