Python 使用for循环定义nn.parameters

Python 使用for循环定义nn.parameters,python,neural-network,pytorch,Python,Neural Network,Pytorch,我对使用Pytorch在自定义神经网络中定义L权重感兴趣 如果L已知,则逐个定义它们不是问题,但如果L未知,则我希望使用for循环来定义它们。我的想法是做这样的事情(不起作用) 这样做应该是这样的(相反,它可以工作,但仅限于特定数量的权重): 在我尝试做的事情中,有一个问题是Pytorch只识别字符串“namew”,而不是“namew”的“动态”字符串。因此,只定义了1个权重,而不是L个权重 有什么方法可以解决这个问题吗?我用这行代码代替for循环解决了这个问题: self.weights =

我对使用Pytorch在自定义神经网络中定义L权重感兴趣

如果L已知,则逐个定义它们不是问题,但如果L未知,则我希望使用for循环来定义它们。我的想法是做这样的事情(不起作用)

这样做应该是这样的(相反,它可以工作,但仅限于特定数量的权重):

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


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

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

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

实现这一点的最佳方法是使用
参数dict
模块dict
(对于
nn.module
层):


也许值得从这里开始:你能为你的
forward
方法添加代码,这样我们就可以看到权重是如何使用的吗?谢谢,我已经解决了我在答案中所写代码行的问题。我是在看你分享的问题时想到这个主意的。我还为未来的观众提供了一个答案,因为我认为这是一个不错的问题。请注意,如果需要,您可以使用
ParameterDict
为每组参数指定名称。再次感谢您,因为您可以指定名称,所以这样看起来更好。
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)
self.weights = nn.ParameterList([nn.Parameter(torch.randn(2, 2)) for i in range(L)])
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)