[英]How can I access layers in a pytorch module by index?
我正在尝试编写具有多层的 pytorch 模块。 由于我需要中间输出,因此我不能像往常一样将它们全部放在 Sequantial 中。 另一方面,由于有很多层,我的想法是将这些层放在一个列表中,并在循环中通过索引访问它们。 下面描述我想要实现的目标:
import torch
import torch.nn as nn
import torch.optim as optim
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.layer_list = []
self.layer_list.append(nn.Linear(2,3))
self.layer_list.append(nn.Linear(3,4))
self.layer_list.append(nn.Linear(4,5))
def forward(self, x):
res_list = [x]
for i in range(len(self.layer_list)):
res_list.append(self.layer_list[i](res_list[-1]))
return res_list
model = MyModel()
x = torch.randn(4,2)
y = model(x)
print(y)
optimizer = optim.Adam(model.parameters())
forward 方法工作正常,但是当我想设置优化器时,程序说
ValueError: optimizer got an empty parameter list
列表中的图层似乎未在此处注册。 我能做些什么?
如果您将图层放入 python 列表中,则 pytorch 不会正确注册它们。 您必须使用ModuleList
( https://pytorch.org/docs/master/generated/torch.nn.ModuleList.html ) 这样做。
ModuleList 可以像常规的 Python 列表一样被索引,但它包含的模块已正确注册,并且所有 Module 方法都可以看到。
你的代码应该是这样的:
import torch
import torch.nn as nn
import torch.optim as optim
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.layer_list = nn.ModuleList() # << the only changed line! <<
self.layer_list.append(nn.Linear(2,3))
self.layer_list.append(nn.Linear(3,4))
self.layer_list.append(nn.Linear(4,5))
def forward(self, x):
res_list = [x]
for i in range(len(self.layer_list)):
res_list.append(self.layer_list[i](res_list[-1]))
return res_list
通过使用ModuleList
,您可以确保所有层都在计算图中注册。
如果要按名称索引图层,还可以使用ModuleDict
。 您可以在此处查看 pytorch 的容器: https://pytorch.org/docs/master/nn.html#containers
可以通过使用列出神经网络上的所有层
list_layers = model.named_children()
在第一种情况下,您可以使用:
parameters = list(Model1.parameters())+ list(Model2.parameters())
optimizer = optim.Adam(parameters, lr=1e-3)
在第二种情况下,你没有创建 object,所以基本上你可以试试这个:
model = VAE()
optimizer = optim.Adam(model.parameters(), lr=1e-3)
对了,你可以从修改Pytorch提供的VAE例子开始。
也许您错过了最初的 function 或以错误的方式初始化 model。 请参阅此处的初始化function。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.