![](/img/trans.png)
[英]Pycharm complains about using [] operator with pytorch's nn.ModuleList object
[英]Using nn.ModuleList over Python list dramatically slows down training
我正在训练一个非常简单的模型,该模型将隐藏层的数量作为参数。 我最初将这些隐藏层存储在香草python列表[]
,但是当将此列表转换为nn.ModuleList
,训练速度至少会降低一个数量级 !
AdderNet
class AdderNet(nn.Module):
def __init__(self, num_hidden, hidden_width):
super(AdderNet, self).__init__()
self.relu = nn.ReLU()
self.hiddenLayers = []
self.inputLayer = nn.Linear(2, hidden_width)
self.outputLayer = nn.Linear(hidden_width, 1)
for i in range(num_hidden):
self.hiddenLayers.append(nn.Linear(hidden_width, hidden_width))
self.hiddenLayers = nn.ModuleList(self.hiddenLayers) # <--- causes DRAMATIC slowdown!
def forward(self, x):
out = self.inputLayer(x)
out = self.relu(out)
for layer in self.hiddenLayers:
out = layer(out)
out = self.relu(out)
return self.outputLayer(out)
训练
for epoch in range(num_epochs):
for i in range(0,len(data)):
out = model.forward(data[i].x)
loss = lossFunction(out, data[i].y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
这是因为在使用普通的python列表时,参数不会添加到模型的参数列表中,而在使用ModuleList时会添加。 因此,在原始方案中,您从未真正训练过隐藏层,这就是为什么它更快的原因。 (在每种情况下打印出model.parameters(),看看会发生什么!)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.