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

Работа со сверточными сетями используя связку caffe + opencv

Recommended Posts

Всем привет. 

Дошли тут у меня руки наконец плотно заняться Deep Learning. Для тестов выбрал фреймворк caffe, как один из самых популярных и просто интегрирующихся с opencv. И тут сразу возникла непонятная проблема: выбрал я топологию сети (нечто похожее на LeNet), составил обучающую/тренировочную выборки(выборка тренировочная правда не сбалансирована, но вряд ли это является причиной наблдаемого поведения) и начал тренировать методом стохастического градиентного спуска. Первое подозрительное поведение: сетка буквально за 100-1000 итераций скатывается в некое состояние равновесия с не слишком высоким detection rate и сидит в нем до конца обучения (даже после >1000000 итераций картина особо не меняется). Ну ок, решил что у меня офигенная архитектура сети и все так быстро учится...заинтегрировал это в opencv приложение и тут вылезло второе подозрительное поведение: на любые входные данные сеть генерирует один и тотже отклик...если брать сетки с разных эпох, то картина меняется численно но качественно всегда наблюдаю одно и тоже поведение. Кто-то сталкивался с подобными проблемами и возможно знает в чем может быть причина? Заранее спасибо.

Edited by BeS

Share this post


Link to post
Share on other sites

Сталкивался с подобным когда убрал вычитание среднего (так было нужно по программе), а скорость обучения не уменьшил, хотя и надо было.

То есть, возможно, проблема в слишком большой скорости обучения.

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

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

ЗЫ: А что DIGITS не используете?  Там это все легче контролировать.

Edited by Smorodov

Share this post


Link to post
Share on other sites

То есть, возможно, проблема в слишком большой скорости обучения.

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

 

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

Вот на это большие подозрения. Насколько я понимаю, что задавая тип и std для weight_filter он генерит все свертки на текущем слое одинаковыми...caffe как-нибудь умеет рандомайзером заполнять веса, или для этого надо лезть в код библиотеки и фиксить?

 

ЗЫ: А что DIGITS не используете?  Там это все легче контролировать.

Я в нем замучался фиксить депенденси (что-то многовато ему нужно python-пакетов для работы), а потом он у меня наотрез отказался видеть caffe (брал кастомную NVIDIA версию). В итоге плюнул и собрал мейнстримную версию, с ней тоже проблем хватает (типа тех, когда модельки полугодовалой давности не совместимы по формату с новой версией caffe)

Share this post


Link to post
Share on other sites

В скрипте конфигурации метод заполнения задается строчками типа:

 

    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }

По поводу DIGITS, там же есть скрипт, который ставит все зависимости и саму DIGITS.  (install.sh если память не изменяет).

Я ставил вот с этого архива в последний раз: https://cloud.mail.ru/public/2dHR/ziTLnYN7U (отсюда https://developer.nvidia.com/digits )

Инструкция по установке: https://github.com/NVIDIA/DIGITS/blob/digits-2.0/docs/WebInstall.md

У меня под Ubuntu 14.04 x64 все с полтычка завелось.

Edited by Smorodov

Share this post


Link to post
Share on other sites

В скрипте конфигурации метод заполнения задается строчками типа:

 

    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }

По поводу DIGITS, там же есть скрипт, который ставит все зависимости и саму DIGITS.  (install.sh если память не изменяет).

Я ставил вот с этого архива в последний раз: https://cloud.mail.ru/public/2dHR/ziTLnYN7U (отсюда https://developer.nvidia.com/digits )

Инструкция по установке: https://github.com/NVIDIA/DIGITS/blob/digits-2.0/docs/WebInstall.md

У меня под Ubuntu 14.04 x64 все с полтычка завелось.

Если в protobuf'конфиге указать weight_filter без параметров, то, если верить документации, он инитит веса дефолтным значением, а не рандомом. По хорошему вообще иметь бы возможность ручками задавать начальные свертки, а не только выбирать закон их генерации из заданных, но похоже придется руками в код лезть :(

А проблема с DIGITS у меня в том, что я пользуюсь нестабильными релизами Ubuntu, на них тычков требуется немного больше :-) 

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

Share this post


Link to post
Share on other sites

когда сеть перестает учиться, можно попробовать уменьшить learning rate.

а что с opencv разве интеграция хорошая? ведь нужно конвертить датасет в промежуточное представление типа lmdb и т.д. т.е. нельзя сразу подавать на вход картинку или вектор картинок.

Share this post


Link to post
Share on other sites

когда сеть перестает учиться, можно попробовать уменьшить learning rate.

а что с opencv разве интеграция хорошая? ведь нужно конвертить датасет в промежуточное представление типа lmdb и т.д. т.е. нельзя сразу подавать на вход картинку или вектор картинок.

