Python 了解原始变压器(Pytork、线性层和排列)

Python 了解原始变压器(Pytork、线性层和排列),python,deep-learning,nlp,pytorch,transformer,Python,Deep Learning,Nlp,Pytorch,Transformer,我正在学习原始transformer模型()的一个细微变化,并遇到了一个用于时间序列的Pytorch实现,我希望在理解部分内容时寻求帮助 为什么要使用self.densed\u shape=nn.Linear(num\u time\u series,d\u model)将最后一个维度从num\u time\u series更改为d\u model?为什么不跳过这个线性层,将变压器的d\u model(d\u model,nheads=nheads)设置为等于num\u time\u series

我正在学习原始transformer模型()的一个细微变化,并遇到了一个用于时间序列的Pytorch实现,我希望在理解部分内容时寻求帮助

  • 为什么要使用
    self.densed\u shape=nn.Linear(num\u time\u series,d\u model)
    将最后一个维度从
    num\u time\u series
    更改为
    d\u model
    ?为什么不跳过这个线性层,将
    变压器的
    d\u model
    (d\u model,nheads=nheads)
    设置为等于
    num\u time\u series

  • 为什么输入张量
    x
    basic\u feature()
    方法中排列

    我相信在排列之后,张量的形状是
    (序列长度、批量大小、数量特征)


  • transformer\u basic.py

    class SimpleTransformer(torch.nn.Module):
    定义初始化__(
    自己
    数字时间序列:int,
    序号长度:int=48,
    输出顺序长度:int=None,
    d_模型:int=128,
    n_头:int=8,
    辍学率=0.1,
    正向尺寸=2048,
    乙状结肠=假):
    """
    全变压器模型
    """
    super()。\uuuu init\uuuuu()
    如果输出顺序为无:
    输出顺序长度=顺序长度
    self.out_seq_len=输出_seq_len
    self.mask=生成方形后续掩码(顺序长度)
    self.density\u shape=torch.nn.Linear(数字时间序列,d模型)
    self.pe=SimplePositionEncoding(d_模型)
    self.transformer=变压器(d_型,nhead=n_头)
    self.final_layer=torch.nn.Linear(d_模型,1)
    self.sequence\u size=seq\u长度
    self.tgt_mask=生成_square_后续_mask(输出顺序)
    self.sigmoid=无
    如果是乙状结肠:
    self.sigmoid=torch.nn.sigmoid()
    def forward(自我,x:torch.Tensor,t:torch.Tensor,tgt_掩码=无,src_掩码=无):
    如果src_掩码:
    x=self.encode_序列(x[:,:-1,:],src_掩码)
    其他:
    x=self.encode_序列(x[:,:-1,:],src_掩码)
    返回自解码序列(x,t,tgt_掩码)
    def基本_特征(自,x:火炬张量):
    x=自密实形状(x)
    x=self.pe(x)
    x=x.permute(1,0,2)
    返回x
    def编码_序列(self,x,src_mask=None):
    x=自身基本功能(x)
    x=自.变压器.编码器(x,src_掩码)
    返回x
    def decode_seq(self,mem,t,tgt_mask=None,view_number=None)->火炬。张量:
    如果视图编号为“无”:
    视图编号=自输出顺序长度
    如果tgt_掩码为“无”:
    tgt\u mask=self.tgt\u mask
    t=自身基本功能(t)
    x=自.转换器.解码器(t,mem,tgt\U掩码=tgt\U掩码)
    x=自最终_层(x)
    如果self.sigmoid:
    x=自乙状结肠(x)
    返回x.view(-1,视图编号)
    
    x = x.permute(1, 0, 2)