Transformer的各个模块

1.Input Embedding

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)

2.position Embedding层

非常强硬的加入了所在的位置信息,其中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)
     
  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值