当前位置:   article > 正文

Transformer的各个模块_transformer模块

transformer模块

1.Input Embedding

Inputs在字典中找到对应的嵌入表示(batchsize*seqlen*model_dim)

词嵌入矩阵需要根据语料库来确定第一个维度(字典里面有多少个词)

  1. #已知如下语料,给出其词嵌入
  2. corpus = ["he is an old worker", "english is a useful tool", "the cinema is far away"]
  3. cibiao=[]
  4. for i in corpus:
  5. for j in i.split():
  6. cibiao.append(j)
  7. set(cibiao)#去重
  8. cibiao_dict={}
  9. #利用enumerate添加索引
  10. for i in enumerate(set(cibiao)):
  11. print(i[1])
  12. cibiao_dict[i[1]]=i[0]#字典的赋值;old赋值为0
  13. cibiao_dict

定义Input Embedding层

  1. class Embeddings(nn.Module):
  2. def __init__(self, d_model, vocab):
  3. # d_model:词嵌入维度
  4. # vocab:字典大小
  5. super(Embeddings, self).__init__()
  6. self.lut = nn.Embedding(vocab, d_model)
  7. self.d_model = d_model
  8. def forward(self, x):#根据索引找到对应的词向量
  9. return self.lut(x) * math.sqrt(self.d_model)

我们现在确定了字典里面有1000个词;此时batchsize*seqlen*model_dim=2*4*512

  1. d_model = 512 # embedding_size
  2. vocab = 1000 # 词典大小
  3. x=torch.tensor([[100, 2, 421, 508], [491, 998, 1, 221]], dtype=torch.long)
  4. emb = Embeddings(d_model, vocab)
  5. embr = emb(x)
  6. print(embr.shape)

2.position Embedding层

非常强硬的加入了所在的位置信息,其中pos表示行的信息,单词在句子中所在的位置(从0到seqlen-1)

i表示列的信息(从0到model_dim/2-1)

可以利用循环得到这个矩阵

  1. import numpy as np
  2. import matplotlib.pyplot as plot
  3. def getPositionEncoding(seq_len,dim,n=10000):
  4. PE = np.zeros(shape=(seq_len,dim))
  5. #PE=np.zeros((seq_len,dim))
  6. for pos in range(seq_len):
  7. for i in range(int(dim/2)):
  8. denominator=np.power(n,2*i/dim)
  9. PE[pos,2*i]=np.sin(pos/denominator)
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/926647
推荐阅读
相关标签
  

闽ICP备14008679号