Я пытаюсь научить нейронную сеть решать, куда идти, исходя из введенного уровня жизни. Нейронная сеть всегда будет получать три входа [x, y, life]
. Если life => 0.2
, он должен вывести угол от [x, y]
до (1, 1)
. Если life < 0.2
, он должен вывести угол от [x, y]
до (0, 0)
.
Поскольку входы и выходы нейронов должны быть между 0
и 1
, я делю угол на 2 *Math.PI
.
Вот код:
var network = new synaptic.Architect.Perceptron(3,4,1);
for(var i = 0; i < 50000; i++){
var x = Math.random();
var y = Math.random();
var angle1 = angleToPoint(x, y, 0, 0) / (2 * Math.PI);
var angle2 = angleToPoint(x, y, 1, 1) / (2 * Math.PI);
for(var j = 0; j < 100; j++){
network.activate([x,y,j/100]);
if(j < 20){
network.propagate(0.3, [angle1]);
} else {
network.propagate(0.3, [angle2]);
}
}
}
Попробуйте здесь: jsfiddle
Поэтому, когда я ввожу следующий вход [0, 1, 0.19]
, я ожидаю, что нейронная сеть выведет что-то близкое к [0.75]
(1.5PI / 2PI
). Но мои результаты полностью противоречивы и не показывают никакой корреляции с каким-либо введенным данным.
Какую ошибку я принимаю в обучении моей нейронной сети?
Мне удалось научить нейронную сеть выводить
1
при вводе[a, b, c]
сc => 0.2
и0
при вводе[a, b, c]
сc < 0.2
. Мне также удалось научить его выводить угол в определенное место на основе ввода[x, y]
, однако Я не могу совместить их.
В соответствии с запросом, я написал код, который использует 2 Neural Networks для получения желаемого результата. Первая нейронная сеть преобразует уровень жизни в 0 или 1, а вторая нейронная сеть выдает угол в зависимости от 0 или 1, полученных из первой нейронной сети. Это код:
// This network outputs 1 when life => 0.2, otherwise 0
var network1 = new synaptic.Architect.Perceptron(3,3,1);
// This network outputs the angle to a certain point based on life
var network2 = new synaptic.Architect.Perceptron(3,3,1);
for (var i = 0; i < 50000; i++){
var x = Math.random();
var y = Math.random();
var angle1 = angleToPoint(x, y, 0, 0) / (2 * Math.PI);
var angle2 = angleToPoint(x, y, 1, 1) / (2 * Math.PI);
for(var j = 0; j < 100; j++){
network1.activate([x,y,j/100]);
if(j < 20){
network1.propagate(0.1, [0]);
} else {
network1.propagate(0.1, [1]);
}
network2.activate([x,y,0]);
network2.propagate(0.1, [angle1]);
network2.activate([x,y,1]);
network2.propagate(0.1, [angle2]);
}
}
Попробуйте здесь: jsfiddle
Как вы можете видеть в этом примере. Ему удается достичь желаемого результата достаточно близко, добавив больше итераций, он будет еще ближе.