Перейти к содержимому
Compvision.ru
BeS

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

Recommended Posts

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 hour ago, mrgloom said:

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да было бы неплохо чтобы был некий визуализатор как что стыкуется.

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 minute ago, mrgloom said:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 minutes ago, mrgloom said:

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

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

 

8 minutes ago, mrgloom said:

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

MyCNN.rar

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

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

main.cpp

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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 сетку для прямого прохода по кафешной сетке, вроде результаты похожие.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

>У нас свертки 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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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 ? Или имеется ввиду что то другое?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

weights.jpeg

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×