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()中,第一个返回的是整个模型本身