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()不同的实例了。

 





 

 



 

  • 67
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
PyTorch中,Module是一个基类,它是所有神经网络模块的父类。无论是模型、层、激活函数还是损失函数,都可以被视为Module的扩展。所以,modules和named_modules可以用于递归遍历模型的各个层次,从浅到深,迭代每个自定义块(block)以及block内的每个层(layer),将它们都视为module进行迭代。而children则更加直观,它表示模型中的"孩子",即直接子模块,不进行深入递归。 需要注意的是,model.modules()和model.named_modules()方法返回的都是迭代器(iterator),可以用于遍历模型中的各个子模块。此外,model.modules()返回的是所有子模块的迭代器,而model.named_modules()返回的是带有子模块名称的迭代器。 总之,ModulePyTorch神经网络模块的基类,通过使用modules和named_modules方法,可以方便地对模型进行层层迭代遍历,而children方法则直接返回模型的直接子模块。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [pytorch教程之nn.Module类详解——使用Module类来自定义模型](https://blog.csdn.net/qq_27825451/article/details/90550890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值