天天看点

pytorch Module里的children()与modules()的区别

children()与modules()都是返回网络模型里的组成元素,但是children()返回的是最外层的元素,modules()返回的是所有的元素,包括不同级别的子元素。

官方论坛的回答:Module.children() vs Module.modules()

我以fmassa的举例为例:

m = nn.Sequential(nn.Linear(2,2), 
                  nn.ReLU(),
                 nn.Sequential(nn.Sigmoid(), nn.ReLU()))
           

m.children()返回的是:

[Linear(in_features=2, out_features=2), ReLU(), Sequential(
   (0): Sigmoid()
   (1): ReLU()
 )]
           

一共3个元素:linear,relu,sequential

m.modules()返回的是:

[Sequential(
   (0): Linear(in_features=2, out_features=2)
   (1): ReLU()
   (2): Sequential(
     (0): Sigmoid()
     (1): ReLU()
   )
 ), Linear(in_features=2, out_features=2), ReLU(), Sequential(
   (0): Sigmoid()
   (1): ReLU()
 ), Sigmoid(), ReLU()]
           

一共包括6个元素:整体的一个sequential,里面的一个linear,一个relu,一个子sequential,以及sequential里的sigmoid和relu。

用list举例就是:

a=[1,2,[3,4]]
           

children返回

1,2,[3,4]
           

modules返回

[1,2,[3,4]], 1, 2, [3,4], 3, 4
           

经 @ kurumi233

提醒,modules()中重复的modules 只返回一次,是模块级的而不是torch.nn里基础的层,如以下例子:

#例子1:
l = nn.Linear(2, 2)
net = nn.Sequential(l, l)
for idx, m in enumerate(net.modules()):
    print(idx, '->', m)
#结果:
0 -> Sequential(
  (0): Linear(in_features=2, out_features=2, bias=True)
  (1): Linear(in_features=2, out_features=2, bias=True)
)
1 -> Linear(in_features=2, out_features=2, bias=True)

#例子2:
net1=nn.Sequential(nn.Linear(2, 2), nn.Linear(2, 2))
for idx, m in enumerate(net1.modules()):
    print(idx, '->', m)

#结果:
0 -> Sequential(
  (0): Linear(in_features=2, out_features=2, bias=True)
  (1): Linear(in_features=2, out_features=2, bias=True)
)
1 -> Linear(in_features=2, out_features=2, bias=True)
2 -> Linear(in_features=2, out_features=2, bias=True)

#例子1中的l = nn.Linear(2, 2)是重复的模块,有单独的命名,是类nn.Linear()的一个固定实例,
#而例子2中的nn.Linear(2, 2)不是重复的模块,估计是看成类nn.Linear()不同的实例了。