Deep learning nn.Sequential的参数太少或太多
我是PyTorch的新手,所以请原谅我的愚蠢问题 我在编码器对象的init中定义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
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)