Spec-Zone.ru › PyTorch 2.14

Unfold

class torch.nn.Unfold(kernel_size, dilation=1, padding=0, stride=1) [исходный код]

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

Рассмотрим тензор 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() [исходный код]

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

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

str

forward(input) [исходный код]

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

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

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.Unfold.html

Spec-Zone.ru

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