Pytorch 如何将self.u模块的self.u字典中的参数添加到self.parameters?

Pytorch 如何将self.u模块的self.u字典中的参数添加到self.parameters?,pytorch,Pytorch,考虑这个简单的例子: import torch class MyModule(torch.nn.Module): def __init__(self): super(MyModule, self).__init__() self.conv_0=torch.nn.Conv2d(3,32,3,stride=1,padding=0) self.blocks=torch.nn.ModuleList([ torch.nn.C

考虑这个简单的例子:

import torch

class MyModule(torch.nn.Module):
    def __init__(self):
        super(MyModule, self).__init__()
        self.conv_0=torch.nn.Conv2d(3,32,3,stride=1,padding=0)
        self.blocks=torch.nn.ModuleList([
            torch.nn.Conv2d(3,32,3,stride=1,padding=0),
            torch.nn.Conv2d(32,64,3,stride=1,padding=0)])

        #the problematic part
        self.dict_block={"key_1": torch.nn.Conv2d(64,128,3,1,0),
                "key_2": torch.nn.Conv2d(56,1024,3,1,0)}

if __name__=="__main__":
    my_module=MyModule()
    print(my_module.parameters)
我在这里得到的输出是(请注意,
self.dict\u block
中的参数丢失)


在使用我的乐观主义者之前。但是,我认为可能有一种更直接的替代方法,将
self.dict\u block
的参数添加到
my\u module\u对象的参数中。如前所述,接近的是
nn.参数(…)
,但这要求输入是张量。

找到了答案。如果有人遇到同样的问题,请发布:

查看
/torch/nn/modules/container.py
似乎有一个类
torch.nn.moduledit
就是这样做的。因此,在我在问题中给出的示例中,解决方案是:

self.dict_block=torch.nn.ModuleDict({"key_1": torch.nn.Conv2d(64,128,3,1,0),
            "key_2": torch.nn.Conv2d(56,1024,3,1,0)})

您应该为子模块使用
torch.nn
容器。
my_optimiser.add_param_group({"params": params_from_self_dict})
self.dict_block=torch.nn.ModuleDict({"key_1": torch.nn.Conv2d(64,128,3,1,0),
            "key_2": torch.nn.Conv2d(56,1024,3,1,0)})