Python 了解原始变压器(Pytork、线性层和排列)
我正在学习原始transformer模型()的一个细微变化,并遇到了一个用于时间序列的Pytorch实现,我希望在理解部分内容时寻求帮助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
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)