Збереження нейронної мережі в JSON та інше: навчаємо нейронну мережу на JavaScript


Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.

Коли йдеться про задачі, відмінні від обробки великих масивів інформації, людський мозок має велику перевагу порівняно з комп’ютером. Людина може розпізнавати обличчя, навіть якщо в приміщенні буде багато сторонніх об’єктів і погане освітлення. Ми легко розуміємо незнайомців, навіть коли перебуваємо в шумному приміщенні. Проте, незважаючи на роки досліджень, комп’ютери все ще далекі від розв’язання подібних задач на високому рівні.

Штучні нейронні мережі застосовуються в різних галузях науки, починаючи із систем розпізнавання мови і закінчуючи системами розпізнавання вторинної структури білка, класифікації різних видів раку і генної інженерії.

Сьогодні нейронні мережі популярні, як ніколи. Свої рішення в цій галузі представляють такі компанії, як Google, Microsoft, і багато інших. Є також бібліотеки з відкритим кодом, написані ентузіастами на різних мовах. Одна з них – бібліотека brain, написана на JavaScript.

Використання

Найпростіший приклад застосування – навчання на функції XOR:

var net = new brain.NeuralNetwork ();net.train ([{input: [0, 0], output: [0]}, {input: [0, 1], output: [1]}, {input: [1, 0], output: [1]}, {input: [1, 1], output: [0]}]);var output = net.run ([1, 0]); // 1

Є ще  візуалізація того, як нейронна мережа навчається XOR, OR та іншим логічним функціям.

Щоб встановити бібліотеку, можна використати, наприклад, npm:

npm install brain

Вільно скачати останню версію brain.js. Тренувати мережу можна навіть оффлайн, а потім вже натреновану завантажити на сайт.

Щоб почати навчати мережу, треба використати функцію train (), у яку передаються дані для навчання у вигляді масиву. Мережа навчатиметься всіма даними відразу в одному виклику train (). Чим більше моделей навчання, тим довше мережа навчатиметься, але й розв’язувати поставлені перед нею задачі вона після цього буде набагато краще.

Модель для навчання повинна мати параметри input і output, кожен з яких складає масив або хеш чисел від 0 до 1. Наприклад, для демо з розпізнаванням контрастності кольорів:

var net = new brain.NeuralNetwork ();net.train ([{input: { r: 0.03, g: 0.7, b: 0.5 }, output: { black: 1 }},
{input: { r: 0.16, g: 0.09, b: 0.2 }, output: { white: 1 }},{input: { r: 0.5, g: 0.5, b: 1.0 }, output: { white: 1 }}]);var output = net.run ({ r: 1, g: 0.4, b: 0 }); // { white: 0.99, black: 0.002 }

Функція train () уміє приймати як другий аргумент масив декількох параметрів:

net.train (data, { errorThresh: 0.005, // поріг помилок, якого треба досягти,iterations: 20000, // максимальне число ітерацій навчання log: true, // чи потрібний періодичний console.log () logPeriod: 10, // число ітерацій між логированиями learningRate: 0.3 // міра навчання})

Навчатися мережа буде до тих пір, поки не досягне заданого порога помилок (за умовчанням задається 0.005) або не буде виконане задане число ітерацій (20000).

За умовчанням Ви не можете визначити, як багато часу залишилося до кінця навчання, проте можна поставити на true параметр log, щоб відстежувати перебіг навчання. Якщо передати як параметр функцію, то вона викликатиметься щоразу через кожне задане число ітерацій.

learningRate – параметр, що визначає, як швидко натренується нейронна мережа. Задається він числом від 0 до 1. Чим менше параметр, тим довше мережа навчатиметься. Зі збільшенням числа швидкість буде підвищуватись, але разом з цим збільшується вірогідність зниження якості навчання. За умовчанням це число становить 0.3.

Результатом навчання буде масив output з інформацією про те, як пройшло навчання.

{ error: 0.0039139985510105032, // помилки iterations: 406 // число ітерацій}

Якщо навчання закінчилося помилкою, то параметр error буде близьким до порога помилки. Причиною може виявитись зайва “зашумленность” даних, брак нейронів або недостатнє число ітерацій. Якщо навіть після 20000 ітерацій помилка становила близько 0.4, це може означати, що мережа погано сприймає дані, які надаються Вами.

Навчену мережу можна зберігати у форматі JSON:

var json = net.toJSON ();net.fromJSON (json);

Також можна  зберегти дані у функцію:

var run = net.toFunction ();var output = run ({ r: 1, g: 0.4, b: 0 });console.log (run.toString()); // це треба скопіювати і вставити в потрібне місце. Підключати brain.js не потрібно

NeuralNetwork () приймає асоціативний масив параметрів:

var net = new brain.NeuralNetwork ({ hiddenLayers: [4], learningRate: 0.6 // загальна міра навченої, корисна при навчанні в декілька потоків});

Перший параметр – загальна кількість прихованих шарів і розмір кожного шару. Наприклад, якщо треба два приховані шари – один з 3 нодами і другий з 4, то параметр буде таким:

hiddenLayers: [3, 4]

За умовчанням brain використовує один шар, пропорційний розміру вхідного масиву.

До речі, мережа може використати WriteStream. Тренують її, використовуючи pipe (), щоб відправляти дані в мережу.

Щоб тренувати мережу в потоці, спочатку треба  створити потік викликом методу net.createTrainStream (), що приймає наступні параметри:

  • floodCallback () – функція, яка викликатиметься на кожній ітерації навчання;
  • doneTrainingCallback (info) – функція, яка буде виконана після завершення навчання. Параметр info міститиме асоціативний масив інформації про те, як пройшло навчання:
{ error: 0.0039139985510105032, // помилки iterations: 406 // число ітерацій}

Також можна використати Transform, щоб привести дані до коректного формату або щоб на льоту нормалізовувати дані.

  1. 987

Джерело: GitHub

Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?


Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *