为什么我的动态pytorch模型定义不完整



我试图创建一个自定义pytorch模型类,以允许可变数量的隐藏层。一切似乎";工作;然而,在代码中,即使我设置了10个隐藏层,它们也不会显示在模型定义的打印输出中。我想知道为什么会发生这种事?我可以清楚地看到,这与我使用循环应用隐藏层的方式有关。

代码:

class FFModel(nn.Module):
def __init__(self, input_dim, hidden_dim, layer_dim, output_dim):
super(FFModel, self).__init__()
self.input_layer = nn.Linear(input_dim, hidden_dim).to(device)
self.hidden_layers = [ nn.Linear(hidden_dim, hidden_dim).to(device) for _ in range(layer_dim) ]
self.activation = nn.LeakyReLU().to(device)
self.output_layer = nn.Linear(hidden_dim, output_dim).to(device)
def forward(self, x):
y_hat = self.activation( self.input_layer(x) )
for hidden_layer in self.hidden_layers:
y_hat = self.activation( hidden_layer(y_hat) )
out = self.output_layer(y_hat)
return out
model = FFModel(2, 5, 10, 1)
model

输出:

FFModel(
(input_layer): Linear(in_features=2, out_features=5, bias=True)
(activation): LeakyReLU(negative_slope=0.01)
(output_layer): Linear(in_features=5, out_features=1, bias=True)
)

事实上,如果我更深入地检查并解析参数,即使这个模型应该有10层,但对于10个隐藏层的模型来说,这些参数是不正确的。很明显,这个模型并不像我想象的那样有10层。

为什么隐藏的层都不见了?

for param in model.parameters():
print (param)

out:

Parameter containing:
tensor([[-0.1064, -0.0171],
[-0.5892, -0.5391],
[-0.6420, -0.5128],
[ 0.0128,  0.2155],
[ 0.3406,  0.1825]], device='cuda:0', requires_grad=True)
Parameter containing:
tensor([-0.5432, -0.0650,  0.6447,  0.4615,  0.4772], device='cuda:0',
requires_grad=True)
Parameter containing:
tensor([[ 0.0615,  0.0901,  0.3399, -0.3341,  0.2029]], device='cuda:0',
requires_grad=True)
Parameter containing:
tensor([0.1742], device='cuda:0', requires_grad=True)

PyTorch无法看到您的列表对象。您需要使用nn.ModuleList:

self.hidden_layers = nn.ModuleList([nn.Linear(hidden_dim, hidden_dim).to(device) for _ in range(layer_dim)])

最新更新