Jump to content
Compvision.ru
Sign in to follow this  
BeS

Как caffe строит карту смежности для сверточных слоев?

Recommended Posts

Обычно в сверточных сетях, при стыковке двух сверточных слоев, перед применением очередной свертки происходит суммирование некоторых карт признаков с предыдущего слоя в соответствии с картой смежности...но при настройке топологии сети, понятие карты смежности не исопльзуется. И тут возник вопрос: а как в caffe реализуется стыковка карт признаков со сверточным слоем?

Share this post


Link to post
Share on other sites
1 hour ago, mrgloom said:

Там обычно 1 блок: conv->maxpool->relu

что такое карта смежности?

 

Для каждого сверточного слоя задается желаемой число "нейронов" (задается параметром num_outputs), пулинги и нормализации модифицируют выходы этих нейронов, но не изменяют их количество. На выходе сверточного слоя мы имеем набор карт признаков по числу нейронов.

Затем выход со сверточного слоя/relu/pooling подается на вход следующего сверточного слоя. При этом на вход каждого нейрона подается несколько карт признаков с прошлого слоя, к каждой из которых применяется соответствующая свертка, а затем результаты суммируются. И тут вроде бы принято исопльзовать не связь все-со-всеми, а выборочно стыковать свертки с разных слоев...и топология этих связей может задаваться матрицей смежности...но в caffe что-то я не нашел, где это может задаваться, там сверточные слои каким-то "стандартным" способом стыкуются.

Share this post


Link to post
Share on other sites
1 minute ago, mrgloom said:

Может быть за то, про что вы говорите отвечает параметр stride?

http://caffe.berkeleyvision.org/doxygen/classcaffe_1_1ConvolutionLayer.html

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

Share this post


Link to post
Share on other sites

http://stackoverflow.com/questions/27728531/convolutional-neural-networks-multiple-channels

То что результаты свёртки с одним ядром для всех каналов просто складываются это какой то хак или в этом есть какой то глубокий смысл?

А так же что если у нас будет RGB + depth, depth канал нужно будет как то нормировать \ "приводить к общему знаменателю" с остальными RGB каналами или так же ничего не меняется?

Share this post


Link to post
Share on other sites
5 minutes ago, mrgloom said:

То что результаты свёртки с одним ядром для всех каналов просто складываются это какой то хак или в этом есть какой то глубокий смысл?

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

 

8 minutes ago, mrgloom said:

А так же что если у нас будет RGB + depth, depth канал нужно будет как то нормировать \ "приводить к общему знаменателю" с остальными RGB каналами или так же ничего не меняется?

Есть 2 способа подать инпут: 

1) Нормировать каналы путем вычитания среднего, где среднее по каждому каналу считается независимо.

2) Вообще никак не нормировать входные данные.

Впринципе оба варианта имеют право на жизнь, тем более, что сейчас в основном все тренируются с Batch Normalization, которая учится автоматом нормализовать данные.

Share this post


Link to post
Share on other sites

Я как то собирал на cpp сетку для прямого прохода по кафешной сетке, вроде результаты похожие.

MyCNN.rar

Может на ней проще будет разобраться, а может кто чего улучшит :)

Создавалка bin файлов.

main.cpp

  • Like 1

Share this post


Link to post
Share on other sites

Я не имел ввиду что всего 1 ядро или 1 тип ядра, просто привёл пример для применения 1 ядра.

Как я понимаю на входе у нас изображение W x H x C (ширина, высота, кол-во каналов) далее у нас K ядер, а на выходе мы получаем блоб W1 x H1 x K (новая ширина, новая высота, кол-во ядер)

Просто мне показалось странным что результаты суммируются, единственный ли это возможный вариант?

И если еще абстрактнее посмотреть, почему у нас свёртки 2D ? расширяется ли это до ND?

Share this post


Link to post
Share on other sites

У нас свертки 3D. Они вроде планировали все в 4D но как то все вроде завяло за ненадобностью. Тензоры 4-х мерные, но операции в основном 3х мерные.

Не, посмотрел на код свертки, там 4D. Это вроде в полносвязном видел 3D максимум.

Share this post


Link to post
Share on other sites
21 minutes ago, Smorodov said:

У нас свертки 3D. Они вроде планировали все в 4D но как то все вроде завяло за ненадобностью. Тензоры 4-х мерные, но операции в основном 3х мерные.

