torch.nn.Module中modules()和children()的区别
pytorch中自定义的网络结构一般都是通过继承nn.Module类来实现的。nn.Module中存在两个相似的method:torch.nn.Module.modules()和torch.nn.Modules.children()。两者有什么联系和区别呢?
import torch.nn as nn
nn.Modules.modules??
Returns an iterator over all modules in the network
import torch.nn as nn
nn.Modules.children??
Returns an iterator over immediate children modules.
- 相同点:返回网络中定义的所有module
- 不同点:modules会递归地返回网络定义的所有module,而children只会返回直接子module
- 例子:
import torch
import torch.nn as nn
# 定义一个简单的网络结构
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Sequential(nn.Conv2d(3, 3, 3), nn.Conv2d(3, 3, 3))
self.conv2 = nn.Sequential(nn.Conv2d(3, 3, 3), nn.Conv2d(3, 3, 3))
def forward(self, x):
x = self.conv1(x)
x = self.conv2(x)
return x
net = Net()
# 实例化网络结构
for index, module in enumerate(net.modules()):
print(index)
print(module)
0
Net(
(conv1): Sequential(
(0): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
(1): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
)
(conv2): Sequential(
(0): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
(1): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
)
)
1
Sequential(
(0): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
(1): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
)
2
Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
3
Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
4
Sequential(
(0): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
(1): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
)
5
Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
6
Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
for index, child in enumerate(net.children()):
print(index)
print(child)
0
Sequential(
(0): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
(1): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
)
1
Sequential(
(0): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
(1): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
)