От мелкого к глубокому: взаимосвязь сверточных слоев и транспонированных сверточных слоев в CNN

искусственный интеллект PyTorch Нейронные сети обеспечить регресс

Приветствую всех вОблако Tencent + сообщество, получить больше крупной технической практики Tencent по галантерее ~

Эта статья написанаforrestlinОпубликован вКолонка «Облако + сообщество»

Введение: Слой транспонирования свертки, также известный как слой деконволюции или слой дробной свертки, становится все более и более распространенным в недавно предложенных сверточных нейронных сетях, особенно в состязательных генеративных нейронных сетях (GAN).Транспонированный сверточный слой появляется в части повышающей дискретизации сеть генератора для восстановления приведенной размерности. Итак, какова связь и различие между транспонированным сверточным слоем и положительным сверточным слоем, и каков процесс реализации транспонированного сверточного слоя?Автор резюмирует эту статью на основе недавних предварительных исследовательских проектов.

1. Сверточные и полносвязные слои

До того, как была предложена CNN, искусственные нейронные сети, о которых мы упоминали, в большинстве случаев должны были быть нейронными сетями с прямой связью.Основное различие между ними заключается в том, что CNN использует сверточные слои, в то время как нейронные сети с прямой связью используют полностью связанные слои, в то время как разница между этими двумя слоями что полносвязный слой думает, что все узлы в предыдущем слое нужны для следующего слоя, который передается послойно путем умножения на матрицу весов, а слой свертки думает, что некоторые узлы в предыдущем слое находятся рядом с следующий слой.Слой фактически не нужен, поэтому предлагается концепция матрицы ядра свертки.Если размер ядра свертки равен nm, то это означает, что ядро ​​свертки считает, что каждый раз, когда узел предыдущего слоя отображается на узел следующего слоя, существует только nm узлов имеют смысл, и конкретный метод отображения будет обсуждаться в следующем разделе. На этом этапе некоторые новички думают, что полносвязный слой также может быть выполнен, если некоторые веса матрицы весов присвоены 0, это может быть достигнуто. Например, предположим, что при вычислении второго узла текущего слоя , считается первый узел предыдущего слоя, узлы мне не нужны, поэтому просто ставим w01=0. На самом деле да, слой свертки можно рассматривать как частный случай полносвязного слоя, Матрица ядра свертки — это весовая матрица, которую можно разложить в разреженный полносвязный слой, содержащий множество нулей.4 фото после 33 Ядро свертки генерирует весовую матрицу полносвязного слоя, расширенного ядром свертки, когда выходной размер равен 2*2.

img
Матрица весов полносвязного слоя, соответствующего ядру свертки

Как видите, размер матрицы выше равен 4.16, чем ядро ​​свертки 33 намного больше, поэтому первая причина использовать сверточный слой вместо полносвязного слоя заключается в том, что количество параметров может быть значительно уменьшено, а вторая причина заключается в том, что ядро ​​свертки фокусируется на отношениях между определенными соседними узлами. отношения между ними, изучение местных особенностей изображения, можно сказать, что это целенаправленное обучение, например, 3Ядро свертки 3 изучает отношения между узлами с взаимным расстоянием 2. Это сильно отличается от уровня полного соединения, который обрабатывает все узлы без разбора для обучения, что устраняет недостаток, заключающийся в том, что нейронная сеть с прямой связью не может изучить инвариантность смещения. Например, когда мы изучаем 4 в нейронной сети с прямой связьюКогда на изображении 4 есть горизонтальная складка, используйте 4 обучающие данные на следующем рисунке для обучения, тогда в конце будут скорректированы только веса четырех узлов 5, 6, 9 и a, а затем если в конце появляется следующий рисунок. Когда изображение используется в качестве теста, это приведет к тому, что сеть не сможет распознать, и, поскольку вес ядра свертки распределяется между разными узлами, эта проблема естественным образом преодолевается.

