Распространенные заблуждения и личные мысли о свертке изображений

глубокое обучение
Распространенные заблуждения и личные мысли о свертке изображений

Это второй день моего участия в первом испытании обновлений 2022. Подробную информацию о мероприятии см.:Вызов первого обновления 2022 г.

Однажды я воспроизвел классическую сеть, чтобы обеспечить красоту кода, я хочу сохранить однуif-else, поэтому я хочу найти специальный модуль, который может выводить ввод без изменений. Но я не знаю, что за модуль имеет такую ​​функцию, поэтому спросил у группы друзей в группе обмена компьютерами.

我:pytorch里想让输入原封不动输出应该用什么模块呀
群友A:1*1的卷积核
我:万一我输入是多通道的呢
群友A:1*1*N呗
群友B:conv2d(input_ch, input_ch, 1),输入输出通道保持一致。但1*1有点类似全连接。

Увидев это, я начал смеяться — похоже, все, как и я, не очень хорошо понимают основы. Кроме того, когда я разговариваю с другими студентами о свертках, я также чувствую, что свертка особенно важна.1*1Свертка больше всего страдает от недопонимания. Поэтому сегодня я намерен организовать предыдущее мышление для ознакомления.

операция свертки

Сверточная нейронная сеть в основном используется для обработки данных изображения, поэтому мы сосредоточимся на этом фокусе наСвертка изображения. Поскольку я изучаю сигналы и системы, у меня более примитивное, рудиментарное, но и более точное понимание свертки. Операцию свертки для двух функций можно понимать как переворачивание и сдвиг одной из функций, а затем измерение перекрытия между ними. иВ сверточной нейронной сети слой свертки — это строго неправильное название, так называемая операция свертки на самом деле является операцией кросс-корреляции, а не свертки., г-н Ли Му указал на этот момент в «Практическом обучении глубокому обучению», и эта статья пока не будет указана.

Давайте посмотрим на определение двумерной свертки в «Практическом глубоком обучении»:

В операции двумерной кросс-корреляции окно свертки начинается с верхнего левого угла входного тензора и скользит слева направо и сверху вниз. Когда окно свертки перемещается в новую позицию, частичные тензоры, содержащиеся в окне, поэлементно умножаются на тензоры ядра свертки, а полученные тензоры суммируются для получения единого скалярного значения.Выходное значение тензора в этой позиции получается .

Untitled.png

Начнем с разговора выше.

Первоначальный ответ друга группы А1*1的卷积核, что на первый взгляд является правильным ответом, ведь для одноканального входа1*1Ядро свертки действительно гарантированно не изменит ввод. Однако я быстро спросил о сцене многоканального ввода, и мой друг по группе ответил:1*1*N, другой друг группы дал код и более точное объяснение, но на самом деле это неправильно.

Для многоканальной свертки количество слоев ядра свертки должно быть таким же, как количество входных слоев, чтобы можно было выполнить операцию взаимной корреляции, но если имеется только одно ядро ​​свертки, количество выходных каналов будет только1, если вы используете1*1*NЯдро свертки (фильтр) эквивалентно входуNСоответственно добавляются все каналы, и в итоге после суммирования получается одноканальная матрица, причем это повреждение необратимо, и мы не можем по нему восстановить предвходную матрицу.NОригинальный внешний вид каждого канала.

Untitled1.png

Взаимосвязь между сверточным слоем и количеством каналов

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

Во-первых, давайте посмотрим на состав сверточного слоя, как показано на рисунке:

Untitled2.png

Мы называем часть, соответствующую промежуточной функции ядра, сверточным слоем. Слой свертки содержит один или несколько фильтров, и каждый фильтр имеет несколько слоев.Так называемое количество ядер свертки — это количество слоев, которые имеет каждый фильтр. На приведенном выше рисунке количество ядер свертки в каждом фильтре равно3, количество фильтров2,3и2Это также соответствует количеству входных каналов и количеству выходных каналов соответственно.

Возвращаясь к групповому сообщению, если количество входных и выходных каналов остается прежним, то1*1*N*NФильтр, но проблема в том, что этоNКак должны быть установлены соответствующие значения ядер свертки? Если все настроено одинаково, вы получитеNВход канала становитсяNИдентичный вывод заведомо неверен. Но я признаю, что еслиNВсе ядра свертки устанавливаются на разные значения, пока значения в фильтре могут формироватьN*NОбратимая матрица , тогда вход может быть обратно решен из вывода, но это совершенно другое. Короче говоря, невозможно использовать операцию свертки для вывода многоканального ввода как такового.

Какова связь между сверткой 1 * 1 и полносвязным слоем

Это еще одно неправильно понятое место, я видел, как не один человек чувствовал, что1*1Свертки — это, по сути, полностью связанные слои. Хотя это очень простой вопрос, он бессмысленен, но, поскольку он был написан здесь, я хотел бы, кстати, записать свои мысли.

1*1Хотя свертка и полносвязные слои не имеют ничего общего друг с другом, они все же имеют какое-то отношение друг к другу.Полносвязный слой может быть заменен специальным сверточным слоем., предполагая, что вход7*7*512, длина полносвязного слоя равна4096Вектор , если этот полносвязный слой заменить сверточным слоем, то в сверточном слое:

  • имеют4096фильтры
  • Каждый фильтр имеет512Этаж(512ядро свертки)
  • Размер каждого слоя7*7

Размерность этого выхода также1*1*4096, поэтому полносвязная операция может быть реализована с помощью сверточных слоев.