Арифметика сверточных слоев. Вычисляем размерность изображения с учетом stride, padding и dilation. арифметика.. арифметика. вычисление формул.. арифметика. вычисление формул. искусственный интеллект.. арифметика. вычисление формул. искусственный интеллект. Лайфхаки для гиков.. арифметика. вычисление формул. искусственный интеллект. Лайфхаки для гиков. математика.. арифметика. вычисление формул. искусственный интеллект. Лайфхаки для гиков. математика. Машинное обучение.. арифметика. вычисление формул. искусственный интеллект. Лайфхаки для гиков. математика. Машинное обучение. нейронные сети.. арифметика. вычисление формул. искусственный интеллект. Лайфхаки для гиков. математика. Машинное обучение. нейронные сети. Программирование.. арифметика. вычисление формул. искусственный интеллект. Лайфхаки для гиков. математика. Машинное обучение. нейронные сети. Программирование. свертка.. арифметика. вычисление формул. искусственный интеллект. Лайфхаки для гиков. математика. Машинное обучение. нейронные сети. Программирование. свертка. сверточные сети.. арифметика. вычисление формул. искусственный интеллект. Лайфхаки для гиков. математика. Машинное обучение. нейронные сети. Программирование. свертка. сверточные сети. сверточный слой.. арифметика. вычисление формул. искусственный интеллект. Лайфхаки для гиков. математика. Машинное обучение. нейронные сети. Программирование. свертка. сверточные сети. сверточный слой. туториал.. арифметика. вычисление формул. искусственный интеллект. Лайфхаки для гиков. математика. Машинное обучение. нейронные сети. Программирование. свертка. сверточные сети. сверточный слой. туториал. формулы.

Введение

Одна из проблем при проектировании сверточных сетей (CNN) – несоответствие размеров тензоров. Неправильно заданные padding, stride или dilation могут замедлить разработку модели.

Этот туториал – шпаргалка по формулам расчета размерности преобразованного изображения. Мы разберем, как каждый параметр свертки влияет на ширину и высоту выходного тензора. Материал будет полезен как новичкам, так и опытным разработчикам, желающим освежить ключевые формулы.

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

Пропустим вступление про то, что такое сверточный слой (подробнее можно посмотреть здесь). Скажем лишь, что это такой слой, который преобразует входное изображение, выделяя некоторые локальные свойства. Выделение тех или иных свойств зависит от ядра свертки. Ядро свертки – это тензор, который последовательно накладывается на разные участки входного изображения. На выходе, после применения ядра мы получаем новое преобразованное изображение. Чуть более формальней, свертка – математическая операция, которая по двум входным последовательностям выдает третью последовательность, которая показывает влияние этих двух последовательностей друг на друга.

Рассмотрим двумерное изображение Iin mathbb{R}^{htimes w}, то есть матрицу размерности htimes w, где h высота в пикселях, а w – ширина. Ядро обозначим через Finmathbb{R}^{ ktimes k}. Будем предполагать, что k меньше размера изображения, чаще всего k=3 или k=5. Тогда операцию свертки можно записать как

[I*F](x,y)=sum_{i=0}^{k-1} sum_{j=0}^{k-1} I(x+i,y+j)cdot F(i,j),

где xin{0,dots,h-k},yin{0,dots,w-k}. То есть для фиксированной пары пикселей (x, y)мы проходимся по квадрату, двигаясь при помощи индексов i, j. Если начинать нумерацию с нуля, то последняя позиция преобразованного изображения будет h-k, то есть мы возьмем последний пиксель I(h-1,w-1)исходного изображения (граница изображения) и дальше уже двигаться не будем, поскольку изображение закончилось. Пиксели изображения I мы взвешиваем при помощи ядра F и суммируем результат. Схематично это выглядит следующим образом.

Вычисление свертки с ядром 3 на 3. Исходное изображение имеет размерность 5 на 5, а выходное 3 на 3.

Вычисление свертки с ядром 3 на 3. Исходное изображение имеет размерность 5 на 5, а выходное 3 на 3.

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

В случае, когда изображение состоит из c каналов, то есть имеется тензор Iin mathbb{R}^{ctimes htimes w}, и мы хотим получить изображение из m каналов, необходимо использовать совокупность ядер F={F_uinmathbb{R}^{ctimes ktimes k}}_{u=0}^{m-1}.

