Продолжаем эксперименты с нейросетями

11.12.2016 10:34

В этот раз постепенно усложним задачу. К прошлому примеру добавим новую кривую с другим периодом. Это разнообразит ситуацию:

function getData() {
  let g1currentPoint
  let g2currentPoint
  let g1
  let g2
  let data = []
  let learData = []
  let i, ii
  
  for(i=0; i<steps1; i++) {
    g1currentPoint = currentPoint1 + (step1 * i)
    g2currentPoint = currentPoint2 + (step2 * i)
    g1 = (Math.sin(degreeToRad(g1currentPoint)) + 1)/2
    g2 = (Math.sin(degreeToRad(g2currentPoint)) + 1)/8
    data.push({
      x: i,
      y: g1/1.5 + g2
    })
  }
  
  for(ii=i; ii<(i+steps2); ii++) {
    g1currentPoint = currentPoint1 + (step1 * ii)
    g2currentPoint = currentPoint2 + (step2 * ii)
    g1 = (Math.sin(degreeToRad(g1currentPoint)) + 1)/2
    g2 = (Math.sin(degreeToRad(g2currentPoint)) + 1)/8
    learData.push({
      x: ii,
      y: g1/1.5 + g2
    })
  }

  return {data: data, learData: learData}
}

Входных данных будет больше, и прогнозировать мы будем уже значения а не направления, по этому, создаём входной слой в 40 нейронов, выходной в 15, и промежуточный в 40.

Так же смотреть на циферки в консоли не интересно, давайте быстренько соберём веб-страничку.

На старте:

Через 4000 уроков:

Никаких проблем, 20-30 минут на обучение и прогноз строится идеальный.

Тогда продолжаем усложнять, добавляем ещё 1 кривую со своим периодом, но и немного нейрончиков тоже добавим.

На старте:

Через 5000-6000 уроков:

Далее добавляем немного шумов:

noize = (getRandomRange(0, 100) - 50 ) / 600

В этот раз приходится ждать долго. Как минимум 8000 раундов, результат:

Сеть начинает ошибаться больше. Добавим ещё шумов и посмотрим что буде:

Спустя 10000 раундов:

И так, мы это сделали. Сеть стала много ошибаться. Попробуем ей добавить мозгов, создадим второй скрытый слой:

  inputLayer = new synaptic.Layer(steps1)
  hiddenLayer1 = new synaptic.Layer(80)
  hiddenLayer2 = new synaptic.Layer(60)
  outputLayer = new synaptic.Layer(steps2)
  inputLayer.project(hiddenLayer1)
  hiddenLayer1.project(hiddenLayer2)
  hiddenLayer2.project(outputLayer)
  myNetwork = new synaptic.Network({
    input: inputLayer,
    hidden: [hiddenLayer1, hiddenLayer2],
    output: outputLayer
  })

Ждём ещё 10000 раундов и получаем вполне годный результат:

Вывод:

А нет никаких выводов, продолжение следует.



Нейросети на JavaScript

Если Вы поищите по npm репозиторию фразу "machine learning", то получите пачку готовых библиотек, одна из них synaptic. Давайте её немного изучим.

Создаём API сервер на expressjs + websockets Часть 1

Привет, дорогие мои котяточки. Сегодня мы быстренько поднимем API сервер на expressjs и веб-сокетах. Как обычно нет времени объяснять зачем мне это нужно, just do it!


(2) Комментариев

krim45 - 19.10.2017 08:53:37
- 0    + 0
С большим удовольствием жду продолжения. И если есть такая возможность, был бы рад увидеть и весь исходный код.
Илья - 27.10.2017 06:06:02
- 0    + 0
Привет. Все исходники доступны прям на страничках с примерами.