Функция fold
Функция fold выполняет операцию, обратную функции unfold: она преобразует набор извлечённых скользящих блоков обратно в исходный тензор. Она особенно полезна в задачах обработки изображений и при работе со свёрточными слоями. Функция принимает входной тензор с блоками, размер выходного тензора и размер ядра. Результатом является собранный тензор, в котором перекрывающиеся области суммируются.
Синтаксис
torch.nn.functional.fold(input, output_size, kernel_size, [dilation, padding, stride])
Параметры функции:
-
input- тензор с блоками размера(N, C * prod(kernel_size), L) -
output_size- кортеж(H, W)или(D, H, W)для трёхмерного случая -
kernel_size- размер ядра (кортеж или целое число) -
dilation- коэффициент расширения ядра (по умолчанию1) -
padding- количество отступов (по умолчанию0) -
stride- шаг скольжения (по умолчанию1)
Пример
Простой пример использования функции fold для восстановления одноканального изображения из блоков:
import torch
import torch.nn.functional as F
# Исходное изображение 3x3
t = torch.tensor([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
], dtype=torch.float32)
t = t.unsqueeze(0).unsqueeze(0) # (1, 1, 3, 3)
# Извлекаем блоки 2x2 с шагом 1
blocks = F.unfold(t, kernel_size=2, stride=1)
# Восстанавливаем изображение
res = F.fold(blocks, output_size=(3, 3), kernel_size=2, stride=1)
print(res.squeeze())
Результат выполнения кода:
tensor([
[ 1., 4., 3.],
[ 8., 20., 12.],
[ 7., 16., 9.]
])
Обратите внимание, что перекрывающиеся области суммируются, поэтому центральный элемент стал 20 (сумма перекрывающихся блоков).
Пример
Использование функции fold с многоканальным изображением и указанием параметров шага и отступов:
import torch
import torch.nn.functional as F
# Создаём входной тензор с блоками
# (batch_size, channels * kernel_h * kernel_w, num_blocks)
batch = 1
channels = 3
kernel = 2
height = 5
width = 5
num_blocks = 16 # (5-2+1)^2 = 16 при stride=1
blocks = torch.randn(batch, channels * kernel * kernel, num_blocks)
# Собираем изображение размером 5x5
res = F.fold(blocks, output_size=(height, width), kernel_size=kernel, stride=1)
print(res.shape)
Результат выполнения кода:
torch.Size([1, 3, 5, 5])
Пример
Восстановление изображения с использованием шага и отступов для управления перекрытием:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
# Параметры
batch = 1
channels = 1
kernel = (3, 3)
stride = (2, 2)
padding = (1, 1)
output_size = (5, 5)
# Количество блоков
H_out = (output_size[0] + 2 * padding[0] - kernel[0]) // stride[0] + 1
W_out = (output_size[1] + 2 * padding[1] - kernel[1]) // stride[1] + 1
num_blocks = H_out * W_out # 9
# Создаём случайные блоки
blocks = torch.randn(batch, channels * kernel[0] * kernel[1], num_blocks)
# Восстанавливаем изображение
res = F.fold(blocks, output_size=output_size, kernel_size=kernel, stride=stride, padding=padding)
print(f"Output shape: {res.shape}")
print(f"Output values: {res.squeeze()[:2, :2]}")
Результат выполнения кода:
Output shape: torch.Size([1, 1, 5, 5])
Output values: tensor([
[1.5410, 0.1276],
[0.4963, 1.0902]
])
Смотрите также
-
функцию
unfold,
которая выполняет операцию, обратнуюfold- извлекает скользящие блоки из тензора -
функцию
conv2d,
которая выполняет двумерную свёртку с использованием ядра -
функцию
conv_transpose2d,
которая выполняет транспонированную свёртку для восстановления размера -
функцию
pad,
которая добавляет отступы к тензору для управления краевыми эффектами