Deep learning nn.Sequential的参数太少或太多

Deep learning nn.Sequential的参数太少或太多,deep-learning,neural-network,pytorch,sequential,attention-model,Deep Learning,Neural Network,Pytorch,Sequential,Attention Model,我是PyTorch的新手,所以请原谅我的愚蠢问题 我在编码器对象的init中定义nn.Sequential,如下所示: self.list_of_blocks = [EncoderBlock(n_features, n_heads, n_hidden, dropout) for _ in range(n_blocks)] self.blocks = nn.Sequential(*self.list_of_blocks) EncoderBlock的前端看起来像这样 def forward(sel

我是PyTorch的新手,所以请原谅我的愚蠢问题

我在编码器对象的init中定义nn.Sequential,如下所示:

self.list_of_blocks = [EncoderBlock(n_features, n_heads, n_hidden, dropout) for _ in range(n_blocks)]
self.blocks = nn.Sequential(*self.list_of_blocks)
EncoderBlock的前端看起来像这样

def forward(self, x, mask):
在编码器的forward()中,我尝试执行以下操作:

z0 = self.blocks(z0, mask)
我希望nn.Sequential将这两个参数传递给各个块

然而,我明白了

TypeError: forward() takes 2 positional arguments but 3 were given
当我尝试时:

z0 = self.blocks(z0)
我得到(可以理解):

当我不使用nn.Sequential并只执行一个又一个EncoderBlock时,它可以工作:

for i in range(self.n_blocks):
     z0 = self.list_of_blocks[i](z0, mask)

问题:我做错了什么?在这种情况下如何正确使用nn.Sequential?

Sequential通常不适用于多个输入和输出

这是一个经常讨论的话题,请参阅和GitHub问题或

您可以定义自己的sequential版本。假设所有编码器块的掩码都相同(例如,与变压器网络中的相同),则可以执行以下操作:

类掩码顺序(nn.顺序): def转发(自身、x、掩码): 对于self中的模块。\u modules.values(): x=模块(x,掩码) 返回输入 或者,如果您的
EncoderBlock
s返回元组,您可以使用以下选项之一中建议的更通用的解决方案:

类MySequential(nn.Sequential): def前进(自身,*输入): 对于self中的模块。\u modules.values(): 如果类型(输入)=元组: 输入=模块(*输入) 其他: 输入=模块(输入) 返回输入
for i in range(self.n_blocks):
     z0 = self.list_of_blocks[i](z0, mask)