繁体   English   中英

如何按索引访问 pytorch 模块中的层?

[英]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.

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