Отдам библиотеку в хорошие руки

    Давным давно, в 2008 году, когда я работал над своей диссертацией меня заинтересовала тема применения сверточных нейронных сетей для задач распознавания изображений. На тот момент они еще не были так популярны как сейчас и попытка найти готовые библиотеки ни к чему не привела — нашлась только реализация на Lush (языке созданном автором сверточных сетей, Яном ЛеКуном). Тогда я подумал, что можно было бы их реализовать на Матлабе используя Neural Network Toolbox. Но столкнулся с невозможностью реализации разделяемых весов в рамках этого тулбокса. И тогда было принято решение написать собственную реализацию.

    Первоначально она была сделана на чистом матлабе. Чуть позже я реализовал функции прямого и обратного распространения на CUDA. Эта версия лежит на Matlabcentral и до сих пор имеет по 162 закачки в месяц.
    Это, кстати, была первая в интернете версия сверточных сетей на CUDA.
    image

    Используя эту реализацию я написал пост Применение нейросетей в распознавании изображений.

    Поняв что интерес к теме очень большой, я решил переписать библиотеку и сделать ее полностью на C++/CUDA оставив поддержку Матлаба как фронтенда. Так появилась CudaCnn. Эту разработку я уже, по сути, вел в свободное от работы время. Позже я поменял работу и мои возможности вести open source разработку стали очень ограниченными.

    С момента начала работы над библиотекой тема сверточных нейронных сетей и deep learning стала очень популярной. Особый всплеск популярности произошел после того как команда Джефри Хинтона, используя свою реализацию сверточных сетей на CUDA (написанную Алексом Крыжевским) победила с большим отрывом от конкурентов в конкурсе Large Scale Visual Recognition Challenge. Сейчас Google использует эту технологию для поиска по картинкам.

    Сейчас моя библиотека хостится на bigbucket, страницу с описанием посещает порядка 130 человек в месяц:
    image
    что конечно-же совсем немного для какого-нибудь блога, но для весьма специализированной библиотеки рассчитанной на узкий круг исследователей не так уж и мало. Кстати, основная масса посещений из Штатов и Китая. Кроме того, мне периодически пишут пользователи с просьбой что-нибудь добавить или исправить и у меня даже не всегда есть время им ответить.

    Итак, что в итоге: есть библиотека, реализующая функционал обучения сверточных (и полносвязных) нейронных сетей со следующими возможностями и характеристиками:
    • Возможность работы на CPU и GPU (CUDA)
    • Кросс-платформенная (на основе CMake), в т.ч. компилируется под ARM с некоторыми ограничениями
    • Методы обучения: стохастический градиент, стохастический Левенберг-Марквардт
    • Слои: convolutional, pooling, fully connected
    • Активационные функции: тангенциальная, линейная, тангенциальная с нормализованной дисперсией
    • Произвольный размер и форма ядер свертки (в других реализациях есть ограничения)
    • Наличие фронт-энда для Matlab

    Также есть вещи над которыми еще стоило бы поработать. В частности, код для CPU не оптимизирован по скорости, CUDA код тоже есть куда развивать, не помешала бы doxygen документация.

    Как я уже отметил выше, у меня на данный момент не осталось ни времени ни возможностей для поддержки библиотеки, поэтому если кого-то заинтересует участие в ее развитии, я готов оказать всяческую помощь. Думаю это может быть полезным для тех, кому хотелось бы поучаствовать в open source проекте, плюс получить опыт в области Machine learning, применить технологии deep learning для своих задач, получить опыт CUDA разработки.

    Кто заинтересовался, пишите мне в ЛС.

    P.S. Пользуясь случаем, хочу пропиарить недавно открывшуюся у нас вакансию связанную с Machine Learning + Big data
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 6

      +7
      Почему бы в таком случае не выложить на github?
        +4
        Если это вопрос почему между Github и Bitbucket я выбрал последний, то ответ хорошо сформулирован здесь: eax.me/github-vs-bitbucket/
        В первую очередь мне была очень важна возможность иметь закрытые репозитории.
          0
          Хорошо описано, будет полезно
        0
        Здесь был ответ.
          0
          а можно оффтоп вопрос, что это за «тангенциальная с нормализованной дисперсией»? первый раз слышу
            0
            Это проще чем звучит. Это название для тангенциальной функции у которой максимальная кривизна приходится на значение входа равное 1. А сами выходы могут принимать значения от -1,7 до 1,7: f(x) = 1.7159*tanh(2/3*x)
            От сюда, раздел 4.4

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое