DeconvND¶
Описание¶
Общая информация¶
Этот модуль выполняет операцию n-мерной транспонированной свёртки (обратной свертки, свёртки с дробными шагами (fractionally-strided convolution)). Название "деконволюция" хоть и устоялось, но не является точным описанием происходящей операции.
При осуществлении операции свертки (см. ConvND) над тензором данных безвозвратно теряется определенное количество информации, что дает возможность построить несколько вариантов операций, выполняющих условно обратное действие. Операция транспонированной свёртки является одной из них.
Допустим, есть карта I_{4\times4}:
И ядро свёртки W_{3\times3}:
Тогда мы можем представить ядро свёртки в виде матрицы свёртки C_{4\times16}:
Если умножить эту матрицу на уплощённую карту \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_{2\times2}:
Но, как видно, возможна и другая операция: восстановления из O_{2\times2} карты \hat{I}_{4\times4} путём умножения \text{vec}(O) на транспонированную матрицу свёртки:
Отсюда и название данной операции: транспонированная свёртка.
В отличие от модуля Upsample, данный модуль является обучаемым, поэтому удается избежать значительных потерь информации в восстанавливаемых элементах.
Параметры операции¶
Операцию свертки характеризуют следующие параметры и объекты:
Ядро свёртки size
Если посмотреть на вышеприведенный пример, то ядро свертки - это тензор W^T. Ядро свертки характеризуется своим размером, формой и набором значений своих элементов. Для свёрточных слоёв нейронной сети набор значений элементов ядра - это веса, которые являются обучаемым параметром.
Important
В рамках данной библиотеки форма ядер свёртки всегда равносторонняя, т.е. квадрат для двумерной свёртки и куб для трёхмерной.
Шаг свёртки stride
В рамках операции транспонированной свёртки под параметром "шаг" подразумевается шаг прямой свёртки, применение которой бы привел к заданному тензору O. Подробнее об этом параметре для прямой свёртки см. ConvND.
Возьмём двумерную свёртку с ядром размера 3 и шагом 2 (рисунок 1):
size=3
, stride=2
)Для проведения обратной свёртки, восстанавливающей исходную карту 5x5, понадобится "дробить" её шаг путём добавления нулевых элементов между элементами тензора, полученного после прямой свёртки - отсюда и второе название этой операции - свёртка с дробным шагом:
size=3
, stride=2
)Паддинг pad
В рамках операции транспонированной свёртки под параметром паддинг подразумевается паддинг исходного тензора перед прямой свёрткой, применение которой бы привел к заданному тензору O. Подробнее об этом параметре для прямой свёртки см. ConvND.
Чтобы понять принцип, нужно взглянуть на параллельную работу прямой и обратной свёрток. Например, если при прямой свёртке с параметрами size=4
, stride=1
на карте размера 5x5 был использован pad=2
, то результирующая карта будет размера 6x6 (см. рисунок 3). То есть для проведения обратной свёртки (см. рисунок 4 ) нужно понимать, какие параметры прямой свёртки привели к текущему тензору.
size=4
, stride=1
, pad=2
)size=4
, stride=1
, pad=2
)При использовании параметров, которые позволяют получить при прямой свёртке тензор такого же размера, ожидаемо получить идентичную демонстрацию работы обратной свёртки:
size=3
, stride=1
, pad=1
)Разрежение dilation
Параметр разрежения определяет количество раз, в которое будет увеличен размер ядра свертки. При этом элементы ядра удаляются друг от друга в заданное число раз, а образовавшиеся пустые значения заполняются нулями.
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 |
Пояснения
См. классы потомки.