首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌入到pytorch中

嵌入到pytorch中
EN

Stack Overflow用户
提问于 2018-06-08 02:29:19
回答 4查看 77.1K关注 0票数 53

我在Stackoverflow上查看了PyTorch教程和类似的问题。

我很困惑;pytorch中的嵌入(Embedding)会使相似的单词彼此更接近吗?我只需要给它所有的句子吗?或者它只是一个查找表,而我需要对模型进行编码?

EN

回答 4

Stack Overflow用户

发布于 2018-08-03 16:19:14

nn.Embedding包含维度(vocab_size, vector_size)的张量,即词汇表的大小x每个向量嵌入的维度,以及执行查找的方法。

创建嵌入层时,张量是随机初始化的。只有当你训练它时,相似单词之间的相似性才会出现。除非您已经用以前训练过的模型(如GloVe或Word2Vec )覆盖了嵌入值,但这是另一回事。

因此,一旦定义了嵌入层,并对词汇表进行了定义和编码(即,为词汇表中的每个单词分配一个唯一的数字),您就可以使用nn.Embedding类的实例来获得相应的嵌入。

例如:

代码语言:javascript
复制
import torch
from torch import nn
embedding = nn.Embedding(1000,128)
embedding(torch.LongTensor([3,4]))

将返回与您的词汇表中的单词3和4对应的嵌入向量。由于没有训练过任何模型,因此它们将是随机的。

票数 70
EN

Stack Overflow用户

发布于 2018-06-27 18:23:58

您可以将nn.Embedding视为查找表,其中键是词索引,值是相应的词向量。但是,在使用它之前,您应该指定查找表的大小,并自行初始化单词向量。下面是一个演示这一点的代码示例。

代码语言:javascript
复制
import torch.nn as nn 

# vocab_size is the number of words in your train, val and test set
# vector_size is the dimension of the word vectors you are using
embed = nn.Embedding(vocab_size, vector_size)

# intialize the word vectors, pretrained_weights is a 
# numpy array of size (vocab_size, vector_size) and 
# pretrained_weights[i] retrieves the word vector of
# i-th word in the vocabulary
embed.weight.data.copy_(torch.fromnumpy(pretrained_weights))

# Then turn the word index into actual word vector
vocab = {"some": 0, "words": 1}
word_indexes = [vocab[w] for w in ["some", "words"]] 
word_vectors = embed(word_indexes)
票数 45
EN

Stack Overflow用户

发布于 2020-07-24 21:21:07

torch.nn.Embedding只是创建了一个查找表,在给定单词索引的情况下获取单词嵌入。

代码语言:javascript
复制
from collections import Counter
import torch.nn as nn

# Let's say you have 2 sentences(lowercased, punctuations removed) :
sentences = "i am new to PyTorch i am having fun"

words = sentences.split(' ')
    
vocab = Counter(words) # create a dictionary
vocab = sorted(vocab, key=vocab.get, reverse=True)
vocab_size = len(vocab)

# map words to unique indices
word2idx = {word: ind for ind, word in enumerate(vocab)} 

# word2idx = {'i': 0, 'am': 1, 'new': 2, 'to': 3, 'pytorch': 4, 'having': 5, 'fun': 6}

encoded_sentences = [word2idx[word] for word in words]

# encoded_sentences = [0, 1, 2, 3, 4, 0, 1, 5, 6]

# let's say you want embedding dimension to be 3
emb_dim = 3 

现在,嵌入层可以初始化为:

代码语言:javascript
复制
emb_layer = nn.Embedding(vocab_size, emb_dim)
word_vectors = emb_layer(torch.LongTensor(encoded_sentences))

这将从标准正态分布(即0均值和单位方差)初始化嵌入。因此,这些词向量没有任何“关联性”的含义。

word_vectors是大小为(9,3)的火炬张量。(因为我们的数据中有9个单词)

emb_layer有一个名为weight的可训练参数,默认情况下设置为要训练。您可以通过以下方式查看:

代码语言:javascript
复制
emb_layer.weight.requires_grad

它返回True。如果您不想在模型训练期间训练嵌入(例如,当您使用预训练的嵌入时),可以通过以下方式将它们设置为False:

代码语言:javascript
复制
emb_layer.weight.requires_grad = False

如果您的词汇表大小为10,000,并且您希望使用预先训练好的嵌入(DIM300)初始化嵌入,比如Word2Vec,那么可以这样做:

代码语言:javascript
复制
emb_layer = nn.Embedding(10000, 300)
emb_layer.load_state_dict({'weight': torch.from_numpy(emb_mat)})

这里,emb_mat是一个大小为( 10,000,300)的Word2vec矩阵,其中包含词汇表中10,000个单词中每个单词的300维Numpy词向量。

现在,嵌入层加载了Word2Vec word表示。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50747947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档