Использование nn.ModuleList над списком Python значительно замедляет обучение - PullRequest
0 голосов
/ 21 ноября 2018

Я тренирую очень простую модель, которая принимает количество скрытых слоев в качестве параметра.Первоначально я сохранил эти скрытые слои в списке ванильных 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()

1 Ответ

0 голосов
/ 19 февраля 2019

Это связано с тем, что при использовании обычного списка Python параметры не добавляются в список параметров модели, но при использовании ModuleList они есть.Таким образом, в исходном сценарии вы никогда не тренировали скрытые слои, поэтому это было быстрее.(Распечатайте model.parameters () в каждом случае и посмотрите, что произойдет!)

...