Класс Dropout2d
Класс Dropout2d применяет пространственный dropout
к 2D картам признаков. В отличие от обычного Dropout,
который случайно обнуляет отдельные элементы тензора,
Dropout2d обнуляет целые карты признаков.
Первый параметр p задаёт вероятность обнуления канала,
второй параметр inplace определяет, выполнять ли операцию
на месте.
Синтаксис
torch.nn.Dropout2d(p=0.5, inplace=False)
Пример
Давайте создадим модуль dropout с вероятностью обнуления 0.5:
import torch
import torch.nn as nn
dropout = nn.Dropout2d(p=0.5)
print(dropout)
Результат выполнения кода:
Dropout2d(p=0.5, inplace=False)
Пример
Применим dropout к 4D тензору (batch, channels, height, width):
import torch
import torch.nn as nn
torch.manual_seed(0)
dropout = nn.Dropout2d(p=0.5)
t = torch.tensor([
[
[[1.0, 2.0], [3.0, 4.0]],
[[5.0, 6.0], [7.0, 8.0]],
]
])
res = dropout(t)
print(res)
Результат выполнения кода:
tensor([
[
[[0.0, 0.0], [0.0, 0.0]],
[[10.0, 12.0], [14.0, 16.0]],
]
])
Обратите внимание: обнулился целый канал (первая карта признаков), а значения второго канала были умножены на 1/(1-p)=2 для сохранения математического ожидания.
Пример
Применим dropout в режиме обучения и оценки:
import torch
import torch.nn as nn
torch.manual_seed(0)
dropout = nn.Dropout2d(p=0.3)
t = torch.ones(1, 3, 2, 2)
# Training mode - dropout active
dropout.train()
res_train = dropout(t)
print("Training mode:")
print(res_train)
# Evaluation mode - dropout disabled
dropout.eval()
res_eval = dropout(t)
print("Evaluation mode:")
print(res_eval)
Результат выполнения кода:
Training mode:
tensor([
[
[[0.0, 0.0], [0.0, 0.0]],
[[0.0, 0.0], [0.0, 0.0]],
[[1.4286, 1.4286], [1.4286, 1.4286]],
]
])
Evaluation mode:
tensor([
[
[[1.0, 1.0], [1.0, 1.0]],
[[1.0, 1.0], [1.0, 1.0]],
[[1.0, 1.0], [1.0, 1.0]],
]
])
Пример
Используем Dropout2d внутри свёрточной сети:
import torch
import torch.nn as nn
class SimpleConvNet(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
self.conv2 = nn.Conv2d(16, 32, 3, padding=1)
self.dropout = nn.Dropout2d(p=0.25)
self.fc = nn.Linear(32 * 8 * 8, 10)
def forward(self, x):
x = self.conv1(x)
x = torch.relu(x)
x = self.dropout(x)
x = self.conv2(x)
x = torch.relu(x)
x = x.view(x.size(0), -1)
x = self.fc(x)
return x
model = SimpleConvNet()
t = torch.randn(4, 3, 8, 8)
res = model(t)
print(res.shape)
Результат выполнения кода:
torch.Size([4, 10])
Смотрите также
-
класс
Dropout,
который применяет обычный dropout к отдельным элементам тензора -
класс
Dropout1d,
который применяет пространственный dropout к 1D картам признаков -
класс
Dropout3d,
который применяет пространственный dropout к 3D картам признаков -
класс
Conv2d,
который выполняет двумерную свёртку и часто используется вместе с dropout