Я пытаюсь создать нейронные сети прямой связи с 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)
)
в моем коде я просто создаю списки, вот какая разница, я просто хотел понять, почему компоненты списка моделей факелов не полезны?
Если вы 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())