Всё о web

Для чайников и не только


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

Декабрь 11, 2016

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

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 раундов и получаем вполне годный результат:

Вывод:

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



Комментарии

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

  1. Аватар krim45:

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

  2. Илья Илья:

    Привет. Все исходники доступны прям на страничках с примерами.

Оставить комментарий:

Ваш e-mail не будет опубликован. Обязательные поля помечены *