2016-11-14 2 views
1

J'essaie donc de former une porte OU avec un Perceptron. Le problème est que cela ne fonctionne pas. La mauvaise est 0 0 -> désiré = 0, réel = 1. Et celui-ci ne change pas. En outre, quand je mets les poids que je dois tester, ils ne semblent pas fonctionner du tout non plus, mais cela peut être quelque chose qui ne va pas avec ma fonction testOut.ANN Perceptron La formation OR-Gate ne fonctionne pas correctement

public class Temp { 

double[][] data = {{0.d, 0.d}, {0.d, 1.d}, {1.d, 0.d}, {1.d, 1.d}}; 
double[] outputs = {0.d, 1.d, 1.d, 1.d}; 
double[][] weights = { 
     {ThreadLocalRandom.current().nextDouble(-.5, .5), 
       ThreadLocalRandom.current().nextDouble(-.5, .5)}, 
     {ThreadLocalRandom.current().nextDouble(-.5, .5), 
       ThreadLocalRandom.current().nextDouble(-.5, .5)}, 
     {ThreadLocalRandom.current().nextDouble(-.5, .5), 
       ThreadLocalRandom.current().nextDouble(-.5, .5)}, 
     {ThreadLocalRandom.current().nextDouble(-.5, .5), 
       ThreadLocalRandom.current().nextDouble(-.5, .5)} 
}; 

public double[][] train(int maxEpoch, double threshhold) { 
    for (int i = 0; i < maxEpoch; i++) { 
     System.out.println("EPOCH " + i); 
     double sum = 0.0d; 
     double actualOutput = 0.0d; 
     double[] ep = new double[outputs.length]; 
     for (int j = 0; j < data.length; j++) { 
      for (int k = 0; k < data[j].length; k++) { 
       sum += data[j][k] * weights[j][k]; 
      } 
      actualOutput = step(sum - threshhold); 
      ep[j] = outputs[j] - actualOutput; 
      for (int k = 0; k < data[j].length; k++) { 
       weights[j][k] = weights[j][k] + .1 * data[j][k] * ep[j]; 
      } 
      System.out.println("output " + j + " " + actualOutput + " " + outputs[j] +" - " + ep[j]); 
     } 
    } 
    return weights; 

} 

public void testOut(double[][] data, double[][] weights, double threshhold){ 
    double sum = 0; 
    double[] actualOutput = new double[data.length]; 
    for (int j = 0; j < data.length; j++) { 
     for (int k = 0; k < data[j].length; k++) { 
      sum += data[j][k] * weights[j][k]; 
     } 
     actualOutput[j] = step(sum - threshhold); 
    } 
    System.out.println(Arrays.toString(actualOutput)); 
} 

public static void main(String[] args) { 
    Temp t = new Temp(); 
    double[][] weights = t.train(200, 0); 
    t.testOut(t.data, weights, .5); 
} 
} 

Toute aide appréciée.

Editer: l'étape (somme - seuil) est la fonction pas à pas.

public static int step(double x) { 
     return x >= 0.d ? 1 : 0; 
} 
+0

Pouvez-vous également fournir la définition de la méthode steps()? –

+0

st statique statique int (double x) { \t \t return x> = 0.d? dix; \t} –

+0

O/p est quelque chose comme: EPOCH 0 ..........., EPOCH 1 ........, ---- EPOCH 199. Alors, où ru obtenir le problème? ? Que veux-tu exactement? –

Répondre

1

J'ai donc résolu le problème. La fonction step a renvoyé 0, à cause de la valeur du seuil. Je l'ai fait .2d à la place et maintenant ça marche bien.