Spec-Zone.ru › PyTorch 2.14

Unfold

class torch.nn.modules.fold.Unfold(kernel_size, dilation=1, padding=0, stride=1) [source]

Извлекает локальные блоки из пакетного входного тензора с помощью скользящего окна.

Рассмотрим пакетный тензор input формы (N,C,∗)(N, C, *), где NN — размерность пакета, CC — размерность каналов, а ∗* обозначает произвольные пространственные размерности. Эта операция преобразует каждый блок размера kernel_size, перемещающийся по пространственным размерностям input, в столбец (то есть последнюю размерность) 3D-тензора output формы (N,C×∏(kernel_size),L)(N, C \times \prod(\text{kernel\_size}), L), где C×∏(kernel_size)C \times \prod(\text{kernel\_size}) — общее число значений в каждом блоке (блок содержит ∏(kernel_size)\prod(\text{kernel\_size}) пространственных позиций, в каждой из которых находится вектор с CC каналами), а LL — общее число таких блоков:

L=∏d⌊spatial_size[d]+2×padding[d]−dilation[d]×(kernel_size[d]−1)−1stride[d]+1⌋,L = \prod_d \left\lfloor\frac{\text{spatial\_size}[d] + 2 \times \text{padding}[d] % - \text{dilation}[d] \times (\text{kernel\_size}[d] - 1) - 1}{\text{stride}[d]} + 1\right\rfloor,

где spatial_size\text{spatial\_size} образуется пространственными размерностями input (выше обозначены как ∗*), а dd перебирает все пространственные размерности.

Таким образом, индексирование 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 (пакетные тензоры, представляющие изображения).

Форма:
  • Входные данные: (N,C,∗)(N, C, *)
  • Выходные данные: (N,C×∏(kernel_size),L)(N, C \times \prod(\text{kernel\_size}), L), как описано выше

Примеры:

>>> 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]

Возвращает дополнительное представление модуля.

Тип возвращаемого значения:

str

forward(input) [source]

Выполняет прямой проход.

Тип возвращаемого значения:

Tensor

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API