Python >> Tutoriel Python >  >> Python Tag >> Gensim

PyTorch / Gensim - Comment charger des incorporations de mots pré-formés

Je voulais juste rapporter mes découvertes sur le chargement d'un gensim intégré avec PyTorch.

  • Solution pour PyTorch 0.4.0 et plus récent :

À partir de v0.4.0 il y a une nouvelle fonction from_pretrained() ce qui rend le chargement d'une incorporation très confortable.Voici un exemple tiré de la documentation.

import torch
import torch.nn as nn

# FloatTensor containing pretrained weights
weight = torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]])
embedding = nn.Embedding.from_pretrained(weight)
# Get embeddings for index 1
input = torch.LongTensor([1])
embedding(input)

Les poids de gensim peut facilement être obtenu par :

import gensim
model = gensim.models.KeyedVectors.load_word2vec_format('path/to/file')
weights = torch.FloatTensor(model.vectors) # formerly syn0, which is soon deprecated

Comme l'a noté @Guglie :dans les nouvelles versions de gensim, les poids peuvent être obtenus par model.wv :

weights = model.wv
  • Solution pour la version 0.3.1 de PyTorch et plus :

J'utilise la version 0.3.1 et from_pretrained() n'est pas disponible dans cette version.

J'ai donc créé mon propre from_pretrained donc je peux aussi l'utiliser avec 0.3.1 .

Code pour from_pretrained pour les versions de PyTorch 0.3.1 ou inférieur :

def from_pretrained(embeddings, freeze=True):
    assert embeddings.dim() == 2, \
         'Embeddings parameter is expected to be 2-dimensional'
    rows, cols = embeddings.shape
    embedding = torch.nn.Embedding(num_embeddings=rows, embedding_dim=cols)
    embedding.weight = torch.nn.Parameter(embeddings)
    embedding.weight.requires_grad = not freeze
    return embedding

L'intégration peut alors être chargée comme ceci :

embedding = from_pretrained(weights)

J'espère que cela sera utile à quelqu'un.


Je pense que c'est facile. Copiez simplement le poids d'intégration de gensim vers le poids correspondant dans la couche d'intégration PyTorch.

Vous devez vous assurer que deux choses sont correctes :premièrement, la forme du poids doit être correcte, deuxièmement, le poids doit être converti en type PyTorch FloatTensor.


from gensim.models import Word2Vec

model = Word2Vec(reviews,size=100, window=5, min_count=5, workers=4)
#gensim model created

import torch

weights = torch.FloatTensor(model.wv.vectors)
embedding = nn.Embedding.from_pretrained(weights)