pytorch RNN使用OHE查找表的正确方法是什么?

时间:2019-08-23 19:35:13

标签: python nlp pytorch lstm

我目前正在尝试使用pytorch构建LSTM RNN。一个输入向量表示为50个整数的数组,该数组对应于最多50个带填充符号的序列,其中每个整数对应于我的词汇表中的一个元素以及OHE向量中1的索引。我想要一个仅使用查找表对整数进行一键编码的嵌入层-有点像tensorflow的OHE层。

类似“这种”的东西

import torch
import numpy as np
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
vocab_size, vector_size = 5, 5
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
pretrained_weights = np.zeros((vocab_size, vector_size))
np.fill_diagonal(pretrained_weights, 1)
tmp =torch.from_numpy(pretrained_weights)
embed.weight = nn.Parameter(tmp,requires_grad=False )

# Then turn the word index into actual word vector
vocab = {"some": 0, "words": 1}
word_indexes = torch.from_numpy(np.array([vocab[w] for w in ["some", "words"]]))
word_vectors = embed(word_indexes)
word_vectors.data.numpy()


>>>output
array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.]])

但是它很hacky,不能与成批的输入向量很好地配合。

在RNN的开头声明OHE嵌入层的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您要寻找的方法是torch.nn.functional.one_hot。它是后来添加到PyTorch的,因此当您使用Google进行搜索时很难找到它。

 >>> import torch
>>> x = torch.arange(0,5)
>>> x
tensor([0, 1, 2, 3, 4])
>>> torch.nn.functional.one_hot(x)
tensor([[1, 0, 0, 0, 0],
      [0, 1, 0, 0, 0],
      [0, 0, 1, 0, 0],
      [0, 0, 0, 1, 0],
      [0, 0, 0, 0, 1]])