【问题标题】:How to create a list of modulelists如何创建模块列表列表
【发布时间】:2020-04-04 05:44:47
【问题描述】:

可以创建 PyTorch 模块列表的 python 列表吗? 例如,如果我想在一个层中有几个 Conv1d,然后在另一个层中有不同的 Conv1d。在每一层中,我需要根据层号对输出进行不同的操作。构建这个模块列表的“python-list”的正确方法是什么?

这边:

    class test(nn.Module):
        def __init__(...):
            self.modulelists = []
            for i in range(4):
                self.modulelists.append(nn.ModuleList([nn.Conv1d(10, 10, kernel_size=5) for _ in range(5)]))

或者这样:

    class test(nn.Module):
        def __init__(...):
            self.modulelists = nn.ModuleList()
            for i in range(4):
                self.modulelists.append(nn.ModuleList([nn.Conv1d(10, 10, kernel_size=5) for _ in range(5)]))

谢谢

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    您需要正确注册网络的所有子模块,以便 pytorch 可以访问它们的参数、缓冲区等。
    只有使用正确的containers,才能做到这一点。
    如果您将子模块存储在一个简单的 pythonic 列表中,pytorch 将不知道那里有子模块,它们将被忽略。

    所以,如果你使用简单的pythonic列表来存储子模块,当你调用例如model.cuda()时,列表中子模块的参数将不会被转移到GPU,而是留在 CPU 上。如果您调用 model.parameters() 将所有可训练参数传递给优化器,所有子模块参数将被 pytorch 检测到,因此优化器将不会“看到”它们。

    【讨论】:

    • "如果你将子模块存储在一个简单的 pythonic 列表中,PyTorch 将不知道那里有子模块,它们将被忽略。" -- 即使它们在 ModuelList 中?
    • @Oren a MuduleList 不是 pythonic 列表,pytorch 知道这些是列表中的模块
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多