Функция PyTorch torch.nn.ModuleList

PyTorch torch.nn 参考手册Справочное руководство PyTorch torch.nn


torch.nn.ModuleListЭто контейнер в PyTorch, используемый для хранения списка модулей.

Он похож на список Python, но автоматически регистрирует все дочерние модули.

Определение функции

torch.nn.ModuleList(modules=None)

Примеры использования

Пример 1: Базовое использование

Пример

import torch
import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.layers = nn.ModuleList([
            nn.Linear(10, 20),
            nn.Linear(20, 20),
            nn.Linear(20, 5)
        ])

    def forward(self, x):
        for layer in self.layers:
            x = слой(x)
        return x

model = Net()
x = torch.randn(4, 10)
output = model(x)

print("Вход:", x.shape)
print("Выход:", output.shape)
print("Количество параметров:", sum(p.numel() for p in model.parameters()))

Пример 2: Динамическое построение слоёв

Пример

import torch
import torch.nn as nn

class DynamicNet(nn.Module):
    def __init__(self, num_layers, dim):
        super(DynamicNet, self).__init__()
        self.layers = nn.ModuleList()
        for i in range(num_layers):
            in_dim = dim if i == 0 else dim
            self.layers.append(nn.Linear(in_dim, dim))

    def forward(self, x):
        for i, layer in enumerate(self.layers):
            x = слой(x)
            if i < len(self.layers) - 1:
                x = torch.relu(x)
        return x

model = DynamicNet(num_layers=5, dim=64)
print("Количество слоёв:", len(model.layers))
print("Всего параметров:", sum(p.numel() for p in model.parameters()))

Пример 3: Сравнение с Sequential

Пример

import torch
import torch.nn as nn

# ModuleList - Гибкий
mlist = nn.ModuleList([nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 5)])

# Sequential - Фиксированный порядок
seq = nn.Sequential(nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 5))

print("Доступ по индексу к ModuleList:", mlist[0])
print("Доступ по индексу к Sequential:", seq[0])
print("nModuleList является итерируемым, но не имеет forward")
print("Sequential можно вызывать напрямую")

Сценарии использования

  • Многослойные сети: динамическое построение
  • Рекуррентные структуры: общие слои
  • Сложные модели: требуют пользовательского потока управления

Примечание: вы должны использовать nn.ModuleList вместо списка Python.


PyTorch torch.nn 参考手册Справочное руководство PyTorch torch.nn

Другие расширения