children()
与
modules()
都是返回网络模型里的组成元素,但是
children()
返回的是最外层的元素,
modules()
返回的是所有的元素,包括不同级别的子元素。
1 children()
net = nn.Sequential(nn.Linear(2,2),
nn.ReLU(),
nn.Sequential(nn.Sigmoid(), nn.ReLU()))
list(net.children())
输出一共3个元素:
linear
,relu
和sequential
。
[Linear(in_features=2, out_features=2, bias=True),
ReLU(),
Sequential(
(0): Sigmoid()
(1): ReLU()
)]
2 modules()
list(net.modules())
输出一共包括 6 个元素:整体的一个
sequential
,里面的一个linear
,一个relu
,一个子sequential
,以及sequential
里的sigmoid
和relu
。
[Sequential(
(0): Linear(in_features=2, out_features=2, bias=True)
(1): ReLU()
(2): Sequential(
(0): Sigmoid()
(1): ReLU()
)
),
Linear(in_features=2, out_features=2, bias=True),
ReLU(),
Sequential(
(0): Sigmoid()
(1): ReLU()
),
Sigmoid(),
ReLU()]
【注意】modules()
中重复的modules
只返回一次,是模块级的而不是torch.nn
里基础的层。
# 例 1
module = nn.Linear(2, 2)
net = nn.Sequential(module, module)
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)
例 1 中
l = nn.Linear(2, 2)
是重复的模块,有单独的命名,是类nn.Linear()
的一个固定实例。
# 例 2
net = nn.Sequential(nn.Linear(2, 2), nn.Linear(2, 2))
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 -> Linear(in_features=2, out_features=2, bias=True)
例 2 中
nn.Linear(2, 2)
不是重复的模块,被看做类nn.Linear()
不同的实例。