torch.nn.Embedding

官網:https://pytorch.org/docs/stable/nn.html#embedding

torch.nn.Embedding(num_embeddingsembedding_dimpadding_idx=Nonemax_norm=Nonenorm_type=2.0scale_grad_by_freq=Falsesparse=False_weight=None)

 torch.nn.Embedding 模塊可以看做一個字典,字典中每個索引對應一個詞和詞的embedding形式。利用這個模塊,可以給詞做embedding的初始化操作。

模塊中主要參數:

num_embeddings :字典中詞的個數

embedding_dim:embedding的維度

padding_idx(索引指定填充):如果給定,則遇到padding_idx中的索引,則將其位置填0(0是默認值)。

大小說明:

input:(∗) , LongTensor 結構

output:(*,e):*是input的大小,e是embedding_dim,即每個詞的embedding的維度

注:embeddings中的值是正態分佈N(0,1)中隨機取值。

例子:

import torch
import torch.nn as nn
x = torch.LongTensor([[1,2,4],[4,3,2]])
embeddings = nn.Embedding(5,5,padding_idx=4) #5個詞,每個詞也是5維
print(embeddings(x))
print(embeddings(x).size())


output:
tensor([[[ 0.8839, -1.2889,  0.0697, -0.9998, -0.7471],
         [-0.5681,  0.8486,  0.8176,  0.8349,  0.1719],
         [ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000]],  ->index=4 賦值 0

        [[ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000],   ->index=4 賦值 0
         [ 1.4224,  0.2333,  1.9383, -0.7320,  0.9987],
         [-0.5681,  0.8486,  0.8176,  0.8349,  0.1719]]],
       grad_fn=<EmbeddingBackward>)
torch.Size([2, 3, 5])

embedding方法獲取的向量只是隨機初始化的,並不代表任何含義,並且不會有word2vec等訓練出來的效果。但是可以利用這樣的方法先賦值然後在學習。

總結一下一般任務中的流程:

首先將單詞轉成字典的形式,由於英語中以空格爲詞的分割,所以可以直接建立詞典索引結構。類似於:dic={'i':1,'like':2,'you':3,'want':4,'an':5,'apple':6}這樣的形式。如果是中文的話,首先進行分詞操作。

然後在以句子爲list,爲每個句子建立索引結構,list[[sentence1],[sentence2]]。以上面字典的索引來說,最終建立的就是[[1,2,3],[1,4,5,6]]。這樣長短不一的句子。

接下來要進行padding的操作。由於tensor結構中都是等長的,所以要對上面那樣的句子做padding操作後再利用nn.Embedding來進行詞的初始化。padding後的可能是這樣的結構[[1,2,3,0],[1,4,5,6]]。其中0作爲填充。(注意:由於在NMT任務中肯定存在着填充問題,所以在embedding時一定存在着第三個參數,讓某些索引爲下的值爲0,代表無實際意義的填充)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章