Функция torch.nn.Sequential в PyTorch
Справочное руководство PyTorch torch.nn
torch.nn.SequentialЭто контейнер в PyTorch для быстрого построения последовательных моделей.
Он выполняет модули в порядке объявления и подходит для построения простых линейных сетей.
Определение функции
torch.nn.Sequential(*args)
Описание параметров:
*args: Любое количество модулей, которые будут выполняться в порядке их передачи.
Примеры использования
Пример 1: Базовое использование
Создайте простую сеть с помощью Sequential:
Пример
import torch.nn as nn
# Создание последовательного контейнера
model = nn.Sequential(
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 5)
)
# Проверка прямого распространения
input_tensor = torch.randn(3, 10)
output = model(input_tensor)
print("Структура модели:")
print(model)
print("nФорма входа:", input_tensor.shape)
print("Форма выхода:", output.shape)
Пример 2: Присвоение имён слоям с помощью OrderedDict
Укажите имя для каждого слоя с помощью OrderedDict:
Пример
import torch.nn as nn
from collections import OrderedDict
# Именование слоёв с помощью OrderedDict
model = nn.Sequential(OrderedDict([
('fc1', nn.Linear(784, 256)),
('relu1', nn.ReLU()),
('fc2', nn.Linear(256, 128)),
('relu2', nn.ReLU()),
('output', nn.Linear(128, 10))
]))
# К слоям можно обращаться по имени
print("слой fc1:", model.fc1)
print("слой relu1:", model.relu1)
#
x = torch.randn(32, 784)
output = model(x)
print("nРазмер выхода:", output.shape)
Пример 3: Пример CNN
Постройте сверточную нейронную сеть:
Пример
import torch.nn as nn
cnn = nn.Sequential(
# Первый свёрточный блок
nn.Conv2d(3, 32, kernel_size=3, padding=1),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(2, 2),
# Второй свёрточный блок
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(2, 2),
# Выравнивание
nn.Flatten(),
nn.Linear(64 * 8 * 8, 256),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(256, 10)
)
#
x = torch.randn(4, 3, 32, 32)
output = cnn(x)
print("структура CNN:")
print(cnn)
print("форма nInput:", x.shape)
print("Форма выхода:", output.shape)
Пример 4: Доступ к выходам промежуточных слоев
Используйте forward hooks для доступа к промежуточным слоям:
Пример
import torch.nn as nn
# Простая сеть
model = nn.Sequential(
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 10)
)
# Метод 1: Использование хуков
feature = None
def hook_fn(module, input, output):
global feature
feature = output.clone()
# Регистрация хука
model[1].register_forward_hook(hook_fn)
# Прямое распространение
x = torch.randn(1, 10)
output = model(x)
print("Форма выхода ReLU:", feature.shape)
print("Выход ReLU:", feature.squeeze().tolist())
Sequential против ручного определения forward
| Подход | Преимущества | Недостатки |
|---|---|---|
nn.Sequential |
Лаконично, быстро создаётся | Низкая гибкость, нельзя разделять слои |
| Ручное определение forward | Гибкое управление потоком данных | Больше кода |
Часто задаваемые вопросы
Вопрос 1: Как получить конкретный слой в Sequential?
Доступ по индексу или имени:model[0]илиmodel.fc1
Вопрос 2: Подходит ли Sequential для всех сетей?
Не подходит для сетей с пропускными соединениями, ветвлениями или сложными потоками данных.
Вопрос 3: Как изменить слои в Sequential?
Вы можете использоватьmodel[index] = new_moduleчтобы заменить указанный слой.
Сценарии использования
nn.SequentialОсновные сценарии применения включают:
- Простые сети: линейно составленные MLP, CNN
- Быстрое прототипирование: быстрая проверка идей модели
- Извлечение признаков: фиксированная структура сети
Совет: для сложных сетей рекомендуется наследовать nn.Module и вручную определить метод forward.
Другие расширения