Как принять глубину нейронной сети в качестве аргумента при построении сети в Pytorch - PullRequest
0 голосов
/ 19 февраля 2020

Я написал следующий код для определения глубины сети в качестве параметра в Pytorch. Позже я понял, что даже если я использую много скрытых слоев, изучаемые параметры остаются неизменными.

class Net3(torch.nn.Module):
    def __init__(self, n_feature, n_hidden, n_output, depth, init):
        super(Net3, self).__init__()
        self.input = torch.nn.Linear(n_feature, n_hidden).float().to(device)   
        self.hidden = torch.nn.Linear(n_hidden, n_hidden).float().to(device)   
        self.predict = torch.nn.Linear(n_hidden, n_output).float().to(device)   =
        self.depth = depth 


    def forward(self, x):
        x = F.relu(self.input(x))      # activation function for hidden layer
        for i in range(self.depth):
           x = F.relu(self.hidden(x))      # activation function for hidden layer
        x = self.predict(x)           
        return x

Есть ли другой способ добиться этого?

1 Ответ

1 голос
/ 19 февраля 2020

В init вам нужно создать несколько скрытых слоев, в настоящее время вы делаете только один. Одна возможность сделать это с небольшими накладными расходами - использовать torch.nn.ModuleDict, который даст вам именованные слои:

class Net3(torch.nn.Module):
    def __init__(self, n_feature, n_hidden, n_output, depth, init):
        super(Net3, self).__init__()
        self.layers = nn.ModuleDict() # a collection that will hold your layers

        self.layers['input'] = torch.nn.Linear(n_feature, n_hidden).float().to(device)

        for i in range(1, depth):
            self.layers['hidden_'+str(i)] = torch.nn.Linear(n_hidden, n_hidden).float().to(device)  

        self.layers['output'] = torch.nn.Linear(n_hidden, n_output).float().to(device)   =
        self.depth = depth 


    def forward(self, x):
        for layer in self.layers:
            x = F.relu(self.layers[layer](x))

        return x
...