img
Свертка преодолевает трансляционную инвариантность

2. Процесс работы сверточного слоя

2.1 Простейшая свертка

Операция слоя свертки фактически заключается в применении к входным данным нескольких ядер свертки. Как показано на рисунке ниже, это простейшая операция, выполняемая ядром свертки. Без заполнения, без шага и синего квадрата внизу рассматривается в качестве входных данных. , заштрихованная часть равна 3Ядро свертки 3 (обычно ядро ​​свертки представляет собой квадрат, а длина стороны нечетная), когда ядро ​​свертки просматривается, оно умножается на вход, затем добавляется и, наконец, получает 2Вывод 2, соответствующий голубой области.

img
без заполнения, без свертки шага

Обычно слой сверточного слоя будет содержать несколько ядер свертки, которые представляют выходную глубину сверточного слоя, Например, на следующем рисунке показана архитектура глубокой сети, которую мы часто видим в документах, где первый слой — это сверточный слой + самый большой слой пула, независимо от максимального слоя пула, по крайней мере, мы можем дать понять, что размер ядра свертки равен 55. Количество ядер свертки равно 16, а размер вывода этого слоя равен 18.18.

img
Общие сверточные слои в документах

2.2 Свертка с дополнением

Из простейшей анимации свертки мы видим, что после операции свертки выход будет меньше, чем вход, но иногда мы хотим, чтобы размер вывода соответствовал входу, и для этой цели вводится отступ, а в чтобы сохранить размер ввода и вывода одинакового заполнения, мы будем называть его «одинаковым дополнением», пожалуйста, обратитесь к следующей анимации, размер ядра свертки составляет 3 * 3, заполнение равно 1, фактическая производительность заполнения находится на входе Окружающая область заполнена 0, а отступы — максимально возможное количество слоев, а верхний предел — размер ядра свертки -1, точно так же, как пунктирная область на рисунке ниже. размер отступа в статье не указан, и нам нужно вывести его самостоятельно, формулу вывода можно найти ниже.

img
Свертка с заполнением = 1

В зависимости от размера набивки мы можем разделить ее на три вида набивки:

  • одинаковое заполнение: добавлено заполнение, чтобы вывод и ввод были одного размера, например 3Ядро 3, тот же отступ = 1, 5Ядро 5, тот же отступ = 2.
  • full padding: padding = kernel size - 1
  • valid padding: padding = 0

2.3 Свертка с шагом больше 1

шаг - это размер шага, который указывает расстояние между двумя операциями свертки ядра свертки.По умолчанию 1. Размер шага двух упомянутых выше примеров равен 1, и следующие две анимации показывают случай, когда шаг равен 2. , соответственно Без отступов и с отступами. Обычно, когда шаг больше 1, мы называем это эквидистантной понижающей дискретизацией, потому что на выходе обязательно потеряется информация, а размер меньше, чем на входе.

img
Свертка без заполнения, шаг=2

img
Свертка с отступом = 1, шаг = 2

2.4 Связь между входным и выходным размером ядра свертки и ядром свертки

Выше мы упомянули, что заполнение обычно нужно вычислять самим, так как же нам его вычислить?Три параметра операции, размер ядра (F), заполнение (P) и шаг (S), если внимательные читатели посмотрите на анимацию , они обнаружат, что выходной размер можно рассчитать на основе входного размера и этих трех параметров. Формула выглядит следующим образом, здесь приведен только расчет ширины, а высота такая же.

W2=(W1−F+2P)÷S+1

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

img
странная свертка

3. Транспонировать сверточный слой

