Функция adaptive_max_pool2d
Функция adaptive_max_pool2d применяет адаптивный двумерный max pooling к входному тензору. В отличие от обычного max_pool2d, где размер окна и шаг задаются явно, адаптивная версия позволяет указать желаемый размер выходного пространства, и функция автоматически подбирает параметры окна, чтобы получить выходной тензор точно заданного размера. Это особенно удобно в архитектурах нейронных сетей, где нужно соединить слои с различными пространственными размерами. Первым параметром функция принимает входной тензор, вторым - целевой размер выходного пространства.
Синтаксис
torch.nn.functional.adaptive_max_pool2d(input, output_size, return_indices=False)
Основные параметры
Функция принимает следующие параметры:
-
input- входной тензор размерности(N, C, H, W)или(C, H, W), гдеN- размер батча,C- число каналов,HиW- высота и ширина; -
output_size- целевой размер выходного пространства. Может быть задан как целое число (тогда высота и ширина будут одинаковыми) или как кортеж(H_out, W_out); -
return_indices- еслиTrue, то функция возвращает также индексы максимальных элементов, которые могут быть использованы вmax_unpool2d.
Пример
Давайте применим адаптивный max pooling к тензору размером (1, 1, 4, 4) и преобразуем его к размеру (2, 2):
import torch
import torch.nn.functional as F
t = torch.tensor([
[[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]]
], dtype=torch.float)
res = F.adaptive_max_pool2d(t, (2, 2))
print(res)
Результат выполнения кода:
tensor([[
[[ 6., 8.],
[14., 16.]]
]])
Пример
Теперь давайте преобразуем тот же тензор к одному значению, указав output_size=1:
import torch
import torch.nn.functional as F
t = torch.tensor([
[[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]]
], dtype=torch.float)
res = F.adaptive_max_pool2d(t, 1)
print(res)
Результат выполнения кода:
tensor([[[[16.]]]])
Пример
Рассмотрим пример с несколькими каналами и получим индексы максимальных элементов:
import torch
import torch.nn.functional as F
t = torch.tensor([
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
],
[
[16, 15, 14, 13],
[12, 11, 10, 9],
[8, 7, 6, 5],
[4, 3, 2, 1]
]
], dtype=torch.float).unsqueeze(0)
res, indices = F.adaptive_max_pool2d(t, (2, 2), return_indices=True)
print(res)
print(indices)
Результат выполнения кода:
tensor([[
[[ 6., 8.],
[14., 16.]],
[[16., 14.],
[ 8., 2.]]
]])
tensor([[
[[ 5, 7],
[13, 15]],
[[ 0, 2],
[10, 14]]
]])
Пример
Покажем, как адаптивный max pooling работает с батчем изображений разного размера:
import torch
import torch.nn.functional as F
t1 = torch.randn(1, 3, 4, 4)
t2 = torch.randn(1, 3, 8, 8)
t3 = torch.randn(1, 3, 16, 16)
res1 = F.adaptive_max_pool2d(t1, (2, 2))
res2 = F.adaptive_max_pool2d(t2, (2, 2))
res3 = F.adaptive_max_pool2d(t3, (2, 2))
print(res1.shape)
print(res2.shape)
print(res3.shape)
Результат выполнения кода:
torch.Size([1, 3, 2, 2])
torch.Size([1, 3, 2, 2])
torch.Size([1, 3, 2, 2])
Смотрите также
-
функцию
max_pool2d,
которая выполняет обычный двумерный max pooling с заданными параметрами окна -
функцию
adaptive_avg_pool2d,
которая выполняет адаптивный двумерный average pooling -
функцию
avg_pool2d,
которая выполняет обычный двумерный average pooling -
функцию
lp_pool2d,
которая выполняет двумерный пуллинг на основе Lp-нормы