РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
415 of 769 menu

Функция 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,
    которая добавляет отступы к тензору для управления краевыми эффектами
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить