Spec-Zone.ru › PyTorch 2

Свертка

class torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1) [source]

Объединяет массив скользящих локальных блоков в большой содержащий тензор.

Рассмотрим пакетный input тензор, содержащий скользящие локальные блоки, например, блоки изображений, с формой (N,C×∏(kernel_size),L)(N, C \times \prod(\text{kernel\_size}), L), где NN — размерность пакета, C×∏(kernel_size)C \times \prod(\text{kernel\_size}) — количество значений в блоке (блок имеет ∏(kernel_size)\prod(\text{kernel\_size}) пространственных локаций, каждая из которых содержит вектор с CC каналами), а LL — общее количество блоков. (Это точно такое же описание, как форма выходных данных Unfold.) Эта операция объединяет эти локальные блоки в большой output тензор с формой (N,C,output_size[0],output_size[1],…)(N, C, \text{output\_size}[0], \text{output\_size}[1], \dots) путём суммирования перекрывающихся значений. Аналогично Unfold, аргументы должны удовлетворять

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

где dd — по всем пространственным измерениям.

  • output_size описывает пространственную форму большого содержащего тензора скользящих локальных блоков. Это полезно для разрешения неоднозначности, когда несколько форм входных данных отображаются на одинаковое количество скользящих блоков, например, с stride > 0.

Аргументы padding, stride и dilation указывают, как извлекаются скользящие блоки.

  • stride управляет шагом скользящих блоков.
  • padding управляет количеством неявных нулевых дополнений с обеих сторон для padding количества точек для каждого измерения перед преобразованием формы.
  • dilation управляет расстоянием между точками ядра; также известен как алгоритм à trous. Его сложнее описать, но эта ссылка содержит хорошую визуализацию того, что делает dilation.
Параметры
  • output_size (int или кортеж) – форма пространственных измерений вывода (т.е., output.sizes()[2:])
  • kernel_size (int или кортеж) – размер скользящих блоков
  • dilation (int или кортеж, необязательно) – параметр, который управляет шагом элементов в окрестности. По умолчанию: 1
  • padding (int или кортеж, необязательно) – неявное нулевое заполнение, добавляемое с обеих сторон входа. По умолчанию: 0
  • stride (int или кортеж) – шаг скользящих блоков во входных пространственных измерениях. По умолчанию: 1
  • Если output_size, kernel_size, dilation, padding или stride — целое число или кортеж длины 1, их значения будут дублироваться по всем пространственным измерениям.
  • В случае двух пространственных измерений вывода эта операция иногда называется col2im.

Примечание

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 являются обратными друг другу (с точностью до постоянного делителя).

Предупреждение

В настоящее время поддерживаются только непакетные (3D) или пакетные (4D) тензоры вывода, похожие на изображения.

Форма:
  • Вход: (N,C×∏(kernel_size),L)(N, C \times \prod(\text{kernel\_size}), L) или (C×∏(kernel_size),L)(C \times \prod(\text{kernel\_size}), L)
  • Выход: (N,C,output_size[0],output_size[1],…)(N, C, \text{output\_size}[0], \text{output\_size}[1], \dots) или (C,output_size[0],output_size[1],…)(C, \text{output\_size}[0], \text{output\_size}[1], \dots) как описано выше

Примеры:

>>> fold = nn.Fold(output_size=(4, 5), kernel_size=(2, 2))
>>> input = torch.randn(1, 3 * 2 * 2, 12)
>>> output = fold(input)
>>> output.size()
torch.Size([1, 3, 4, 5])

© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/2.1/generated/torch.nn.Fold.html

Spec-Zone.ru

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