Почему перечисление компонентов модели в pyTorch не полезно?

1

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

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

Теги:
neural-network
pytorch

1 ответ

2

Если вы 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())

Ещё вопросы

Сообщество Overcoder
Наверх
Меню