named_children()/named_modules()


作用:

model.named_children()
#返回一个迭代器,该迭代器能返回模块的名称以及模块本身

model.named_modules()
#返回一个迭代器,该迭代器返回网络中所有模块的名字和模块本身
'''
 1.会返回组成子模块的模块
 2.返回的第一个值是整个模型
'''

测试:

import torch
import torch.nn as nn

class TestModule(nn.Module):
    def __init__(self):
        super(TestModule, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(1,1,3,1,0),
            nn.ReLU()
        )
        self.layer2 = nn.Sequential(
            nn.Conv2d(2,2,3,1,0),
            nn.ReLU()
        )
    def forward(self,x):
        x = self.layer1(x)
        x = self.layer2(x)
        return x

T = TestModule()

#只返回模型的子模块
print('Childern:')
for name,module in T.named_children():
    print('-----------------')
    print(name)
    print(module)
print()
#模型的子模块和子模块的模块均返回
print('Modules:')
for name , module in T.named_modules():
    print('-----------------')
    print(name)
    print(module)

结果:

Childern:
-----------------
layer1
Sequential(
  (0): Conv2d(1, 1, kernel_size=(3, 3), stride=(1, 1))
  (1): ReLU()
)
-----------------
layer2
Sequential(
  (0): Conv2d(2, 2, kernel_size=(3, 3), stride=(1, 1))
  (1): ReLU()
)



Modules:
-----------------

TestModule(
  (layer1): Sequential(
    (0): Conv2d(1, 1, kernel_size=(3, 3), stride=(1, 1))
    (1): ReLU()
  )
  (layer2): Sequential(
    (0): Conv2d(2, 2, kernel_size=(3, 3), stride=(1, 1))
    (1): ReLU()
  )
)
-----------------
layer1
Sequential(
  (0): Conv2d(1, 1, kernel_size=(3, 3), stride=(1, 1))
  (1): ReLU()
)
-----------------
layer1.0
Conv2d(1, 1, kernel_size=(3, 3), stride=(1, 1))
-----------------
layer1.1
ReLU()
-----------------
layer2
Sequential(
  (0): Conv2d(2, 2, kernel_size=(3, 3), stride=(1, 1))
  (1): ReLU()
)
-----------------
layer2.0
Conv2d(2, 2, kernel_size=(3, 3), stride=(1, 1))
-----------------
layer2.1
ReLU()

结果解释:

  • 在named_children()中,只返回模型的子模块
  • 在named_modules()中,layer1指的就是模型的子模块,layer1.0指的就是组成layer1的第一个模块,以此类推
  • 注意,在named_modules()中,第一个返回的是整个模型本身