DeconvND

Описание

Info

Родительский класс: Module

Производные классы: Deconv1D, Deconv2D, Deconv3D

Общая информация

Этот модуль выполняет операцию n-мерной транспонированной свёртки (обратной свертки, свёртки с дробными шагами (fractionally-strided convolution)). Название "деконволюция" хоть и устоялось, но не является точным описанием происходящей операции.

При осуществлении операции свертки (см. ConvND) над тензором данных безвозвратно теряется определенное количество информации, что дает возможность построить несколько вариантов операций, выполняющих условно обратное действие. Операция транспонированной свёртки является одной из них.

Допустим, есть карта I_{4x4}:

I = \begin{pmatrix} a_1 & a_2 & a_3 & a_4 \\ b_1 & b_2 & b_3 & b_4 \\ c_1 & c_2 & c_3 & c_4 \\ d_1 & d_2 & d_3 & d_4 \\ \end{pmatrix}

И ядро свёртки W_{3x3}:

W = \begin{pmatrix} w_{00} & w_{01} & w_{02} \\ w_{10} & w_{11} & w_{12} \\ w_{20} & w_{21} & w_{22} \\ \end{pmatrix}

Тогда мы можем представить ядро свёртки в виде матрицы свёртки C_{4x16}:

C = \begin{pmatrix} w_{00} & w_{01} & w_{02} & 0 & w_{10} & w_{11} & w_{12} & 0 & w_{20} & w_{21} & w_{22} & 0 & 0 & 0 & 0 & 0 \\ 0 & w_{00} & w_{01} & w_{02} & 0 &w_{10} & w_{11} & w_{12} & 0 & w_{20} & w_{21} & w_{22} & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & w_{00} & w_{01} & w_{02} & 0 & w_{10} & w_{11} & w_{12} & 0 & w_{20} & w_{21} & w_{22} & 0 \\ 0 & 0 & 0 & 0 & 0 & w_{00} & w_{01} & w_{02} & 0 & w_{10} & w_{11} & w_{12} & 0 & w_{20} & w_{21} & w_{22} \\ \end{pmatrix}

Если умножить эту матрицу на уплощённую карту \text{vec}(I): $$ \text{vec}(I) = \begin{pmatrix} a_1 & a_2 & a_3 & a_4 & b_1 & b_2 & b_3 & b_4 & c_1 & c_2 & c_3 & c_4 & d_1 & d_2 & d_3 & d_4 \ \end{pmatrix}^T $$

То как раз получим уплощённую выходную карту \text{vec}(O): $$ \text{vec}(O) = \begin{pmatrix} m_1 & m_2 & m_3 & m_4 \ \end{pmatrix}^{T} $$

Которая затем преобразуется в полноценную выходную карту O_{2x2}:

O = \begin{pmatrix} m_1 & m_2 \\ m_3 & m_4 \\ \end{pmatrix}

Но, как видно, возможна и другая операция: восстановления из O_{2x2} карты \hat{I}_{4x4} путём умножения \text{vec}(O) на транспонированную матрицу свёртки:

\text{vec}(\hat{I}) = C^T\text{vec}(O)

Отсюда и название данной операции: транспонированная свёртка.

В отличие от модуля Upsample, данный модуль является обучаемым, поэтому удается избежать значительных потерь информации в восстанавливаемых элементах.

Параметры операции

Операцию свертки характеризуют следующие параметры и объекты:


Ядро свёртки size


Если посмотреть на вышеприведенный пример, то ядро свертки - это тензор W^T. Ядро свертки характеризуется своим размером, формой и набором значений своих элементов. Для свёрточных слоёв нейронной сети набор значений элементов ядра - это веса, которые являются обучаемым параметром.

Important

В рамках данной библиотеки форма ядер свёртки всегда равносторонняя, т.е. квадрат для двумерной свёртки и куб для трёхмерной.


Шаг свёртки stride


