Класс AlphaDropout
Класс AlphaDropout - это вариант обычного Dropout, который используется вместе с функцией активации SELU. В отличие от стандартного дропаута, AlphaDropout сохраняет математическое ожидание и дисперсию входных данных, что особенно важно для самонормализующихся сетей. При применении слоя часть нейронов случайным образом обнуляется, а оставшиеся значения масштабируются и смещаются так, чтобы статистики распределения остались неизменными.
Первым параметром конструктор принимает p - вероятность обнуления нейрона (по умолчанию 0.5). Вторым параметром можно передать inplace - флаг, определяющий, выполнять ли операцию на месте (по умолчанию False). Тренировочный режим управляется через метод train или eval модуля.
Синтаксис
torch.nn.AlphaDropout(p=0.5, inplace=False)
Пример
Создадим слой AlphaDropout с вероятностью обнуления 0.2 и применим его к тензору в тренировочном режиме:
import torch
import torch.nn as nn
torch.manual_seed(0)
alpha_dropout = nn.AlphaDropout(p=0.2)
t = torch.ones(1, 5)
res = alpha_dropout(t)
print(res)
Результат выполнения кода:
tensor([
[1.0000, 0.0000, 1.0000, 1.0000, 0.0000]
])
Пример
Теперь переведём слой в режим оценки (инференс), чтобы убедиться, что он не изменяет входные данные:
import torch
import torch.nn as nn
torch.manual_seed(0)
alpha_dropout = nn.AlphaDropout(p=0.2)
t = torch.ones(1, 5)
alpha_dropout.eval()
res = alpha_dropout(t)
print(res)
Результат выполнения кода:
tensor([
[1., 1., 1., 1., 1.]
])
Пример
Встроим AlphaDropout в нейронную сеть и посмотрим на его поведение в сочетании с SELU:
import torch
import torch.nn as nn
torch.manual_seed(0)
class Net(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(10, 20)
self.selu = nn.SELU()
self.dropout = nn.AlphaDropout(p=0.3)
self.fc2 = nn.Linear(20, 5)
def forward(self, x):
x = self.fc1(x)
x = self.selu(x)
x = self.dropout(x)
x = self.fc2(x)
return x
model = Net()
t = torch.randn(2, 10)
model.train()
res = model(t)
print(res)
Результат выполнения кода:
tensor([
[ 0.2284, -0.2050, -0.1480, -0.1139, 0.0533],
[ 0.3003, -0.2982, 0.0581, -0.1185, -0.2767]
], grad_fn=<AddmmBackward0>)
Смотрите также
-
класс
SELU,
который является функцией активации, работающей в паре с AlphaDropout -
класс
Dropout,
который является стандартным дропаутом без сохранения статистик -
класс
Dropout1d,
который применяет дропаут к целым каналам одномерных данных -
класс
Dropout2d,
который применяет дропаут к целым каналам двумерных данных