Функция F.grid_sample
Функция grid_sample применяется для извлечения значений из входного тензора
в точках, заданных сеткой координат. Первым параметром передаётся входной тензор
размером (N, C, H_in, W_in) для 2D или (N, C, D_in, H_in, W_in) для 3D.
Вторым параметром передаётся сетка координат размером
(N, H_out, W_out, 2) для 2D или (N, D_out, H_out, W_out, 3) для 3D.
Координаты сетки нормализованы к диапазону [-1, 1]. Также доступны параметры
mode для задания метода интерполяции, padding_mode для обработки
выхода за границы и align_corners для выравнивания углов.
Синтаксис
torch.nn.functional.grid_sample(
input,
grid,
mode='bilinear',
padding_mode='zeros',
align_corners=None
)
Пример
Создадим простое изображение и сетку координат, которая масштабирует изображение:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
t = torch.tensor([[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]]).float().unsqueeze(0)
grid = torch.tensor([[
[[-0.5, -0.5], [0.5, -0.5]],
[[-0.5, 0.5], [0.5, 0.5]]
]])
res = F.grid_sample(t, grid, align_corners=True)
print(res)
Результат выполнения кода:
tensor([[
[[2.5000, 3.5000],
[6.5000, 7.5000]]
]])
Пример
Выполним выборку с использованием различных методов интерполяции:
import torch
import torch.nn.functional as F
t = torch.tensor([[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]]).float().unsqueeze(0)
grid = torch.tensor([[
[[0.0, 0.0], [0.5, 0.0]],
[[0.0, 0.5], [0.5, 0.5]]
]])
res_bilinear = F.grid_sample(t, grid, mode='bilinear', align_corners=False)
res_nearest = F.grid_sample(t, grid, mode='nearest', align_corners=False)
print("Bilinear:")
print(res_bilinear)
print("Nearest:")
print(res_nearest)
Результат выполнения кода:
Bilinear:
tensor([[[[5.0000, 5.5000],
[5.5000, 6.0000]]]])
Nearest:
tensor([[[[5.0000, 5.0000],
[5.0000, 5.0000]]]])
Пример
Используем различные режимы обработки выхода за границы:
import torch
import torch.nn.functional as F
t = torch.tensor([[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]]).float().unsqueeze(0)
grid = torch.tensor([[
[[-1.5, -1.5], [0.0, 0.0]],
[[0.0, 0.0], [1.5, 1.5]]
]])
res_zeros = F.grid_sample(t, grid, padding_mode='zeros', align_corners=True)
res_border = F.grid_sample(t, grid, padding_mode='border', align_corners=True)
res_reflection = F.grid_sample(t, grid, padding_mode='reflection', align_corners=True)
print("Zeros:")
print(res_zeros)
print("Border:")
print(res_border)
print("Reflection:")
print(res_reflection)
Результат выполнения кода:
Zeros:
tensor([[[[0.0000, 5.0000],
[5.0000, 0.0000]]]])
Border:
tensor([[[[1.0000, 5.0000],
[5.0000, 9.0000]]]])
Reflection:
tensor([[[[9.0000, 5.0000],
[5.0000, 1.0000]]]])
Смотрите также
-
функцию
interpolate,
которая выполняет изменение размера тензора -
функцию
affine_grid,
которая создаёт сетку координат для аффинного преобразования -
функцию
conv2d,
которая применяет двумерную свёртку к входному тензору -
функцию
pad,
которая добавляет отступы к тензору