【问题标题】:Using nn.ModuleList over Python list dramatically slows down training在 Python 列表上使用 nn.ModuleList 会显着减慢训练速度
【发布时间】:2019-02-20 03:56:24
【问题描述】:

我正在训练一个非常简单的模型,它将隐藏层的数量作为参数。我最初将这些隐藏层存储在一个普通 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 neural-network pytorch


    【解决方案1】:

    那是因为当使用普通的python列表时,参数不会添加到模型的参数列表中,但是当使用ModuleList时,它们会。所以,在最初的场景中,你从来没有真正训练过隐藏层,这就是它更快的原因。 (在每种情况下打印出 model.parameters() 看看会发生什么!)

    【讨论】:

    • 真的吗?所以这意味着在训练期间只有输入和输出层被训练??
    猜你喜欢
    • 2022-01-27
    • 2020-03-24
    • 2018-07-31
    • 2019-06-11
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2016-10-11
    • 2017-10-09
    相关资源
    最近更新 更多