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

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


torch.nn.DropoutЭто модуль в PyTorch, используемый для регуляризации.

Он предотвращает переобучение, случайным образом обнуляя входные элементы, чтобы уменьшить совместную адаптацию между нейронами.

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

torch.nn.Dropout(p=0.5, inplace=False)

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

  • p(float): вероятность обнуления каждого элемента. По умолчанию 0.5.
  • inplace(bool): Выполнять операцию на месте. По умолчанию False.

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

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

Создание и использование слоя Dropout:

Пример

import torch
import torch.nn as nn

# Создать слой Dropout с вероятностью отсева 0.5
dropout = nn.Dropout(p=0.5)

# Режим обучения (Dropout активен)
dropout.train()

# Создать входные данные
input_tensor = torch.ones(1, 10)
print("Вход:", input_tensor.squeeze().tolist())

# Прямой проход несколько раз, наблюдайте случайность
for i in range(3):
    output = dropout(input_tensor)
    print(f"Выход {i+1}:", output.squeeze().tolist())

Можно заметить, что примерно половина элементов случайным образом обнуляется при каждом вызове.

Пример 2: режим обучения против режима оценки

Dropout ведёт себя по-разному во время обучения и оценки:

Пример

import torch
import torch.nn as nn

dropout = nn.Dropout(p=0.5)

# Режим обучения
dropout.train()
train_output = dropout(torch.ones(4, 10))
print("Режим обучения — доля активаций:", (train_output != 0).float().mean().item())

# Режим оценки
dropout.eval()
eval_output = dropout(torch.ones(4, 10))
print("Режим оценки — доля активаций:", (eval_output != 0).float().mean().item())
print("Вывод в режиме оценки:", eval_output[0].tolist())

Во время оценки Dropout не оказывает эффекта, и выходные данные остаются неизменными.

Пример 3: Использование в нейронных сетях

Типичная полносвязная сеть с Dropout:

Пример

import torch
import torch.nn as nn

class DropoutNet(nn.Module):
    def __init__(self, input_dim=784, hidden_dim=256, output_dim=10, dropout_rate=0.5):
        super(DropoutNet, self).__init__()
        self.fc1 = nn.Linear(input_dim, hidden_dim)
        self.dropout1 = nn.Dropout(p=dropout_rate)
        self.fc2 = nn.Linear(hidden_dim, hidden_dim)
        self.dropout2 = nn.Dropout(p=dropout_rate)
        self.fc3 = nn.Linear(hidden_dim, output_dim)
        self.relu = nn.ReLU()

    def forward(self, x):
        x = self.relu(self.fc1(x))
        x = self.dropout1(x)  # Первый Dropout
        x = self.relu(self.fc2(x))
        x = self.dropout2(x)  # Второй Dropout
        x = self.fc3(x)
        return x

model = DropoutNet()

# Режим обучения
model.train()
input_data = torch.randn(32, 784)
output = model(input_data)
print("Форма выходных данных в режиме обучения:", output.shape)

# Режим оценки
model.eval()
output = model(input_data)
print("Форма выходных данных в режиме оценки:", output.shape)

Пример 4: Использование Dropout2d в CNN

nn.Dropout2dОтбрасывать целые карты признаков по каналам:

Пример

import torch
import torch.nn as nn

# Dropout2d отбрасывает по каналам
dropout2d = nn.Dropout2d(p=0.5)

# Вход: batch=1, channels=4, height=4, width=4
input_tensor = torch.ones(1, 4, 4, 4)
dropout2d.train()

output = dropout2d(input_tensor)
print("Форма выходных данных Dropout2d:", output.shape)
print("Количество ненулевых каналов:", (output.sum(dim=(2, 3)) != 0).sum().item())

Пример 5: Влияние разных коэффициентов Dropout

Влияние коэффициента dropout на сеть:

Пример

import torch
import torch.nn as nn

for p in [0.1, 0.3, 0.5, 0.7]:
    dropout = nn.Dropout(p=p)
    dropout.train()

    # Усреднение по нескольким запускам
    total_active = 0
    for _ in range(100):
        output = dropout(torch.ones(1000))
        total_active += (output != 0).float().sum().item()

    avg_active = total_active / 100 / 1000
    print(f"p={p} - средний коэффициент активации: {avg_active:.2%} (ожидается: {1-p:.2%})")

Сравнение типов Dropout

Type Метод Dropout Применимые сценарии
nn.Dropout Случайное обнуление отдельных элементов Полносвязные слои, векторы признаков
nn.Dropout2d Случайным образом обнулять целые каналы Карты признаков сверточного слоя
nn.Dropout3d Случайным образом обнулять целые 3D-каналы 3D-сверточные признаки

ЧАВО

Вопрос 1: Как выбрать вероятность Dropout?

  • 0.1-0.3: Более лёгкая регуляризация, подходит для больших наборов данных
  • 0.4-0.5: Распространённые значения по умолчанию
  • 0.5+: Более сильная регуляризация, подходит для небольших наборов данных

Вопрос 2: Где следует размещать Dropout?

Обычно размещается после полносвязного слоя и после функции активации. Его также можно разместить перед функцией активации.

Вопрос 3: Нужно ли отключать Dropout во время оценки?

Да, при оценке используйте `model.eval()`model.eval()чтобы автоматически отключить Dropout.


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

nn.DropoutОсновные варианты использования включают:

  • Предотвращение переобучения: уменьшение зависимости между нейронами
  • Ансамблирование моделей: аппроксимация эффекта нескольких сетей
  • Полносвязные слои: чаще всего используются в FC-слоях
  • Dropout признаков: повышение устойчивости модели

Примечание: Dropout включён во время обучения; при оценке обязательно переключитесь в режим eval, иначе вывод будет нестабильным.


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

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