[I*F](u,x,y)=sum_{v=0}^{c-1}sum_{i=0}^{k-1} sum_{j=0}^{k-1} I(v,x+i,y+j)cdot F(u,v,i,j)

То есть, для каждого нового канала у нас отдельное ядро, которое в свою очередь применяется ко всем каналам исходного изображения. Количество каналов в ядре должно совпадать с количеством каналов в исходном изображении. На картинке ниже к изображению 5 на 5 с тремя каналами применяется два ядра 3 на 3 с тремя каналами и получается изображение 3 на 3 с двумя каналами.

Операция свертки для трех канального изображения с ядром 3 на 3. Выходное изображение имеет 2 канала.

Операция свертки для трех канального изображения с ядром 3 на 3. Выходное изображение имеет 2 канала.

С учетом смещения (bias) B(u)inmathbb{R}^{m} мы получим финальную формулу

[I*F](u,x,y)=sum_{v=0}^{c-1}sum_{i=0}^{k-1} sum_{j=0}^{k-1} I(v,x+i,y+j)cdot F(u,v,i,j) + B(u)

Давайте для удобства переобозначим входное количество каналов c=C_{in} и выходное m=C_{out}. Тогда мы получим нашу первую полезную формулу – количество обучаемых параметров в одной свертки, которое равно C_{out}times C_{in}times ktimes k + C_{out}. Мы должны взять C_{out} ядер, каждое размера C_{in}times ktimes k, а затем прибавить вектор смещение, размерность которого есть выходное число каналов C_{out}.

Пример: преобразуем изображение с 3-х каналов до 64, тогда количество параметров будет равно 64times 3times 5times 5+64=4864.

Вычисление размера изображения без параметров

Давайте теперь разберем, как изменится размер изображения если применить к нему операцию свертки. Для начала рассмотрим самый простой случай, когда применяется обычное ядро размера ktimes k. Также для упрощения мы рассмотрим только движение ядра по горизонтали, по вертикали будет тоже самое, все формулы останутся верны.

Сперва, мы ставим наше ядро в левый верхний угол – это стартовая позиция. Затем смещаем ядро до тех пор, пока оно не достигнет правой границы изображения. Дальше двигать ядро мы не можем (пока что). Соответственно, если мы стартовали с позиции i=1 (левый верхний угол), то конкретно в данном примере первый пиксель ядра встанет на позицию i=7.

Начальня и конечная позиции ядра 3 на 3 для изображения 9 на 9.

Начальня и конечная позиции ядра 3 на 3 для изображения 9 на 9.

Именно семь позиций мы можем занять в случае ядра 3times 3 для изображения 9times 9. Не сложно увидеть закономерность. Всего позиций которые мы сможем занять не должно превышать ширину исходного изображения w_{old}, то есть i+k-1leq w_{old}. То есть если мы на позиции i, то дальше может поместиться только k-1 пиксель. Откуда можно получить равенство i_{max}=w_{old}-k+1, поскольку нас интересует максимально возможное число позиций. Максимальная позиция i_{max} и будет новая ширина w_{new} нашего преобразованного изображения.

Stride (шаг, смещение)

Перейдем к вычислению размера изображений с применением некоторых параметров свертки. Сперва разберем случай страйда (шаг). В классическом случае ядро шагает на каждый следующий пиксель, то есть по умолчанию s=1. Если же мы хотим вычислять признаки не на каждом шаге, а через пиксель, то есть позиция ядра будет скакать на два пикселя, то страйд необходимо задать равным двум, s=2.

Страйд равный двум.

Страйд равный двум.

Рассмотрим опять наш случай с изображением 9times 9 и возьмем s=6. Тогда, ядро сможет прыгнуть только один раз, поскольку тут же достигнет правой границы исходного изображения. Наш индекс позиции ядра будет меняться как i=1,1+s,1+2s,.... При s=6 индексы будут i=1,7,13,.... Так как 13, уже за пределами нашего изображения, то этот шаг уже не выполняется.

Страйд равный шести.

Страйд равный шести.

Из наблюдений выше можно понять, что общая формула для позиции ядра будет равна i=1+bs, где b=0,1,...,b_{max} некоторый множитель, который отвечает за то, сколько раз мы можем прыгнуть. Наша задача как раз определить како�� b_{max} максимально возможен при размере изображения w_{old}.

