Метод children
Метод children класса Module возвращает итератор,
который перебирает все непосредственные дочерние модули текущего
модуля. В отличие от метода modules, который рекурсивно
обходит все вложенные подмодули, метод children
возвращает только модули первого уровня вложенности.
Этот метод полезен, когда нужно получить доступ только
к прямым дочерним слоям модели без обхода всей иерархии.
Синтаксис
module.children()
Метод не принимает параметров и возвращает итератор, содержащий дочерние модули в порядке их добавления.
Пример
Давайте создадим простую нейросеть с несколькими слоями и получим список её дочерних модулей:
import torch
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(10, 20)
self.fc2 = nn.Linear(20, 30)
self.relu = nn.ReLU()
self.dropout = nn.Dropout(0.5)
model = MyModel()
children = list(model.children())
print(children)
Результат выполнения кода:
[Linear(in_features=10, out_features=20, bias=True),
Linear(in_features=20, out_features=30, bias=True),
ReLU(),
Dropout(p=0.5, inplace=False)]
Пример
Рассмотрим разницу между методами children и modules
на примере модели с вложенными модулями:
import torch
import torch.nn as nn
class Block(nn.Module):
def __init__(self):
super().__init__()
self.conv = nn.Conv2d(3, 64, 3)
self.bn = nn.BatchNorm2d(64)
class MyModel(nn.Module):
def __init__(self):
super().__init__()
self.block1 = Block()
self.block2 = Block()
self.fc = nn.Linear(64, 10)
model = MyModel()
print("Children:")
for i, child in enumerate(model.children()):
print(f"{i}: {type(child).__name__}")
print("\nAll modules:")
for i, mod in enumerate(model.modules()):
print(f"{i}: {type(mod).__name__}")
Результат выполнения кода:
Children:
0: Block
1: Block
2: Linear
All modules:
0: MyModel
1: Block
2: Conv2d
3: BatchNorm2d
4: Block
5: Conv2d
6: BatchNorm2d
7: Linear
Как видно из примера, метод children возвращает только
три модуля первого уровня (два блока и линейный слой),
в то время как modules рекурсивно обходит все
вложенные слои внутри блоков.
Пример
Используем метод children для итерации по дочерним
модулям и применения к ним операций:
import torch
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 16, 3)
self.conv2 = nn.Conv2d(16, 32, 3)
self.fc = nn.Linear(32, 10)
self.dropout = nn.Dropout(0.3)
model = MyModel()
for name, child in model.named_children():
print(f"{name}: {type(child).__name__}")
Результат выполнения кода:
conv1: Conv2d
conv2: Conv2d
fc: Linear
dropout: Dropout
В этом примере мы использовали метод named_children,
который работает аналогично children, но возвращает
также имена модулей.
Смотрите также
-
метод
named_children,
который возвращает итератор с именами и дочерними модулями -
метод
modules,
который рекурсивно возвращает все дочерние модули модели -
метод
named_modules,
который рекурсивно возвращает имена и все дочерние модули -
метод
parameters,
который возвращает итератор по параметрам модели