代码之家  ›  专栏  ›  技术社区  ›  A J

为什么我的动态神经网络有0个参数?

  •  0
  • A J  · 技术社区  · 1 年前

    我定义了以下神经网络:

    class Q_function(nn.Module):
    
        def __init__(self, input_size=3, hidden_size=5, num_layers=3, learning_rate=0.01):
            super(Q_function, self).__init__()
            self.input_size = input_size
            self.layers = []
            for i in num_layers:
                self.layers.append(nn.Linear(input_size, hidden_size)) 
                self.append(nn.ReLU())
            self.layers.append(nn.Linear(hidden_size,1))
        
        def forward(self, x):
            out = self.layers[0](x)
            for lay in range(1,len(self.layers)):
                out = self.layers[lay](out)
            return out
    

    当我跑步时:

    net = Q_function()
    list(net.parameters())
    

    我得到的输出是一个空列表 [] 。有人能解释一下为什么网络没有参数吗?如何注册参数?如何解决此问题?

    1 回复  |  直到 1 年前
        1
  •  0
  •   Karl    1 年前

    Pytorch通过特定的构造函数类跟踪参数。它无法查看任意列表。

    要跟踪模块列表,需要将其包装在 nn.Sequential nn.ModuleList

    class Q_function(nn.Module):
    
        def __init__(self, input_size=3, hidden_size=5, num_layers=3, learning_rate=0.01):
            super(Q_function, self).__init__()
            self.input_size = input_size
            self.layers = []
            for i in num_layers:
                self.layers.append(nn.Linear(input_size, hidden_size)) 
                self.append(nn.ReLU())
            self.layers.append(nn.Linear(hidden_size,1))
            self.layers = nn.ModuleList(self.layers)
        
        def forward(self, x):
            out = self.layers[0](x)
            for lay in range(1,len(self.layers)):
                out = self.layers[lay](out)
            return out
    

    也就是说,在您的模型代码中也存在许多错误。你可能想要这样的东西:

    class Q_function(nn.Module):
    
        def __init__(self, input_size=3, hidden_size=5, num_layers=3, learning_rate=0.01):
            super(Q_function, self).__init__()
            self.input_size = input_size
            self.layers = [nn.Linear(input_size, hidden_size), nn.ReLU()]
            for i in range(num_layers-1):
                self.layers.append(nn.Linear(hidden_size, hidden_size)) 
                self.layers.append(nn.ReLU())
            self.layers.append(nn.Linear(hidden_size,1))
            self.layers = nn.Sequential(*self.layers)
        
        def forward(self, x):
            x = self.layers(x)
            return x
    
    推荐文章