Макс-пул в PyTorch
Если нужно сжать карту и оставить
самый сильный отклик в каждом
фрагменте, берут класс MaxPool2d.
Окно скользит по высоте и ширине
и на каждом шаге записывает
максимум среди попавших ячеек.
Зададим окно 2 на 2
и посмотрим, как меняются размеры
батча:
import torch
import torch.nn as nn
batch = torch.randn(2, 4, 8, 8)
pool = nn.MaxPool2d(2)
result = pool(batch)
print(result.shape) # выведет torch.Size([2, 4, 4, 4])
На маленьком примере видно, какие числа попадают в каждую ячейку результата:
import torch
import torch.nn as nn
single = torch.tensor([[[[1., 2., 3., 4.],
[5., 6., 7., 8.],
[9., 10., 11., 12.],
[13., 14., 15., 16.]]]])
pool = nn.MaxPool2d(2)
print(pool(single)) # выведет tensor([[[[ 6., 8.], [14., 16.]]]])
Создайте карту 1 на 1
на 6 на 6 из
целых от 1 до 36
по порядку. Сожмите её окном
3 и выведите размеры
и все числа результата.
Возьмите случайный батч 3
на 5 на 12 на 12
и окно максимума 4 без
перекрытия. Выведите размеры
после сжатия.
Подайте единичную карту 1
на 2 на 8 на 8
в слой, который оставляет максимум
в блоке 2 на 2.
Выведите размеры выхода.