Python 为什么在pyTorch中列出模型组件没有用处?

Python 为什么在pyTorch中列出模型组件没有用处?,python,neural-network,pytorch,feed-forward,Python,Neural Network,Pytorch,Feed Forward,我正在尝试创建具有N层的前馈神经网络 假设我想要2个输入,3个隐藏,2个输出,然后我将[2,3,2]传递给神经网络类,神经网络模型将被创建,所以如果我想要[10010001000,2] 在这个例子中,100是输入,两个隐藏层每个包含1000个神经元和2个输出,所以我想要完全连接的神经网络,我只想传递包含每层神经元数量的列表。 为此,我编写了以下代码 class FeedforwardNeuralNetModel(nn.Module): def __init__(self, layers)

我正在尝试创建具有N层的前馈神经网络 假设我想要2个输入,3个隐藏,2个输出,然后我将[2,3,2]传递给神经网络类,神经网络模型将被创建,所以如果我想要[10010001000,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    
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
当我尝试使用它时,我发现它有点像空模型

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

print(model)

>>FeedforwardNeuralNetModel()
当我使用下面的代码时

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    
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)
)
在我的代码中,我只是创建列表,这就是区别所在 我只是想了解为什么torch中列出的模型组件没有用处?

如果您打印(FeedForwardNetModel([1,2,3]),则会出现以下错误

AttributeError:'FeedforwardNeuralNetModel'对象没有属性'\u modules'

这基本上意味着对象无法识别您声明的模块


为什么会发生这种情况

目前,模块是在
self.fc
中声明的,它是
列表
,因此torch无法知道它是否是一个模型,除非它进行
深度搜索
,这是一个糟糕且低效的搜索


我们如何让torch知道
self.fc
是一个模块列表

通过使用
nn.ModuleList
(参见下面修改的代码)。ModuleList和moduledit分别是python列表和字典,但它们告诉torch列表/目录包含一个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())