Метод named_children
Метод named_children класса Module возвращает итератор,
который выдает пары (имя, дочерний модуль) для всех непосредственных
дочерних модулей текущего модуля. В отличие от метода children,
который возвращает только модули, named_children также возвращает
имена этих модулей. Метод не принимает никаких параметров и возвращает
объект-итератор, который можно использовать в циклах или преобразовывать
в список.
Синтаксис
module.named_children()
Пример
Давайте создадим простую модель с несколькими дочерними модулями
и переберем их с помощью метода named_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()
model = MyModel()
for name, child in model.named_children():
print(f"Name: {name}, Type: {child.__class__.__name__}")
Результат выполнения кода:
"Name: fc1, Type: Linear"
"Name: fc2, Type: Linear"
"Name: relu, Type: ReLU"
Пример
Давайте получим все дочерние модули в виде списка кортежей с помощью преобразования итератора:
import torch
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super().__init__()
self.encoder = nn.Linear(10, 20)
self.decoder = nn.Linear(20, 10)
self.activation = nn.Tanh()
model = MyModel()
children_list = list(model.named_children())
print(children_list)
Результат выполнения кода:
[
('encoder', Linear(in_features=10, out_features=20, bias=True)),
('decoder', Linear(in_features=20, out_features=10, bias=True)),
('activation', Tanh()),
]
Пример
Важно отметить, что named_children возвращает только
непосредственные дочерние модули, но не вложенные. Давайте
проверим это на примере модели с вложенными модулями:
import torch
import torch.nn as nn
class SubModule(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(5, 5)
self.activation = nn.ReLU()
class MainModule(nn.Module):
def __init__(self):
super().__init__()
self.input_layer = nn.Linear(10, 5)
self.sub = SubModule()
self.output_layer = nn.Linear(5, 2)
model = MainModule()
for name, child in model.named_children():
print(name)
Результат выполнения кода:
"input_layer"
"sub"
"output_layer"
Как видите, вложенные модули внутри SubModule не были
возвращены методом named_children.
Пример
Метод named_children удобно использовать для изменения
параметров дочерних модулей. Давайте отключим градиенты для
всех дочерних линейных слоев модели:
import torch
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super().__init__()
self.layer1 = nn.Linear(10, 20)
self.layer2 = nn.Linear(20, 30)
self.layer3 = nn.Linear(30, 10)
model = MyModel()
for name, child in model.named_children():
if isinstance(child, nn.Linear):
for param in child.parameters():
param.requires_grad = False
print(f"Disabled gradients for {name}")
Результат выполнения кода:
"Disabled gradients for layer1"
"Disabled gradients for layer2"
"Disabled gradients for layer3"
Смотрите также
-
метод
children,
который возвращает итератор по дочерним модулям без имен -
метод
named_parameters,
который возвращает итератор по именованным параметрам модуля -
метод
named_modules,
который возвращает все модули в иерархии с их именами -
метод
named_buffers,
который возвращает итератор по именованным буферам модуля