Функция PyTorch torch.nn.Dropout
Справочное руководство 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.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.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.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.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.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, иначе вывод будет нестабильным.
Другие расширения