Адаптивный пул в PyTorch
У класса AdaptiveAvgPool2d
на выходе задают нужную высоту
и ширину, а не размер окна.
Слой сам подбирает шаг и область
усреднения так, чтобы карта
стала ровно заданного размера.
Сожмём батч до одной ячейки по высоте и ширине и выведем размер результата:
import torch
import torch.nn as nn
batch = torch.randn(2, 16, 7, 9)
pool = nn.AdaptiveAvgPool2d((1, 1))
result = pool(batch)
print(result.shape) # выведет torch.Size([2, 16, 1, 1])
Число картинок и каналов сохраняется. Меняются только пространственные оси. То же правило работает, если целевой размер больше единицы:
import torch
import torch.nn as nn
batch = torch.randn(1, 3, 10, 15)
pool = nn.AdaptiveAvgPool2d((3, 5))
result = pool(batch)
print(result.shape) # выведет torch.Size([1, 3, 3, 5])
Подайте батч 4 на 10
на 11 на 13
в усредняющий слой с целевым
полем 1 на 1.
Выведите размеры результата.
Возьмите случайную карту 2
на 5 на 20 на 30
и преобразование, которое всегда
даёт высоту 4 и ширину 6.
Выведите размеры на выходе.
Сожмите нулевой пакет 1
на 8 на 5 на 7
до поля 2 на 2
усреднением по адаптивному правилу.
Выведите размеры результата.