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

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

Recommended Posts

Всем привет. 

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

Изменено пользователем BeS

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


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

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

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

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

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

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

Изменено пользователем Smorodov

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


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

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

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

 

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

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

 

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

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

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


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

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

 

    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 все с полтычка завелось.

Изменено пользователем Smorodov

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


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

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

 

    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, на них тычков требуется немного больше :-) 

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

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


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

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

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

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


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

Вот тут есть пример который можно взять за основу:

https://github.com/BVLC/caffe/tree/master/examples/cpp_classification

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


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

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

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

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

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


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

по поводу "быстрая тренировка"  имеется ввиду, что чтение 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

 

Изменено пользователем mrgloom
  • Like 1

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


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

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

 

Изменено пользователем Smorodov

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


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

по поводу "быстрая тренировка"  имеется ввиду, что чтение 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

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


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

А кто-то имплементировал эту статью: http://arxiv.org/pdf/1312.6120.pdf ? И вообще кто какие методы использует для выбора начального приближения?

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


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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

 

Изменено пользователем Smorodov

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


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

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

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


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

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

Изменено пользователем Smorodov

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


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

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

 

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

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


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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×