赞
踩
Inputs在字典中找到对应的嵌入表示(batchsize*seqlen*model_dim)
词嵌入矩阵需要根据语料库来确定第一个维度(字典里面有多少个词)
- #已知如下语料,给出其词嵌入
- corpus = ["he is an old worker", "english is a useful tool", "the cinema is far away"]
- cibiao=[]
- for i in corpus:
- for j in i.split():
- cibiao.append(j)
- set(cibiao)#去重
- cibiao_dict={}
-
- #利用enumerate添加索引
- for i in enumerate(set(cibiao)):
- print(i[1])
- cibiao_dict[i[1]]=i[0]#字典的赋值;old赋值为0
- cibiao_dict
定义Input Embedding层
- class Embeddings(nn.Module):
- def __init__(self, d_model, vocab):
- # d_model:词嵌入维度
- # vocab:字典大小
- super(Embeddings, self).__init__()
- self.lut = nn.Embedding(vocab, d_model)
- self.d_model = d_model
- def forward(self, x):#根据索引找到对应的词向量
- return self.lut(x) * math.sqrt(self.d_model)
我们现在确定了字典里面有1000个词;此时batchsize*seqlen*model_dim=2*4*512
- d_model = 512 # embedding_size
- vocab = 1000 # 词典大小
- x=torch.tensor([[100, 2, 421, 508], [491, 998, 1, 221]], dtype=torch.long)
- emb = Embeddings(d_model, vocab)
- embr = emb(x)
- print(embr.shape)
非常强硬的加入了所在的位置信息,其中pos表示行的信息,单词在句子中所在的位置(从0到seqlen-1)
i表示列的信息(从0到model_dim/2-1)
可以利用循环得到这个矩阵
- import numpy as np
- import matplotlib.pyplot as plot
-
- def getPositionEncoding(seq_len,dim,n=10000):
- PE = np.zeros(shape=(seq_len,dim))
- #PE=np.zeros((seq_len,dim))
- for pos in range(seq_len):
- for i in range(int(dim/2)):
- denominator=np.power(n,2*i/dim)
- PE[pos,2*i]=np.sin(pos/denominator)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。