Функция PyTorch torch.nn.Dropout2d
Справочное руководство PyTorch torch.nn
torch.nn.Dropout2dявляется двумерным модулем Dropout в PyTorch.
Он случайным образом обнуляет целые каналы, подходит для карт признаков свёрточных слоёв.
Определение функции
torch.nn.Dropout2d(p=0.5, inplace=False)
Особенности
- Случайное обнуление вдоль размерности каналов
- Все каналы каждого образца сохраняют одинаковый шаблон dropout
Примеры использования
Пример 1: Базовое использование
Пример
import torch
import torch.nn as nn
dropout2d = nn.Dropout2d(p=0.5)
dropout2d.train()
# Вход: batch=4, channels=8, height=16, width=16
x = torch.ones(4, 8, 16, 16)
output = dropout2d(x)
# Подсчитать количество отброшенных каналов
non_zero_channels = (output.sum(dim=(2, 3)) != 0).float()
print("Доля ненулевых каналов:", non_zero_channels.mean().item())
print("Ожидается, что сохранится около 0.5 каналов")
import torch.nn as nn
dropout2d = nn.Dropout2d(p=0.5)
dropout2d.train()
# Вход: batch=4, channels=8, height=16, width=16
x = torch.ones(4, 8, 16, 16)
output = dropout2d(x)
# Подсчитать количество отброшенных каналов
non_zero_channels = (output.sum(dim=(2, 3)) != 0).float()
print("Доля ненулевых каналов:", non_zero_channels.mean().item())
print("Ожидается, что сохранится около 0.5 каналов")
Пример 2: Сравнение Dropout
Пример
import torch
import torch.nn as nn
dropout1d = nn.Dropout(0.5)
dropout2d = nn.Dropout2d(0.5)
# Ввод
x = torch.randn(2, 4, 8, 8)
# Dropout: случайным образом обнуляет отдельные элементы
out1 = dropout1d(x)
# Dropout2d: обнуляет по каналам
out2 = dropout2d(x)
print("Форма Dropout:", out1.shape)
print("Форма Dropout2d:", out2.shape)
import torch.nn as nn
dropout1d = nn.Dropout(0.5)
dropout2d = nn.Dropout2d(0.5)
# Ввод
x = torch.randn(2, 4, 8, 8)
# Dropout: случайным образом обнуляет отдельные элементы
out1 = dropout1d(x)
# Dropout2d: обнуляет по каналам
out2 = dropout2d(x)
print("Форма Dropout:", out1.shape)
print("Форма Dropout2d:", out2.shape)
Пример 3: Использование в CNN
Пример
import torch
import torch.nn as nn
# CNN с Dropout2d
model = nn.Sequential(
nn.Conv2d(3, 64, 3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.Dropout2d(0.3), # Dropout на уровне карт признаков
nn.Conv2d(64, 128, 3, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(),
nn.AdaptiveAvgPool2d(1),
nn.Flatten(),
nn.Linear(128, 10)
)
x = torch.randn(4, 3, 32, 32)
output = model(x)
print("Вход:", x.shape, "-> Выход:", output.shape)
import torch.nn as nn
# CNN с Dropout2d
model = nn.Sequential(
nn.Conv2d(3, 64, 3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.Dropout2d(0.3), # Dropout на уровне карт признаков
nn.Conv2d(64, 128, 3, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(),
nn.AdaptiveAvgPool2d(1),
nn.Flatten(),
nn.Linear(128, 10)
)
x = torch.randn(4, 3, 32, 32)
output = model(x)
print("Вход:", x.shape, "-> Выход:", output.shape)
Сценарии использования
- Свёрточные сети: Регуляризация на уровне карт признаков
- Уменьшение зависимости каналов
Примечание: Dropout2d отключает каналы во время обучения и не влияет во время оценки.
Другие расширения