繁体   English   中英

如何训练写在pytorch嵌套列表中的参数?

[英]How to train parameters that are written in nested list in pytorch?

我建立了一个模型 AdaFDNN。 以下是我对模型的定义的一部分。

class AdaFDNN(nn.Module):
def __init__(self, num_covariate=5,
             num_hidden_layers = 4, # L-1
             total_num_layers = 5, # L
             neurons = [10, 10, 10, 10, 1],
             train_size = 128,
             grid=(0, 1), # grid is time idx
             dropout = 0.1, lambda1 = 0.0, lambda2 = 0.0, device = None):
    super().__init__()
    self.train_size = train_size
    self.num_covariate = num_covariate
    self.lambda1 = lambda1; self.lambda2 = lambda2; self.device = device
    self.num_hidden_layers = num_hidden_layers; self.total_num_layers = total_num_layers
    self.neurons = [*neurons, 1]; self.aug_neurons = [num_covariate, *neurons]
    # grid should include both end points
    self.grid_array = np.array(grid)
    # send the time grid tensor to device
    self.t = torch.tensor(self.grid_array).to(device).float()
    self.h = torch.tensor(self.grid_array[1:] - self.grid_array[:-1]).to(device).float()
    self.bias_para = [[nn.Parameter(torch.randn((len(self.t), 1))) 
                                        for k in range(self.neurons[l])] for l in range(self.total_num_layers)]
    self.weight_para = [[[nn.Parameter(torch.randn((len(self.t), len(self.t))))
                                           for j in range(self.aug_neurons[l])]
                                          for k in range(self.neurons[l])] for l in range(self.total_num_layers)]

我必须使用 self.bias_para 和 self.weight_para。 它们都是应该更新的嵌套列表。 因此我使用 nn.Parameter。 但是,它无法运行,我后来发现我也应该添加 nn.ParameterList。 但是,我尝试两者

    self.bias_para = nn.ParameterList([[nn.Parameter(torch.randn((len(self.t), 1))) 
                                        for k in range(self.neurons[l])] for l in range(self.total_num_layers)])
    self.weight_para = nn.ParameterList([[[nn.Parameter(torch.randn((len(self.t), len(self.t))))
                                           for j in range(self.aug_neurons[l])]
                                          for k in range(self.neurons[l])] for l in range(self.total_num_layers)])

    self.bias_para = nn.ParameterList([nn.ParameterList([nn.Parameter(torch.randn((len(self.t), 1))) 
                                        for k in range(self.neurons[l])]) for l in range(self.total_num_layers)])
    self.weight_para = nn.ParameterList([nn.ParameterList([nn.ParameterList([nn.Parameter(torch.randn((len(self.t), len(self.t))))
                                           for j in range(self.aug_neurons[l])])
                                          for k in range(self.neurons[l])]) for l in range(self.total_num_layers)])

并且我收到一条错误消息“TypeError: cannot assign 'torch.nn.modules.container.ParameterList' object to parameter '0' (torch.nn.Parameter or None required)”。 我应该怎么做才能解决问题?

一个nn.ParameterList应该包含一个nn.Parameter列表,并且不能包含其他nn.ParameterList 你可以有一个单一的理解而不是创建多个级别。

以下代码将在您的nn.Module上成功注册所有这些参数:

self.bias_para = nn.ParameterList([nn.Parameter(torch.randn((len(self.t), 1)))
                                    for l in range(self.total_num_layers)
                                    for k in range(self.neurons[l]) ])

self.weight_para = nn.ParameterList([nn.Parameter(torch.randn((len(self.t), len(self.t))))
                                    for l in range(self.total_num_layers)
                                    for j in range(self.aug_neurons[l])
                                    for k in range(self.neurons[l]) ])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM