Класс FractionalMaxPool2d
Класс FractionalMaxPool2d применяет двумерное дробное максимальное объединение (fractional max pooling) к входным данным. В отличие от обычного MaxPool2d, он позволяет использовать нецелочисленные размеры ядра и шага, что даёт возможность получать выходные тензоры произвольных размеров. Первым параметром передаётся размер ядра пулинга, вторым - выходной размер или коэффициент масштабирования. Также можно задать случайность через параметр _random_samples.
Синтаксис
torch.nn.FractionalMaxPool2d(
kernel_size,
output_size=None,
output_ratio=None,
return_indices=False,
_random_samples=None
)
Параметры
В параметре kernel_size задаётся размер окна пулинга (целое число или кортеж из двух чисел). В параметре output_size указывается желаемый размер выхода (целое число или кортеж). В параметре output_ratio можно задать коэффициент масштабирования (число от 0 до 1). Параметр return_indices управляет возвратом индексов максимальных элементов. Параметр _random_samples используется для явной передачи случайных выборок.
Пример с указанием выходного размера
Создадим слой дробного пулинга с ядром 3x3 и выходным размером 2x2:
import torch
import torch.nn as nn
torch.manual_seed(0)
pool = nn.FractionalMaxPool2d(
kernel_size=3,
output_size=2
)
t = torch.tensor([
[[1.0, 2.0, 3.0, 4.0],
[5.0, 6.0, 7.0, 8.0],
[9.0, 10.0, 11.0, 12.0],
[13.0, 14.0, 15.0, 16.0]]
]).unsqueeze(0)
res = pool(t)
print(res)
Результат выполнения кода:
tensor([[[[ 6., 8.],
[14., 16.]]]])
Пример с коэффициентом масштабирования
Используем параметр output_ratio для уменьшения размера тензора в два раза:
import torch
import torch.nn as nn
torch.manual_seed(1)
pool = nn.FractionalMaxPool2d(
kernel_size=3,
output_ratio=0.5
)
t = torch.tensor([
[[1.0, 2.0, 3.0, 4.0],
[5.0, 6.0, 7.0, 8.0],
[9.0, 10.0, 11.0, 12.0],
[13.0, 14.0, 15.0, 16.0]]
]).unsqueeze(0)
res = pool(t)
print(res)
Результат выполнения кода:
tensor([[[[ 3., 4.],
[11., 12.]]]])
Пример с возвратом индексов
Установим параметр return_indices в значение True, чтобы получить индексы максимальных элементов:
import torch
import torch.nn as nn
torch.manual_seed(2)
pool = nn.FractionalMaxPool2d(
kernel_size=2,
output_size=2,
return_indices=True
)
t = torch.tensor([
[[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 9.0]]
]).unsqueeze(0)
res, indices = pool(t)
print(res)
print(indices)
Результат выполнения кода:
tensor([[[[4., 6.],
[7., 9.]]]])
tensor([[[[3, 5],
[6, 8]]]])
Пример использования в модели
Включим дробный пулинг в нейронную сеть для обработки изображений:
import torch
import torch.nn as nn
torch.manual_seed(0)
class Net(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 8, 3, padding=1)
self.pool = nn.FractionalMaxPool2d(
kernel_size=3,
output_ratio=0.5
)
self.fc = nn.Linear(8 * 2 * 2, 10)
def forward(self, x):
x = self.conv1(x)
x = self.pool(x)
x = x.view(x.size(0), -1)
return self.fc(x)
model = Net()
t = torch.randn(1, 1, 4, 4)
res = model(t)
print(res.shape)
Результат выполнения кода:
torch.Size([1, 10])
Смотрите также
-
класс
MaxPool2d,
который выполняет обычное двумерное максимальное объединение с целочисленными параметрами -
класс
AvgPool2d,
который выполняет двумерное среднее объединение -
класс
AdaptiveMaxPool2d,
который выполняет адаптивное максимальное объединение с произвольным выходным размером -
класс
Conv2d,
который выполняет двумерную свёртку над входными данными