使用[nn.Linear(10,10) for i in range(n)]生成多个相同的神经网络被重复调用,独自训练参数,结果参数迁移的时候发现只有列表的第一个对象的参数被迁移到gpu上了,其他参数都没有被迁移过去。
查阅资料后发现,需要将其转换成torch专有的给神经模块设计的列表类nn.ModuleList
nn.ModuleList 这个类,可以把任意 nn.Module 的子类 (比如 nn.Conv2d, nn.Linear 之类的) 加到这个 list 里面,类似于Python 自带的 list 。
如果只使用python自带的list,会发现
使用 Python 的 list 添加的网络层和它们的 parameters 并没有自动注册到我们的网络中。当然,我们还是可以使用 forward 来计算输出结果。但是如果用 net2 实例化的网络进行训练的时候,因为这些层的 parameters 不在整个网络之中,所以其网络参数也不会被更新,也就是无法训练。因此参数迁移的时候这些网络层的参数也没有办法使用model.to(device)一次性迁移过去。