LMDB нужен только для быстрой тренировки. А в opencv запихивается с минимальной перепаковкой данных в сотню строк кода. Для POC подходит, а в продакшен все равно никто за собой не будет таскать такие зависимости, как caffe ;-)

Share this post


Link to post
Share on other sites

по поводу "быстрая тренировка"  имеется ввиду, что чтение c LMDB быстрее? точнее быстрее чем что?

Это оптимальный формат для хранения сотен тысяч картинок? (т.к. например в одной папке на NTFS их хранить не очень хорошо, т.к. всё начинает тормозить)

Но всё равно я так понимаю чтобы в него законвертить всё равно нужно в системе хранить картинки.

И я не понимаю почему нельзя просто брать картинки из папки?

хотя тут пишут что вроде можно: http://caffe.berkeleyvision.org/tutorial/layers.html

Data can come from efficient databases (LevelDB or LMDB), directly from memory, or, when efficiency is not critical, from files on disk in HDF5 or common image formats.

 

Опять же opencv Mat надо конвертить в caffe blob

 

p.s. или речь про хорошую интеграцию была про это http://docs.opencv.org/master/d5/de7/tutorial_dnn_googlenet.html#gsc.tab=0

 

Edited by mrgloom
  • Like 1

Share this post


Link to post
Share on other sites

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

 

Edited by Smorodov

Share this post


Link to post
Share on other sites

по поводу "быстрая тренировка"  имеется ввиду, что чтение c LMDB быстрее? точнее быстрее чем что?

Это оптимальный формат для хранения сотен тысяч картинок? (т.к. например в одной папке на NTFS их хранить не очень хорошо, т.к. всё начинает тормозить)

Но всё равно я так понимаю чтобы в него законвертить всё равно нужно в системе хранить картинки.

И я не понимаю почему нельзя просто брать картинки из папки?

хотя тут пишут что вроде можно: http://caffe.berkeleyvision.org/tutorial/layers.html

LMDB - это спец.формат баз данных для быстрого к ним доступа (можно хранить не только картинки). В caffe можно и просто картинки скармливать, но лично у меня скорость тренировки при использовании LMDB увеличивается ~10 раз (использую обычный HDD + ext3 файловую систему). 

 

Опять же opencv Mat надо конвертить в caffe blob

 

p.s. или речь про хорошую интеграцию была про это http://docs.opencv.org/master/d5/de7/tutorial_dnn_googlenet.html#gsc.tab=0

Блоб можно создать на тойже памяти. что и cv::Mat

Share this post


Link to post
Share on other sites

Я с нуля обучаю сеть, с инициализацией значениями со случайным распределением.

Вроде как хватает.

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

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

качестве начального приближения. 

Share this post


Link to post
Share on other sites

Я с нуля обучаю сеть, с инициализацией значениями со случайным распределением.

Вроде как хватает.

Ну сойтись куда-то оно скорей всего сойдется и при рандоме. Но т.к. мы CNN "сходим" к локальным, а не глобальным максимумам, то за счет "правильного" начального значения теоретически можно в разы ускорить сходимость модели. А то по 15M итераций обучения проводить не слишком круто :-) По крйней мере это должно быть не так напряжно для железа, как использование всяких Batch Normalization техник.

Share this post


Link to post
Share on other sites

Ну для новой задачи начальные приближения придумывать дело не благодарное (Как-то это не вписывается BigData философию).

К тому-же глобальные минимумы не всегда очевидны, как и собственные значения.

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

У меня с нуля сетка учится на 6M парах 30 эпох 5 дней на GTX-670, на GTX-970 в 4 раза быстрее.

А начальные слои да, можно копировать сеть в качестве начального приближения и доучивать на новых данных, будет намного быстрее. (или fine-tuning, как в CAFFE это называется, использовать для подгонки архитектуры).

 

Edited by Smorodov

Share this post


Link to post
Share on other sites

А кто-то пробовал подружить DIGITS с мейнстримным caffe? А то Nvidia похоже положила на развитие своего форка и не ребэйзит новые фичи из апстрима :-(

Share this post


Link to post
Share on other sites

Да вроде ветке "caffe-0.14" достаточно новые обновления. Уж не знаю насколько они соответствуют последним изменениям в мейнстримном caffe, но видно что работа идет. Я caffe оттуда беру. Правда, насколько помню, там надо будет заткнуть проверяльщик версий CAFFE в DIGITS, а то он вопить начинает.

Edited by Smorodov

Share this post


Link to post
Share on other sites

Оп, действительно, вроде бы все необходимые мне фичи в этом бранче имеются. А я следовал инструкции по установке DIGITS;а и юзал старую 0.12 версию.

 

з.ы. а DIGITS умеет делать деконволюцию и показывать, на каких фичах классификатор срабатывает?

Share this post


Link to post
Share on other sites

Не думаю что DIGITS умеет, но несложно самому сделать, CAFFE-то умеет.

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.

×