После разговора о сверточном слое, давайте посмотрим на другой сверточный слой с транспонированием слоев в CNN, который выполняет операции свертки.Иногда мы также называем его деконволюционным слоем, потому что его процесс является обратным обычной свертке, но это также просто обратная сторона размер, не обязательно содержание, поэтому некоторые люди не будут путать эти два понятия. Наиболее широко транспонированный сверточный слой используется для повышения дискретизации.Мы только что упомянули, что в обычной свертки, когда шаг больше 1, мы выполняем эквидистантную понижающую дискретизацию, что сделает выходной размер меньше, чем вход, и транспонированный сверточный слой Мы будем использовать свертка с шагом менее 1 для повышения дискретизации, чтобы увеличить размер вывода, поэтому слой транспонированной свертки также известен как слой дробной свертки. Можно сказать, что наиболее распространенным сценарием повышения частоты дискретизации является сеть генератора в GAN, как показано на рисунке ниже, хотя автор статьи использует conv, но поскольку размер его шага составляет 1/2, он представляет транспонированный слой свертки.

img
Пример транспонированной свертки

Чтобы понять транспонированный слой свертки, нам нужно понять, что называется инверсией нормальной свертки, что обычно трудно понять новичкам. Автор объяснит это лучше с помощью двух диаграмм. Первая диаграмма - это процесс нормальной свертки. ., вторая картинка - соответствующая ей транспонированная свертка.На первой картинке цифра 1 в большом квадрате участвует только в вычислении числа 1 в маленьком квадрате, то в транспонированной свертке 1 большого квадрата есть Также он может быть сгенерирован только 1 маленьким квадратом, что является обратным процессом.

img
без заполнения, без свертки шага

img
Транспонировать свертки.png

Как и в случае с обычным процессом свертки, ниже автор также по одной приводит соответствующие транспонированные свертки.

3.1 Транспонированная свертка, соответствующая свертке без заполнения без шага

График, использованный выше для объяснения обратного процесса транспонированной свертки, на самом деле является самой простой (без заполнения, без шага) свертки и соответствующей ей транспонированной свертки Вот ее анимация.

img
транспонирование свертки без заполнения, без шага

3.2 Транспонированная свертка свертки с дополнением

Если в положительной свёртке есть отступы, то в транспонированной свёртке отступов может и не быть.Формула расчета будет приведена ниже.Здесь сначала приводится соответствующее транспонированное изображение свертки 2.2.

img
транспонирование свертки с заполнением 1

3.3 Транспонированная свертка свертки с шагом более 1

Как упоминалось в начале этого раздела, свертка с шагом больше 1 выполняет понижающую дискретизацию, затем соответствующая транспонированная свертка повышает дискретизацию с шагом меньше 1, но будь то в pyTorch или TensorFlow, все параметры функции convTranspose являются целыми числами. , нельзя задать шаг в число с плавающей запятой меньше 1, тогда мы все равно будем передавать шаг положительной свертки в функцию convTranspose, а как это делает convTranspose, вы можете увидеть на анимации ниже, это не отступ в 2.3 Транспонированная свертка, соответствующая свертке, давайте не будем смотреть на транспонированный отступ в транспонированной свертке, который представляет собой пунктирную область вне анимации, и тогда мы обнаружим, что между каждыми двумя синими блоками вставляется белый блок, То есть, 0. Таким образом, каждый шаг ядра свертки эквивалентен перемещению только на 1/2 шага, поэтому мы можем сделать вывод, что шаг -1 0 необходимо вставить между каждыми двумя синими блоками.

img
транспонирование свертки с шагом 2

3.4 Связь преобразования между положительной сверткой и транспонированной сверткой

3.4.1 Заполнение транспонированной свертки

Из транспонированной свертки из трех приведенных выше примеров мы можем обнаружить, что если транспонированная свертка реализована с положительной сверткой, размер ядра свертки остается неизменным, а шаг является обратным шагу положительной свертки (просто мы вставляем 0 в симулировать дробное движение) и, наконец, как вычислить отступ транспонированной свертки, хотя если мы вызываем pyTorch или TensorFlow, нам не нужно им управлять, просто передать отступ положительной свертки, но понять, как это делает convTranspose это также помогает нам понять транспонированные свертки. Сказав так много, на самом деле, чтобы гарантировать, что транспонированная свертка является обратной положительной свертке, мы должны дополнить транспонированное заполнение.Мы используем PT для его представления.Формула расчета: PT=F−P− 1, где F — размер ядра положительной свертки, а P — заполнение положительной свертки.

