reseau de neurones simple

by oeeckhoutte

HTML

<html>
   <head>
      <title>Reseau de neurones simple</title>
   </head>
   <body onload='reset()'>
   
     Input data:
     <table border='1'>
       <tr>
         <td>
           <input type='text' id='input0' value='1' size='1' />
         </td>
         <td>
           <input type='text' id='input1' value='0' size='1' />
         </td>
         <td>
           <input type='text' id='input2' value='1' size='1' />
         </td>
         <td>
           <input type='text' id='input3' value='0' size='1' />
         </td>
       </tr>
     </table>
     <br/>
     
     Target data:
     <table border='1'>
       <tr>
         <td>
           <input type='text' id='target0' value='1' size='1' />
         </td>
         <td>
           <input type='text' id='target1' value='0' size='1' />
         </td>
       </tr>
     </table>
     <br/>

     <table border='0'>
       <tr>
         <td>Output 0 : </td>
         <td id="out0">0</td>
         <td>Error 0 : </td>
         <td id="err0">0</td>
       </tr>
       <tr>
          <td>Output 1 : </td>
          <td id="out1">0</td>
          <td>Error 1 : </td>
          <td id="err1">0</td>
       </tr>
       </table>
       <br/>
       
       <table>
         <tr>
          <td>
           <input type="button" value="Reset" onclick="reset(); display();">
          </td>
          <td>
           <input type="button" value="Propagate" onclick="propagate(); display();">
          </td>
          <td>
           <input type="button" value="Learn" onclick="learn(); ">
          </td>
         </tr>
       </table>
   </body>
</html>

JavaScript

let Wh = [];
let Wo = [];
let input = [];
let hidden = [];
let output = [];

const alpha = 0.5;
let target = [0, 0];


const display = () => {

  document.getElementById('out0').innerHTML = output[0];	
  document.getElementById('err0').innerHTML = target[0] - output[0];
  document.getElementById('out1').innerHTML = output[1];
  document.getElementById('err1').innerHTML = target[1] - output[1];
}

const propagate = () => {

  	input[0] = parseInt(document.getElementById('input0').value);
    input[1] = parseInt(document.getElementById('input1').value);
    input[2] = parseInt(document.getElementById('input2').value);
   	input[3] = parseInt(document.getElementById('input3').value);
 
    // On propage dans la couche cachée
    // Xh contient les sommes cumulées pour la couche cachée
    let Xh = [0, 0, 0, 0];
    for (let j = 0; j < hidden.length; j++) {
        for (let i = 0; i < input.length; i++) {
            Xh[j] += Wh[j][i] * input[i];

        }   
    }

    // On applique la fonction d'activation
    for (let j = 0; j < hidden.length; j++) {
        hidden[j] = sigmoid(Xh[j]);
        //console.log(typeof hidden[j]);
    }

    // On propage dans la couche de sortie
    // Xo contient les sommes pondérées de chaque neurone de sortie
    let Xo = [0, 0];
    for (let k = 0; k < output.length; k++) {
        for (let j = 0; j < hidden.length; j++) {
            Xo[k] += Wo[k][j] * hidden[j];
        }
    }

    // On applique la fonction d'activation
    for (let k = 0; k < output.length; k++) {
        output[k] = sigmoid(Xo[k]);
    }
    
}

const sigmoid = (x) => {
    return 1 / (1 + Math.pow(Math.E, (-1 * x)));
}


const reset = () => {
		
    input = [0, 0, 0, 0];
    hidden = [0, 0, 0, 0];
    output = [0, 0];
    
    // 0.5 a été choisi totalement arbitrairement
    // En pratique, on aurait pu générer des valeurs aléatoires distribuées uniformément sur l'intervalle [-1; 1] et dont la moyenne aurait été nulle.
    Wh = [[0.5, 0.5, 0.5, 0.5],
  ...