reseau de neurones simple

by oeeckhoutte

HTML

<html>
   <head>
      <title>Reseau de neurones simple</title>
      <script>
      
      	let inputData = [0, 1, 0, 1]
        
      </script>
   </head>
   <body onload='reset()'>
      <table>
       <tr>
          <td>Output 0 : </td>
          <td id="out0">0</td>
       </tr>
       <tr>
          <td>Output 1 : </td>
          <td id="out1">0</td>
       </tr>
       <tr>
        <td>
         <input type="button" value="Reset" onclick="reset(); display();">
        </td>
        <td>
         <input type="button" value="Propagate" onclick="propagate(inputData); display();">
        </td>
       </tr>
    </table>
   </body>
</html>

JavaScript

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


const display = () => {
   document.getElementById('out0').innerHTML = output[0];
   document.getElementById('out1').innerHTML = output[1];
}

const propagate = (d) => {
    // On copie les données dans la couche d'entrée
    for (let i = 0; i < input.length; i++) {
        input[i] = d[i];
    }

    // 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]);
    }

    // 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],
         [0.5, 0.5, 0.5, 0.5], 
         [0.5, 0.5, 0.5, 0.5],
         [0.5, 0.5, 0.5, 0.5]];
         
    Wo = [[0.5, 0.5, 0.5, 0.5],
         [0.5, 0.5, 0.5, 0.5]];
}