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],
...