2017-10-07 1 views
0

EDIT: Je réussi à réunir quelques exemples simples https://github.com/developer239/neural-network-playgroundNeataptic toujours le retour même valeur après la formation

Je viens de commencer à jouer avec neataptic. Je voulais faire le réseau de neurones pour apprendre à compter en utilisant le nombre: 1, 2, 3, 4, 5, 6, 7, 8, 9.

J'ai normalisé mes entrées à 0.1, 0.2, 0.3, 0.4, 0,5, 0,6, 0,7, 0,8, 0,9.

Puis j'ai écrit un programme d'entraînement très simple qui apprendrait au net comment ajouter 1 + 2 (0.1 + 0.3).

const architect = require('neataptic').architect 


const myTrainingSet = [ 
    { input: [0.1, 0.2], output: [0.3] }, 
    { input: [0.2, 0.1], output: [0.3] } 
]; 

myNetwork = architect.Perceptron(2, 3, 1); 

myNetwork.train(myTrainingSet, { 
    log: 1, 
    error: 0.01, 
    iterations: 1000, 
    rate: 0.3 
}); 

console.log(myNetwork.activate([0,0])); 
console.log(myNetwork.activate([1,1])); 
console.log(myNetwork.activate([0.1,0.2])); 

Le problème est que cette consigne:

[ 0.3717501873608793 ] 
[ 0.3695919770977549 ] 
[ 0.37142744367869446 ] 

Il enregistre essentiellement 0,3 pour chaque entrée. Est-ce que certains peuvent expliquer ce que j'ai mal fait? :)

Répondre

2

L'ensemble de données est trop petit pour que le réseau de neurones apprenne à partir des modèles. Vous l'avez seulement fourni avec des échantillons ayant la sortie 0.3. Le réseau de neurones minimise son erreur en émettant toujours 0.3, car c'est exactement comme cela qu'il a été formé. J'ai créé, par exemple, avec 1000 échantillons (générées dynamiquement), qui semble fonctionner:

const architect = neataptic.architect; 

const trainingSet = []; 

for (var i = 0; i < 1000; i++) { 
    let integer1 = Math.floor(Math.random() * 10); 
    let integer2 = Math.round(Math.random() * (10 - integer1)); 

    let output = (integer1 + integer2)/10; 

    trainingSet.push({ input: [integer1/10, integer2/10], output: [output] }); 
} 

myNetwork = architect.Perceptron(2, 3, 1); 

myNetwork.train(trainingSet, { 
    log: 50, 
    error: 0.0001, 
    iterations: 1000, 
    rate: 0.3, 
    momentum: 0.9 
}); 

console.log(myNetwork.activate([0,0])); 
console.log(myNetwork.activate([0.1,0.2])); 
console.log(myNetwork.activate([0.5, 0.5])); 

JSFiddle