Мы уже знаем, что должно выполняться условие i+k-1leq w_{old}. Давайте подставим наше выражение для i:

1+bs+k-1leq W_{old} Rightarrow b_{max}=bigglfloorfrac{W_{old}-k}{s}biggrfloor

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

Поскольку множитель b менялся от нуля до b_{max}, то всего допустимых значений будет b_{max}+1. Финальная формула для вычисления размера преобразованного изображения с учетом страйда равна

w_{new}=bigglfloorfrac{W_{old}-k}{s}biggrfloor +1

Padding (дополнение, отступ)

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

В классической свертки по умолчанию паддинг равен нулю, p=0. По факту мы просто добавляем p пикселей с каждой стороны изображения. Таким образом, всего добавляется 2p пикселей, p пикселей слева и p пикселей справа. Аналогично, пиксели добавляются снизу и сверху. Конкретные значения добавленных пикселей не влияют на размер, обычно они просто равны нулю.

Паддинг равный двум. Стартовая позиция ядра находится за пределами изображения.

Паддинг равный двум. Стартовая позиция ядра находится за пределами изображения.

Итак, раз мы добавляем суммарно 2p пикселей, то размер исходного изображения изменится на w_{old}+2p. Откуда, сразу получим размер нового изображения с учетом паддинга

w_{new}=bigglfloorfrac{w_{old}+2p-k}{s}biggrfloor+1

Dilation (дилатация, растяжение)

Последний параметр свертки который мы разберем называется дилатацией или растяжением (от англ. dilation). Дилатация позволяет растянуть ядро, то есть сделать его менее плотным. Например, когда мы не хотим смотреть только соседние пиксели, а хотим охватить более широкую область вокруг данных пикселей. По умолчанию, все пиксели ядра стоят рядом с друг другом, то есть дилатация равна 1, d=1. На рисунке ниже, приведен пример с дилатацией равной трем, то есть между соседними пикселями ядра появился зазор в два пикселя.

Дилатация равная трем.

Дилатация равная трем.

Здесь нам понадобится новый термин – эффективный размер ядра, а именно размер области на изображении, которую покрывает ядро. Давайте найдем формулу для эффективного размера ядра.

Рассмотрим конкретный пример, когда ядро имеет размер 3times 3 и дилатация равна 3. Это означает, что между соседними пикселями ядра есть 2 пропуска. Обобщая, между соседними пикселями всегда d-1 пропуск. Это следует просто из определения данного параметра.

Далее, давайте посмотрим сколько пикселей занимает ядро с дилатацией. Само ядро состоит из k пикселей по горизонтали. В данном случае 3. А теперь посмотрим сколько у нас пропусков в ядре помещается. При ядре 3times 3, таких пропусков будет два, при ядре 5times 5 таких пропусков будет 4, и так далее. Поэтому, для ядра ktimes k, всего k-1 пропуск.

Итого, у нас есть k пикселей ядра и k-1 пропуск по d-1 пикселю. То есть эффективный размер ядра равен

k_{eff}=k+(k-1)(d-1)=k+kd-k-d+1=(k-1)d+1

Возвращаясь к формуле со страйдом и паддингом, 1+bs+k-1leq w_{old}+2p, заменим в ней размер ядра k на эффективный размер ядра k_{eff}. Тогда, получим 1+bs+(k-1)dleq w_{old}+2p.

Финальная формула со всеми тремя параметрами имеет вид

w_{new}=bigglfloorfrac{w_{old}+2p-(k-1)d-1}{s}biggrfloor+1

Как я говорил ранее, все те же самые вычисления верны и для движения ядра по вертикали, поэтому высота в пикселях будет вычисляться как

h_{new}=bigglfloorfrac{h_{old}+2p-(k-1)d-1}{s}biggrfloor+1

Заключение

Таким образом, мы рассмотрели с вами арифметику сверточных слоев и научились вычислять размер изображения ��осле применения операции свертки с учетом таких параметров, как страйд, паддинг и дилатация. Данные формулы будут вам полезны при композиции нескольких сверточных слоев, когда необходимо уравнивать размерности тензоров.

Еще больше интересного в моем тг канале, где я пишу про ИИ и не только.

Автор: kirillzx

Источник

Rambler's Top100