用 for 循环定义 nn.parameters

Define nn.parameters with a for loop

我有兴趣使用 Pytorch 在自定义神经网络中定义 L 个权重。

如果L是已知的,那么一个一个定义它们不是问题,但如果L是未知的,我想使用for循环来定义它们。我的想法是做这样的事情(这是行不通的)

class Network(nn.Module):
    def __init__(self, ):
        super(Network, self).__init__()
        self.nl = nn.ReLU()

        for i in range(L):
          namew = 'weight'+str(i)
          self.namew = torch.nn.Parameter(data=torch.Tensor(2,2), requires_grad=True)

这应该做这样的事情(虽然有效但仅限于特定数量的权重):

class Network(nn.Module):
    def __init__(self, ):
        super(Network, self).__init__()
        self.nl = nn.ReLU()

        self.weight1 = torch.nn.Parameter(data=torch.Tensor(2,2), requires_grad=True)
        self.weight2 = torch.nn.Parameter(data=torch.Tensor(2,2), requires_grad=True)
        self.weight3 = torch.nn.Parameter(data=torch.Tensor(2,2), requires_grad=True)

在我尝试做的事情中,存在一个问题,即 Pytorch 只识别字符串 'namew',而不是 'namew' 的“动态”字符串。因此,只定义了 1 个权重,而不是 L 个权重。

有什么办法可以解决这个问题吗?

我用这行代码解决了问题,代替了 for 循环:

self.weights = nn.ParameterList([nn.Parameter(torch.randn(2, 2)) for i in range(L)])

完成此操作的最佳方法您可以使用 ParameterDictModuleDict(对于 nn.module 层)来完成此操作:

class Network(nn.Module):
        def __init__(self):
            super(Network, self).__init__()
            self.nl = nn.ReLU()
            
            # define some nn.module layers
            self.layers = nn.ModuleDict()
            for i in range(L):
                 self.layers("layer{}".format(i) = torch.nn.Linear(i-1,i)
      
            # define some non-module layers
            self.weights = torch.nn.ParameterDict()
            for i in range(L):
                 self.weights["weights{}".format(i)] = torch.nn.Parameter(data=torch.Tensor(2,2), requires_grad=True)