3.4.2 Выходной размер транспонированной свертки

Это на самом деле очень легко вычислить, потому что все мы говорим об обратной транспонированной свертке, поэтому нам нужно только найти W1 при преобразовании в формуле, приведенной в 2.4, Формула выглядит следующим образом:

W1=(W2-1)×S-2P+F

Где S — шаг положительной свертки, P — заполнение положительной свертки, а F — длина стороны ядра положительной свертки.

3.4.3 Транспонированная свертка нечетной свертки

Можно сказать, что это самая сложная ситуация для понимания в транспонированной свертке.В 2.4 мы упоминали, что при делении на шаг мы можем не делить достаточно, чтобы округлить вниз, тогда мы будем неуверенны, когда будем запрашивать W1.Например, это график, приведенный в начале раздела 3. Мы надеемся увеличить график W / 4 до уровня W / 2. Это процесс транспонированной свертки. Сначала мы вычисляем положительный объем. Продукт, понижающая дискретизация от W /2 до W/4, k представляет собой длину стороны ядра, равную 3, s является обратной величиной шага 1/2, то есть 2, заполнение выводится как 1 в соответствии с формулой 2.4, поэтому формула расчета положительной свертки имеет вид : (W2−3+2)÷2+1=W4+12, а затем с округлением в меньшую сторону получается W4, что то же самое, что показано на рисунке, но если вычислить его в обратном порядке по формуле 3.4.2, то равно (W4 −1)×2−2+3=W2−1, это неопределенность нечетной транспонированной свертки, мы вернемся к анимации, приведенной в 2.4, и обнаружим, что мы не перевернули области заполнения на справа и снизу Операция продукта игнорируется, так как округляется в меньшую сторону, поэтому нам нужно добавить эту часть обратно при транспонировании свертки, поэтому в PyTorch функция convTranspose также имеет параметр output_padding, отвечающий за обработку этого, а TensorFlow также должен иметь соответствующий параметр, с которым автор не знаком, ниже приводится описание параметра в PyTorch, точно такое же, как и в ситуации, с которой мы столкнулись.

img
Параметр output_padding транспонированной свертки в PyTorch

Что касается значения output_padding, оно должно быть (W1-F+2P)%S, что должно быть равно 1 в упомянутом выше примере.

4. Резюме

В этой статье сначала представлена ​​связь и различие между сверточной нейронной сетью и традиционной нейронной сетью с прямой связью, а затем объясняется операция свертки посредством процесса свертки различных параметров и, наконец, представлена ​​транспонированная свертка, которая непонятна, когда вы только начинаете работать с ней. глубокое обучение. , приведена транспонированная свертка, соответствующая положительной свертке при различных параметрах, и, наконец, резюмирована формула, используемая в операции свертки. Я надеюсь, что приведенный выше анализ и объяснение автора могут быть полезны студентам, которые только начинают работать с CNN, а автор занимается разработкой iOS, а я только начинаю работать с CNN и глубоким обучением.

5. Справочная документация

Связанное Чтение [Ежедневная рекомендация курса] Машинное обучение в действии! Быстрый старт бизнеса в сфере онлайн-рекламы и знание CTR

Эта статья была разрешена автором для публикации в сообществе Tencent Cloud + Для получения дополнительных оригинальных текстов, пожалуйстанажмите

Найдите и подпишитесь на общедоступную учетную запись «Сообщество Yunjia», получите технические галантереи как можно скорее и ответьте на 1024 после подписки, чтобы отправить вам подарочный пакет технических курсов!

Огромный технический практический опыт, все вСообщество Юнцзя!