Это вторая часть моей серии сообщений в блоге о сверточных нейронных сетях. Вот следующие части этой серии:

Обязательным условием здесь является знание свертки матриц. Я кратко объяснил свертку матриц в первом разделе первой части этой серии. Не пугайтесь слова свертка и количества матриц, которые вы увидите. Я использовал звездочку для обозначения оператора свертки, а не умножения матриц. Кстати, я считаю, что свертка матриц проще умножения матриц.

1. Набивка

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

1.1 Мотивация

В первой части мы видели, что если вы возьмете изображение 6 на 6 и свернете его с помощью фильтра 3 на 3, вы получите результат 4 на 4 (с матрицей 4 на 4), и это потому, что количество возможных позиций с фильтром 3 на 3 есть только, вроде как, 4 на 4 возможных положения, чтобы фильтр 3 на 3 поместился в вашу матрицу 6 на 6. И математика показывает, что если у вас есть изображение n на n и свернуть его с помощью f на f фильтр, то размер вывода будет (n - f +1) на (n - f +1). Таким образом, для изображения 6 на 6 и фильтра 3 на 3 слева размер выходного изображения будет (6–3 + 1) на (6–3 + 1), что упрощается до вывода 4 на 4. Вы можете увидеть все это в обобщенном виде на рис. 1.

Когда вы сворачиваете фильтр к изображению, возникают две проблемы:

1. Сжимающийся результат: если каждый раз, когда вы применяете сверточный оператор, ваше изображение сжимается, так что вы переходите с 6 на 6 до 4 на 4, тогда вы можете только сделайте это несколько раз, прежде чем ваше изображение станет действительно маленьким, возможно, оно уменьшится до 1 на 1 или что-то в этом роде, поэтому, возможно, вы не хотите, чтобы ваше изображение сжималось каждый раз, когда вы обнаруживаете края или устанавливаете на нем другие функции.

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

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

то, что вы можете сделать, это перед применением сверточной операции вы можете заполнить изображение одной дополнительной рамкой, как показано на рис. 3, с дополнительной рамкой в ​​один пиксель со всех сторон края, как показано на левом изображении (в этом случае иногда может потребоваться более одной границы). Итак, если вы это сделаете, то вместо изображения 6 на 6 вы теперь добавили его к изображению 8 на 8, и если вы свернете изображение 8 на 8 с изображением 3 на 3, вы теперь получите изображение 6 на 6. выход. Таким образом, вам удалось сохранить исходный размер ввода 6 на 6 (для тех, кто знаком с концепцией уровня глубокого обучения: вы видите, что это особенно полезно, потому что, когда вы создаете действительно глубокие нейронные сети, вы не хотите, чтобы изображение сжималось на каждом этапе, потому что, если у вас есть, может быть, 100 слоев глубокой сети, тогда оно будет немного сжиматься на каждом слое, а после сотни слоев вы получите очень маленькое изображение ) .

По соглашению, когда вы вводите заполнитель, вы заполняете его нулями, а p - это величина заполнения (в данном случае p = 1, потому что мы заполняем все вокруг дополнительной границей одного пикселя), то на выходе будет (n + 2p - f +1) на (n + 2p - f +1). Итак, в этом случае мы имеем, что размер вывода при p = 1 равен (6 + 2– 3 + 1) на (6 + 2 - 3 + 1), что упрощается до 6 на 6 изображение. Таким образом, вы получаете изображение 6 на 6, которое сохраняет размер исходного изображения. См. GIF 1.

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

1.2 Действительная и такая же свертка

Что касается заполнения, есть два варианта: допустимая свертка и такая же свертка.

  • Допустимая свертка это в основном означает отсутствие заполнения (p = 0), поэтому в этом случае у вас может быть n x n изображений, свернутых с f фильтром f, и это даст вам n минус f плюс один на n минус f плюс одномерный результат.

  • Такая же свертка означает, что при заполнении размер вывода совпадает с размером ввода. В основном вы заполняете, скажем, изображение 6 на 6 таким образом, что на выходе также должно быть изображение 6 на 6. В общем, n + 2 p - f + 1 = n,, поскольку размер входного изображения = выход размер изображения. В этом случае ниже приводится формула для определения нужного количества колодок.

2. Шагающий

Говоря простым языком, шаг - это шаг, который вы делаете при ходьбе или беге.

Если вы хотите свернуть, скажем, изображение a7 на 7 с помощью этого фильтра 3 на 3 с шагом два, это означает, что вы берете произведение элемента Y, как обычно, в этой верхней левой области 3 на 3, а затем умножаете и складываете ( что дает вам 91 как первый элемент вывода). См. Рисунок 4.

Но тогда вместо того, чтобы переступать через синий прямоугольник на один шаг, мы собираемся перешагнуть на два шага. Итак, мы собираемся сделать так, чтобы он перепрыгивал через два шага, как в GIF 2. Обратите внимание, как синий прямоугольник перепрыгивает через два шага. Затем вы выполняете обычное произведение элемента Y (суммируя получается 100), и теперь мы собираемся повторить то же самое, заставив синюю рамку перепрыгнуть на два шага (суммирование дает 83).

Теперь, когда вы переходите к следующей строке, вы снова фактически делаете два шага вместо одного (см. GIF 3). Обратите внимание, как синий прямоугольник переместился на 2 шага ниже. Повторение того же процесса дает 69, 91, 127. И затем для последней строки 44, 72 и 74.

И если вы используете заполнение p и шаг s. В этом примере s = 2 , тогда вы получите результат n + 2 - f, и теперь поскольку вы выполняете S шагов времени, вы делаете только один шаг времени, теперь вы делите на S плюс один и затем можете применить то же самое.

А теперь еще одна деталь: что, если эта дробь (n + 2 p - f) / s не является целым числом? В этом случае мы округлим дробь в меньшую сторону (т. Е. Возьмем наименьшую дробь).

Что означает эта фракция (n + 2 p - f) / s? Это реализовано таким образом, что вы берете этот тип умножения синего прямоугольника только в том случае, если синий прямоугольник полностью содержится в изображении или изображение плюс дополнение и , если любое из этого синего поля какая-то его часть висит снаружи, и вы просто не выполняете эти вычисления. См. GIF 4 .

Спасибо за внимание, и если у вас есть отзывы / вопросы, напишите комментарий. Хлопайте и поделитесь, если вам понравилась манера, в которой я представил здесь идеи обивки и полосатой свертки. :)

ССЫЛКИ: