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)})