Unfold
-
class torch.nn.modules.fold.Unfold(kernel_size, dilation=1, padding=0, stride=1)[source] -
Извлекает локальные блоки из пакетного входного тензора с помощью скользящего окна.
Рассмотрим пакетный тензор
inputформы , где — размерность пакета, — размерность каналов, а обозначает произвольные пространственные размерности. Эта операция преобразует каждый блок размераkernel_size, перемещающийся по пространственным размерностямinput, в столбец (то есть последнюю размерность) 3D-тензораoutputформы , где — общее число значений в каждом блоке (блок содержит пространственных позиций, в каждой из которых находится вектор с каналами), а — общее число таких блоков:где образуется пространственными размерностями
input(выше обозначены как ), а перебирает все пространственные размерности.Таким образом, индексирование
outputпо последней размерности (размерности столбцов) позволяет получить все значения внутри определённого блока.Аргументы
padding,strideиdilationзадают способ извлечения блоков с помощью скользящего окна.-
strideзадаёт шаг перемещения скользящего окна. -
paddingзадаёт размер неявного заполнения нулями с обеих сторон дляpaddingточек каждой размерности перед изменением формы. -
dilationзадаёт расстояние между точками ядра; также известно как алгоритм à trous. Его сложнее описать, но по этой ссылке можно посмотреть наглядную иллюстрацию того, что делаетdilation.
- Параметры:
-
- kernel_size (int или tuple) — размер блоков скользящего окна
- dilation (int или tuple, необязательный) — параметр, задающий шаг между элементами в окрестности. По умолчанию: 1
- padding (int или tuple, необязательный) — неявное заполнение входных данных нулями с обеих сторон. По умолчанию: 0
- stride (int или tuple, необязательный) — шаг перемещения блоков скользящего окна по пространственным размерностям входных данных. По умолчанию: 1
- Если
kernel_size,dilation,paddingилиstrideявляется целым числом или кортежем длины 1, его значение будет повторено для всех пространственных размерностей. - В случае двух пространственных размерностей входных данных эту операцию иногда называют
im2col.
Примечание
Foldвычисляет каждое объединённое значение в результирующем большом тензоре, суммируя значения из всех содержащих его блоков.Unfoldизвлекает значения из локальных блоков, копируя их из большого тензора. Поэтому при пересечении блоков эти операции не являются обратными друг другу.В общем случае операции свёртки и развёртки связаны следующим образом. Рассмотрим экземпляры
FoldиUnfold, созданные с одинаковыми параметрами:>>> fold_params = dict(kernel_size=..., dilation=..., padding=..., stride=...) >>> fold = nn.Fold(output_size=..., **fold_params) >>> unfold = nn.Unfold(**fold_params)
Тогда для любого (поддерживаемого) тензора
inputвыполняется следующее равенство:fold(unfold(input)) == divisor * input
где
divisor— тензор, зависящий только от формы и типа данныхinput:>>> input_ones = torch.ones(input.shape, dtype=input.dtype) >>> divisor = fold(unfold(input_ones))
Если тензор
divisorне содержит нулевых элементов, то операцииfoldиunfoldявляются обратными друг другу (с точностью до постоянного множителя).Предупреждение
В настоящее время поддерживаются только входные тензоры размерности 4 (пакетные тензоры, представляющие изображения).
- Форма:
-
- Входные данные:
- Выходные данные: , как описано выше
Примеры:
>>> unfold = nn.Unfold(kernel_size=(2, 3)) >>> input = torch.randn(2, 5, 3, 4) >>> output = unfold(input) >>> # each patch contains 30 values (2x3=6 vectors, each of 5 channels) >>> # 4 blocks (2x3 kernels) in total in the 3x4 input >>> output.size() torch.Size([2, 30, 4]) >>> # Convolution is equivalent with Unfold + Matrix Multiplication + Fold (or view to output shape) >>> inp = torch.randn(1, 3, 10, 12) >>> w = torch.randn(2, 3, 4, 5) >>> inp_unf = torch.nn.functional.unfold(inp, (4, 5)) >>> out_unf = inp_unf.transpose(1, 2).matmul(w.view(w.size(0), -1).t()).transpose(1, 2) >>> out = torch.nn.functional.fold(out_unf, (7, 8), (1, 1)) >>> # or equivalently (and avoiding a copy), >>> # out = out_unf.view(1, 2, 7, 8) >>> (torch.nn.functional.conv2d(inp, w) - out).abs().max() tensor(1.9073e-06)
-
extra_repr()[source] -
Возвращает дополнительное представление модуля.
- Тип возвращаемого значения:
-
forward(input)[source] -
Выполняет прямой проход.
- Тип возвращаемого значения:
-
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.nn.modules.fold.Unfold.html