代码之家  ›  专栏  ›  技术社区  ›  ihdv

如何通过索引访问pytorch模块中的层?

  •  0
  • ihdv  · 技术社区  · 6 年前

    我正在尝试编写一个具有多个层的pytorch模块。因为我需要中间输出,所以不能像往常一样把它们全部放在一个序列中。另一方面,由于有很多层,我想到的是将这些层放在一个列表中,并通过循环中的索引访问它们。下面描述我正在努力实现的目标:

    import torch
    import torch.nn as nn
    import torch.optim as optim
    
    class MyModel(nn.Module):
        def __init__(self):
            super(MyModel, self).__init__()
    
            self.layer_list = []
    
            self.layer_list.append(nn.Linear(2,3))
            self.layer_list.append(nn.Linear(3,4))
            self.layer_list.append(nn.Linear(4,5))
    
        def forward(self, x):
            res_list = [x]
            for i in range(len(self.layer_list)):
                res_list.append(self.layer_list[i](res_list[-1]))
            return res_list
    
    
    model = MyModel()
    x = torch.randn(4,2)
    y = model(x)
    
    print(y)
    
    optimizer = optim.Adam(model.parameters())
    

    forward方法工作得很好,但是当我想设置一个优化器时,程序会说

    ValueError: optimizer got an empty parameter list
    

    列表中的图层似乎未在此处注册。我能做什么?

    0 回复  |  直到 6 年前
        1
  •  4
  •   Victor Zuanazzi    6 年前

    如果将层放在python列表中,pytorch不会正确注册它们。你必须使用 ModuleList ( https://pytorch.org/docs/master/generated/torch.nn.ModuleList.html ).

    ModuleList可以像常规Python列表一样编制索引,但它包含的模块已正确注册,并且所有模块方法都可以看到。

    您的代码应该类似于:

    
    import torch
    import torch.nn as nn
    import torch.optim as optim
    
    class MyModel(nn.Module):
        def __init__(self):
            super(MyModel, self).__init__()
    
            self.layer_list = nn.ModuleList()  # << the only changed line! <<
    
            self.layer_list.append(nn.Linear(2,3))
            self.layer_list.append(nn.Linear(3,4))
            self.layer_list.append(nn.Linear(4,5))
    
        def forward(self, x):
            res_list = [x]
            for i in range(len(self.layer_list)):
                res_list.append(self.layer_list[i](res_list[-1]))
            return res_list
    

    模块主义者 确保所有层都已注册到计算图形中。

    还有一个 ModuleDict https://pytorch.org/docs/master/nn.html#containers

        2
  •  0
  •   Dharman vijay    6 年前

    它可以列出所有层的神经网络使用

    list_layers = model.named_children()
    

    在第一种情况下,您可以使用:

    parameters = list(Model1.parameters())+ list(Model2.parameters())
    optimizer = optim.Adam(parameters, lr=1e-3)
    

    model = VAE()
    optimizer = optim.Adam(model.parameters(), lr=1e-3)
    

    顺便说一下,您可以从修改 VAE example 由Pytorch提供。

    init 在这里起作用。