хуйу нас не матерятся
В этот раз постепенно усложним задачу. К прошлому примеру добавим новую кривую с другим периодом. Это разнообразит ситуацию:
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 раундов и получаем вполне годный результат:
А нет никаких выводов, продолжение следует.
С большим удовольствием жду продолжения. И если есть такая возможность, был бы рад увидеть и весь исходный код.