tiny-dnn — анонс бібліотеки

image

Поки TensorFlow активно завойовує світ, воює за аудиторію з такими великими гравцями ринку машинного навчання і глибоких нейронних мереж як Keras, Theano і Caffe, інші менш грандіозні проекти тим часом партизанят, намагаючись зайняти хоч якусь нішу. Про один з таких проектів я якраз і хотів сьогодні розповісти зважаючи на повну відсутність інформації про нього на Хабрахабре. Отже, tiny-dnn — це повністю автономна C++11 реалізація глибинного навчання, створена для застосування в умовах обмежених обчислювальних ресурсів, вбудованих систем або IoT. Подробиці під катом.


Що ж пропонують нам розробники
  1. Швидкість навіть без GPU. Досягається засчет TBB і векторизації SSE/AVX. 98.8 відсотків точності на MNIST за 13 хвилин навчання
  2. Портируемость. Про це далі
  3. Можливість імпортувати моделі Caffe. Але знадобиться protobuf
  4. Передбачувана продуктивність. Проста багатопотокова модель + відсутність GC (коштувало їм це писати, адже бібліотека для C + + програмістів)
В цілому, нічого революційного, але й дорікнути особливо нема за що. Пропонується все робити на C++ і досить прямолінійно. Є можливість збереження і завантаження моделі в файл і з файлу (знову ж без залежностей). Повний список див. в посиланні на GitHub.

Установка і збірка
Бібліотека поширюється вихідними кодами. Іншого способу для цієї бібліотеки фізично бути не може, так як весь код міститься в h-файлах, тобто збирати в бібліотеку зовсім нічого. Сумнівне рішення, але в гонитві за дикою стійкістю і простотою — чому б і ні?
Для запуску прикладів або тестів потрібно cmake. Доступний з десяток опцій, в тому числі і USE_OPENCL — на даний момент експериментальна можливість, яка у майбутньому може дати відчутну вигоду. Повний список пропоную так само дивитися на сторінці проекту.

Досвід використання в MS Visual Studio

Після виклику «cmake .» сгенерируется *.sln файл для MS Visual Studio 2015 (Community Edition цілком підходить). У цьому солюшене два проекти, власне сама бібліотека і тести. Туди можна просто додати свій проект, а для початку використання бібліотеки прописати:
#include "tiny_dnn/tiny_dnn.h"

але при цьому слід не забути додати в «Include directories» каталог tiny-dnn.
Так само в моєму випадку виникла проблема складання, а саме:
error C4996: 'std::copy::_Unchecked_iterators::_Deprecate': Call to 'std::copy' with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
 

для вирішення потрібно додати define _SCL_SECURE_NO_WARNINGS параметри проекту (C/C++ -> Preprocessor).

Приклад
На сторінці можна знайти приклади, але вони про затертий до дірок MNIST, для нього потрібні дані, функції розбору (які насправді вбудовані в бібліотеку) і т. д. Особисто мені хотілося банального «Hello, world» у світі нейромереж — реалізації xor. Гугление не дало швидких результатів, що вилилося в бажання зробити самому і поділитися в статті. Ось що вийшло:
#include "tiny_dnn/tiny_dnn.h"

using namespace tiny_dnn;
using namespace tiny_dnn::activation;
network<sequential> construct_mlp() 
{
//auto mynet = make_mlp<tan_h>({ 2, 8, 2 });
auto mynet = make_mlp<relu>({ 2, 8, 2 });
assert(mynet.in_data_size() == 2);
assert(mynet.out_data_size() == 2);
return mynet;
}

int main(int argc, char** argv)
{
auto net = construct_mlp();

std::vector<label_t> train_labels {0, 1, 1, 0};
std::vector<vec_t> train_numbers{ {0, 0}, {0, 1}, {1, 0}, {1, 1} };

adagrad optimizer; // use gradient_descent?
net.train<mse>(optimizer, train_numbers, train_labels, 4, 1000); // batch size 4, 1000 epochs

for (auto& tn : train_numbers)
{
auto res_label = net.predict_label(tn);
auto res = net.predict(tn);
std::cout << "In: (" << tn[0] << "," << tn[1] << ") Prediction: " << res_label << std::endl;
}
std::cin.get();
return 0;
}


Перші враження
Вони спірні. З одного боку все дуже просто і гарантовано скрізь заведеться, з іншого боку на банальному XOR е мережа якось довго сходиться, наприклад за 100 епох на виході виходять правильні, але вкрай невпевнені результати зразок 0.15, за 1000 епох щось на зразок 0.8. Здається, аналогічна модель на tensorflow сходиться швидше, але це неточно :)
Далі, сам демо-проект збирається довше, ніж хотілося б. Схоже, це через підходу з хидерами. Можливо в більш великому проекті навіть помітно не буде, в маленькому проекті з одним C++ файлом дуже навіть. До речі, можливо на допомогу доведеться рішення від MS з т. зв. precompiled headers…
Те, як у бібліотеці пропонується використовувати синтаксис і фічі C++11, як не дивно, порадувало — я не так багато програмують на «голому» C++ (частіше Qt), але тестовий приклад дався з першої спроби. До речі зауваження до нього вітаються.

Посилання на GitHub: github.com/tiny-dnn/tiny-dnn
Посилання на корисну презентацію: www.slideshare.net/ssuser756ec5/deep-learning-with-c-an-introduction-to-tinydnn
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.