nn.mudlelist()说明--未上传

nn.modulelist()

如果在构造函数__init__中用到list、tuple、dict等对象时,一定要思考是否应该用ModuleList或ParameterList代替。如果你想设计一个神经网络的层数作为输入传递。

  1. class MyModule(nn.Module): 
  2. def __init__(self): 
  3. super(MyModule, self).__init__() 
  4. self.linears = nn.ModuleList([nn.Linear(10, 10) for i in range(10)]) 
  5.  
  6. def forward(self, x): 
  7. # ModuleList can act as an iterable, or be indexed using ints 
  8. for i, l in enumerate(self.linears): 
  9. x = self.linears[i // 2](x) + l(x) 
  10.  
  11. return x 

1. extend和append方法

nn.moduleList定义对象后,有extend和append方法,用法和python中一样,extend是添加另一个modulelist  append是添加另一个module

2.和普通list的区别

和普通list不一样,它和torch的其他机制结合紧密,继承了nn.Module的网络模型class可以使用nn.ModuleList并识别其中的parameters,当然这只是个list,不会自动实现forward方法。

可见,普通list中的子module并不能被主module所识别,而ModuleList中的子module能够被主module所识别。这意味着如果用list保存子module,将无法调整其参数,因其未加入到主module的参数中。

      除ModuleList之外还有ParameterList,其是一个可以包含多个parameter的类list对象。在实际应用中,使用方式与ModuleList类似。

nn.Sequential定义的网络中各层会按照定义的顺序进行级联,因此需要保证各层的输入和输出之间要衔接。并且nn.Sequential实现了farward()方法,因此可以直接通过类似于x=self.combine(x)的方式实现forward。而nn.ModuleList则没有顺序性要求,并且也没有实现forward()方法。这是二者之间的区别。

原文地址:https://www.cnblogs.com/miaozhijuan/p/12454189.html