![](/img/trans.png)
[英]How can I only train the classifier and freeze rest of the parameters in 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.