Почему перечисление компонентов модели в pyTorch не полезно? - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь создать нейронную сеть прямой связи с N слоями. Идея такова: если мне нужно 2 входа, 3 скрытых и 2 выхода, я просто передам [2,3,2] классу нейронной сети, и модель нейронной сети будет создана, поэтому, если я захочу [100,1000,1000,2] где в данном случае 100 является входами, два скрытых слоя содержат 1000 нейронов каждый и 2 выхода, поэтому я хочу полностью подключенную нейронную сеть, где я просто хотел передать список, который содержит количество нейронов в каждом слое. Для этого я написал следующий код

class FeedforwardNeuralNetModel(nn.Module):
    def __init__(self, layers):
        super(FeedforwardNeuralNetModel, self).__init__()
        self.fc=[]
        self.sigmoid=[]
        self.activationValue = []
        self.layers = layers
        for i in range(len(layers)-1):
            self.fc.append(nn.Linear(layers[i],layers[i+1]))
            self.sigmoid.append(nn.Sigmoid())

    def forward(self, x):
        out=x
        for i in range(len(self.fc)):
            out=self.fc[i](out)
            out = self.sigmoid[i](out)
        return out    

когда я пытался использовать его, я обнаружил, что это пустая модель

model=FeedforwardNeuralNetModel([3,5,10,2])

print(model)

>>FeedforwardNeuralNetModel()

и когда я использовал следующий код

class FeedforwardNeuralNetModel(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super(FeedforwardNeuralNetModel, self).__init__()
        # Linear function
        self.fc1 = nn.Linear(input_dim, hidden_dim) 
        # Non-linearity
        self.tanh = nn.Tanh()
        # Linear function (readout)
        self.fc2 = nn.Linear(hidden_dim, output_dim)  

    def forward(self, x):
        # Linear function
        out = self.fc1(x)
        # Non-linearity
        out = self.tanh(out)
        # Linear function (readout)
        out = self.fc2(out)
        return out

и когда я попытался напечатать эту модель, я нашел следующий результат

print(model)

>>FeedforwardNeuralNetModel(
(fc1): Linear(in_features=3, out_features=5, bias=True)
(sigmoid): Sigmoid()
(fc2): Linear(in_features=5, out_features=10, bias=True)
)

в моем коде я просто создаю списки, вот какая разница Я просто хотел понять, почему в перечне компонентов модели факела ничего не получается?

1 Ответ

0 голосов
/ 11 января 2019

Если вы делаете print(FeedForwardNetModel([1,2,3]), выдается следующая ошибка

AttributeError: 'FeedforwardNeuralNetModel' object has no attribute '_modules'

, что в основном означает, что объект не может распознавать объявленные вами модули.


Почему это происходит?

В настоящее время модули объявлены в self.fc, то есть list, и, следовательно, torch не может узнать, является ли это моделью, если только он не делает deep search, что плохо и неэффективно.


Как мы можем сообщить torch, что self.fc - это список модулей?

Используя nn.ModuleList (см. Модифицированный код ниже). ModuleList и ModuleDict являются списками и словарями python соответственно, но они сообщают torch, что список / dict содержит модуль nn.

#modified init function
def __init__(self, layers): 
    super().__init__()
    self.fc=nn.ModuleList()
    self.sigmoid=[]
    self.activationValue = []
    self.layers = layers
    for i in range(len(layers)-1):
        self.fc.append(nn.Linear(layers[i],layers[i+1]))
        self.sigmoid.append(nn.Sigmoid())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...