Функция torch.nn.Sequential в PyTorch

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


torch.nn.SequentialЭто контейнер в PyTorch для быстрого построения последовательных моделей.

Он выполняет модули в порядке объявления и подходит для построения простых линейных сетей.

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

torch.nn.Sequential(*args)

Описание параметров:

  • *args: Любое количество модулей, которые будут выполняться в порядке их передачи.

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

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

Создайте простую сеть с помощью Sequential:

Пример

import torch
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
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
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
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.


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

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