В рамках операции транспонированной свёртки под параметром "шаг" подразумевается шаг прямой свёртки, применение которой бы привел к заданному тензору O. Подробнее об этом параметре для прямой свёртки см. ConvND.

Возьмём двумерную свёртку с ядром размера 3 и шагом 2 (рисунок 1):

Двумерная свёртка с увеличенным шагом
Рисунок 1. Двумерная свёртка (size=3, stride=2)

Для проведения обратной свёртки, восстанавливающей исходную карту 5x5, понадобится "дробить" её шаг путём добавления нулевых элементов между элементами тензора, полученного после прямой свёртки - отсюда и второе название этой операции - свёртка с дробным шагом:

Двумерная свёртка с увеличенным шагом
Рисунок 2. Двумерная обратная свёртка (size=3, stride=2)


Паддинг pad


В рамках операции транспонированной свёртки под параметром паддинг подразумевается паддинг исходного тензора перед прямой свёрткой, применение которой бы привел к заданному тензору O. Подробнее об этом параметре для прямой свёртки см. ConvND.

Чтобы понять принцип, нужно взглянуть на параллельную работу прямой и обратной свёрток. Например, если при прямой свёртке с параметрами size=4, stride=1 на карте размера 5x5 был использован pad=2, то результирующая карта будет размера 6x6 (см. рисунок 3). То есть для проведения обратной свёртки (см. рисунок 4 ) нужно понимать, какие параметры прямой свёртки привели к текущему тензору.

Двумерная прямая свёртка с увеличенным паддингом
Рисунок 3. Двумерная прямая свёртка (size=4, stride=1, pad=2)

Двумерная прямая свёртка с увеличенным паддингом
Рисунок 4. Двумерная обратная свёртка (size=4, stride=1, pad=2)

При использовании параметров, которые позволяют получить при прямой свёртке тензор такого же размера, ожидаемо получить идентичную демонстрацию работы обратной свёртки:

Двумерные прямая и обратная свёртки с получением тензора того же размера
Рисунок 5. Двумерная прямая и обратная свёртки (size=3, stride=1, pad=1)


Разрежение dilation


Параметр разрежения определяет количество раз, в которое будет увеличен размер ядра свертки. При этом элементы ядра удаляются друг от друга в заданное число раз, а образовавшиеся пустые значения заполняются нулями.

Разреженная свёртка (анимация)
Рисунок 6. Разреженная свёртка карты размера 7 (size=3, stride=1, dilation=1)

Приятным свойством применения этой техники является то, что она дешева с точки зрения вычислений. То есть мы используем свертки гораздо большей размерности, увеличиваем поля чувствительности, имея возможность отслеживать более глобальные признаки - но не добавляем при этом нагрузки на железо.


Количество связей входных и выходных карт groups


-

Дополнительные источники

  • Различия между операциями обратной свёртки и повышающей дискретизации (upsample): ссылка;
  • Теория арифметики свёрток от Theano: ссылка;
  • Наглядная демонстрация транспонированной свёртки: ссылка.

Инициализация

def __init__(self, nd, inmaps, outmaps, size, stride=1, pad=0, dilation=1, wscale=1.0, useBias=True, name=None,
                 initscheme=None, empty=False, groups=1):

Параметры

Параметр Возможные типы Описание По умолчанию
nd int Размерность операции. -
inmaps int Количество карт во входном тензоре. -
outmaps int Количество карт в выходном тензоре. -
size int Размер фильтра. -
stride int, tuple Шаг свёртки. 1
pad int, tuple Паддинг карт. 0
dilation int Разрежение окна свёртки. 1
wscale float Дисперсия случайных весов слоя. 1.0
useBias bool Использовать или нет вектор биасов. True
initscheme Union[tuple, str] Указывает схему инициализации весов слоя (см. createTensorWithScheme). None -> ("xavier_uniform", "in")
name str Имя слоя. None
empty bool Если True, то матрица весов и биас не инициализируются. False
groups int На сколько групп разбиваются карты для раздельной обработки. 1

Пояснения

См. классы потомки.