Не, посмотрел на код свертки, там 4D. Это вроде в полносвязном видел 3D максимум.

А в чем смысл 4D сверток в caffe? Там ведь 4-я ось вдоль бача направлена...

 

26 minutes ago, mrgloom said:

Как я понимаю на входе у нас изображение W x H x C (ширина, высота, кол-во каналов) далее у нас K ядер, а на выходе мы получаем блоб W1 x H1 x K (новая ширина, новая высота, кол-во ядер)

Не совсем так: у нас есть сверточный слой с, например, 5 нейронами, где каждый нейрон генерирует один из выходных каналов. На вход пускай подается 3-х канальная картинка. Каждый входной канал соединен с каждым нейроном сверточного слоя и каждая свзяь имеет вес в виде ядра свертки, каждый нейрон на вход получает все входные каналы свернутые со своими ядрами и просто их суммирует. Т.о. получаем, что в нашем модельном примере всего будет 3*5 = 15 различных ядер свертки на сверточном слое.

 

40 minutes ago, Smorodov said:

Я как то собирал на cpp сетку для прямого прохода по кафешной сетке, вроде результаты похожие.

 

Любопытно, а там реализован проход только по сверточным слоям, или нелинейные активации, ректификация, пулинги и тд и тп тоже реализованы?)

Share this post


Link to post
Share on other sites

Все по минимуму, и максимально минималистично, мне собственно LeNet нужна была.

Share this post


Link to post
Share on other sites

>У нас свертки 3D

Можно сделать 1 3D свертку вместо k 2D ? Или имеется ввиду что то другое?

>Не совсем так: у нас есть сверточный слой с, например, 5 нейронами, где каждый нейрон генерирует один из выходных каналов

не понял что тут имеется ввиду под 5 нейронами.

 

Вот тут допустим на стр 7 Fig. 2

http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf

Изначально у нас одноканальная картинка 32x32 после первого conv слоя у нас 6 feature maps с размером 28x28, это значит что мы применили 6 кернелов?

Если бы у нас была картинка 3-х канальная, то на втором слое мы бы получили ту же размерность 6@28x28?

Почему если у нас картинка 3-х канальная кернелы не 3-х канальные?

И как тогда визуализация кернелов получается цветная?

KSH-filters.png

 

 

Share this post


Link to post
Share on other sites
2 hours ago, mrgloom said:

не понял что тут имеется ввиду под 5 нейронами.

Нейрон тут как и в классических сетях - просто сумматор. Только суммирует он не скаляры, а каналы, а вместо скалярных весов у него 2D свертки.

3 hours ago, mrgloom said:

Если бы у нас была картинка 3-х канальная, то на втором слое мы бы получили ту же размерность 6@28x28?

 

Да, размер выхода сверточного слоя не зависит от числа входных каналов.

 

3 hours ago, mrgloom said:

Почему если у нас картинка 3-х канальная кернелы не 3-х канальные?

 

Зависит от интерпретации. Можно сказать, что мы каждый канал сворачиваем двумерной сверткой, а потом получаем карту признаков, пописксельно суммируя получившиеся свертки, а можно говорить, что мы стопку каналов сворачиваем с 3D объемом.

 

3 hours ago, mrgloom said:

И как тогда визуализация кернелов получается цветная?

У вас картинка не полная, должно быть 96 цветных сверток. Это первый слой AlexNet'а, у него на вход приходит RGB а на выходе 96 карт признаков. Поэтому получаем 96 3D сверток, или 3*96 = 288 2D сверток.

3 hours ago, mrgloom said:

Можно сделать 1 3D свертку вместо k 2D ? Или имеется ввиду что то другое?

Да. Это и имеется в виду. 

Share this post


Link to post
Share on other sites

Тут вот довольно понятно написано.

http://cs231n.github.io/convolutional-networks/

Как я понял, всё таки они оперируют фильтрами\кернелами  WxHx3, только непонятно почему 1 фильтр по трём каналам учит примерно одно и тоже(в следствии чего получается фильтр аля gabor filter), и получаются не различные веса(например как у разных фильтров)? Хотя может так кажется ? т.к. там где цветные блобы, блобы разного цвета находятся не в одном и том же месте.

weights.jpeg

И мне кажется неправильно называть это 3D convolution, а более корректно Multi-channel convolution.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×