fred voisin’s website

computer music producer, since 1989

Calcul d’activations neuronales avec Puredata (ou Max)

21 déc. 2009

En recourant à un minimum d’objets simples parmi les plus communs de Puredata, cet exemple didactique décrit le principe général du calcul de l’activation de n neurones formels constitués en un réseau.
Ici, chaque neurone est représenté par un objet (patcher) [neuron nn n] (cf. neuron.pd), où « nn » est le nom du réseau de neurones, et « n » le numéro de chaque neurone.
Les poids synaptiques sont initialisés (ici aléatoirement) et enregistrés dans une table indexée (objet [coll])
Seules les activations neuronales sont calculées : il reste à réaliser l’apprentissage selon des processus d’auto-adaptation, lesquels définissent à la fois l’architecture du réseau et ses propriétés : MLP, SOM, etc.
La mise à jour des poinds synaptiques s’effectuera au travers de la table indexée, soit directement dans Puredata soit au moyen de tout autre programme.
Cet exemple peut bien sûr être optimisé ou adapté selon les besoins...

neuron.pd
activations d’un neurone.

neuron.pd

#N canvas 1045 22 502 647 10;
#X obj 70 162 list split 1;
#X obj 76 77 inlet;
#X obj 82 135 list;
#X obj 109 250 list split 1;
#X obj 109 223 list;
#X obj 169 183 inlet;
#X obj 70 192 t b f b;
#X obj 315 226 inlet;
#X text 314 203 Bias;
#X text 167 161 Weigths;
#X text 33 77 Input;
#X obj 204 576 outlet;
#X obj 89 338 + 0;
#X obj 89 308 * 0;
#X obj 89 514 list;
#X obj 89 444 t b f;
#X msg 244 466 bang;
#X obj 204 534 list;
#X obj 204 104 t b l b;
#X obj 116 483 list prepend;
#X obj 393 262 inlet;
#X text 390 239 Slope;
#N canvas 0 22 524 355 sigmoid 0;
#X obj -12 45 inlet;
#X obj -10 214 outlet;
#X obj -10 120 expr exp($f1 / $f2);
#X obj -10 173 expr $f1 / ($f1 + $f2);
#X obj 101 46 inlet;
#X obj 132 120 expr exp($f1 / $f2);
#X obj 132 98 * -1;
#X obj -11 70 t f f;
#X connect 0 0 7 0;
#X connect 2 0 3 0;
#X connect 3 0 1 0;
#X connect 4 0 2 1;
#X connect 4 0 5 1;
#X connect 5 0 3 1;
#X connect 6 0 5 0;
#X connect 7 0 2 0;
#X connect 7 1 6 0;
#X restore 89 389 pd sigmoid;
#X obj 204 25 r \$1;
#X obj 204 57 route input weigths bias slope;
#X obj 248 81 route \$2;
#X obj 281 608 s \$1;
#X obj 281 560 prepend \$2;
#X obj 281 582 prepend out;
#X text 34 609 Fred Voisin \, Pantin \, 21 dec. 2009;
#X connect 0 0 6 0;
#X connect 0 1 2 1;
#X connect 1 0 18 0;
#X connect 2 0 0 0;
#X connect 3 0 13 1;
#X connect 3 1 4 1;
#X connect 4 0 3 0;
#X connect 5 0 4 1;
#X connect 6 0 2 0;
#X connect 6 1 13 0;
#X connect 6 2 4 0;
#X connect 7 0 12 1;
#X connect 12 0 22 0;
#X connect 13 0 12 0;
#X connect 14 0 19 1;
#X connect 15 0 14 0;
#X connect 15 1 19 0;
#X connect 16 0 19 1;
#X connect 17 0 11 0;
#X connect 17 0 27 0;
#X connect 18 0 17 0;
#X connect 18 1 2 0;
#X connect 18 2 16 0;
#X connect 19 0 14 1;
#X connect 19 0 17 1;
#X connect 20 0 22 1;
#X connect 22 0 15 0;
#X connect 23 0 24 0;
#X connect 24 0 18 0;
#X connect 24 1 25 0;
#X connect 24 2 12 1;
#X connect 24 3 22 1;
#X connect 25 0 4 1;
#X connect 27 0 28 0;
#X connect 28 0 26 0;

activations.pd
patch principal

activations.pd

#N canvas 627 95 656 455 10;
#X msg 78 84 0 0.9 0.7 0.3 0.2 0;
#X msg 94 108 0.9 0.1 0.3 0.3 0.8 0.9;
#X obj 84 318 route out;
#X text 386 411 Fred Voisin \, Pantin \, 21 dec. 2009;
#X obj 147 318 prepend set;
#X msg 147 345 0.5 0.506859 0.505335 0.502286 0.501524 0.5;
#X floatatom 273 123 5 0 0 0 - - -;
#X obj 273 82 loadbang;
#X obj 273 102 0.9;
#X obj 78 137 t l;
#X obj 78 164 prepend input;
#X text 248 20 Activations neuronales;
#X obj 84 345 print out;
#X obj 78 190 s nn;
#X obj 147 295 neuron nn 16;
#X msg 273 142 \; nn slope \$1;
#X obj 84 295 r nn;
#N canvas 0 22 601 313 apprentissage 0;
#X text 45 126 pour un MLP \, il s'agira d'implementer l'algorithme
de backpropagation.;
#X text 44 57 pour une carte auto-organisatrice (SOM) \, l'apprentissage
consistera ‡ calculer l'erreur et la rÈpercuter sur les poids (diffÈrences
* facteur d'apprentissage) du neurone dont l'erreur est la plus faible
et de ses voisins (* fct Èloignement);
#X restore 400 231 pd apprentissage;
#N canvas 0 22 492 389 initialisation 0;
#X obj 67 246 coll weigths;
#C restore;
#X floatatom 67 219 5 0 0 0 - - -;
#X obj 67 275 prepend;
#X obj 261 143 6;
#N canvas 0 22 559 340 random-weigths 0;
#N canvas 0 22 472 513 randomlist 0;
#X obj 110 211 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
-1 -1;
#X obj 110 245 random 999999;
#X obj 110 268 / 999999;
#X floatatom 153 118 5 0 0 0 - - -;
#X obj 100 354 list;
#X obj 110 291 t b f;
#X obj 74 399 list;
#X msg 222 314 bang;
#X obj 111 117 t b b;
#X obj 136 331 list append;
#N canvas 0 22 456 437 (subpatch) 0;
#X obj 112 54 inlet;
#X obj 95 344 outlet;
#X obj 113 159 +;
#X obj 160 142 0;
#X obj 113 129 1;
#X obj 113 271 spigot;
#X obj 112 102 t b b;
#X obj 226 231 inlet;
#X obj 113 221 t f f;
#X obj 68 304 t b f;
#X obj 146 248 <=;
#X connect 0 0 6 0;
#X connect 2 0 8 0;
#X connect 3 0 2 1;
#X connect 4 0 2 0;
#X connect 5 0 9 0;
#X connect 6 0 4 0;
#X connect 6 1 3 0;
#X connect 7 0 10 1;
#X connect 8 0 5 0;
#X connect 8 1 10 0;
#X connect 9 0 4 0;
#X connect 9 1 2 1;
#X connect 9 1 1 0;
#X connect 10 0 5 1;
#X restore 110 186 pd;
#X obj 74 94 t b b;
#X obj 74 42 inlet;
#X obj 74 68 t b f;
#X obj 74 425 outlet;
#X connect 0 0 1 0;
#X connect 1 0 2 0;
#X connect 2 0 5 0;
#X connect 3 0 10 1;
#X connect 4 0 9 1;
#X connect 5 0 4 0;
#X connect 5 1 9 0;
#X connect 6 0 14 0;
#X connect 7 0 9 1;
#X connect 8 0 10 0;
#X connect 8 1 7 0;
#X connect 9 0 4 1;
#X connect 9 0 6 1;
#X connect 10 0 0 0;
#X connect 11 0 6 0;
#X connect 11 1 8 0;
#X connect 12 0 13 0;
#X connect 13 0 11 0;
#X connect 13 1 3 0;
#X restore 213 213 pd randomlist;
#N canvas 0 22 456 437 counter 0;
#X obj 113 64 inlet;
#X obj 113 212 outlet;
#X obj 113 159 +;
#X obj 160 142 0;
#X obj 113 129 1;
#X obj 160 93 inlet;
#X obj 113 183 i;
#X connect 0 0 4 0;
#X connect 2 0 6 0;
#X connect 3 0 2 1;
#X connect 4 0 2 0;
#X connect 5 0 3 0;
#X connect 6 0 1 0;
#X connect 6 0 2 1;
#X restore 134 213 pd counter;
#X obj 212 181 i;
#X floatatom 227 145 5 0 0 0 - - -;
#X obj 134 160 t b b;
#X msg 174 188 0;
#X obj 134 244 list append;
#X obj 134 283 outlet;
#X obj 134 46 inlet;
#N canvas 0 22 456 437 (subpatch) 0;
#X obj 112 54 inlet;
#X obj 95 344 outlet;
#X obj 113 159 +;
#X obj 160 142 0;
#X obj 113 129 1;
#X obj 113 271 spigot;
#X obj 112 102 t b b;
#X obj 226 231 inlet;
#X obj 113 221 t f f;
#X obj 68 304 t b f;
#X obj 146 248 <=;
#X connect 0 0 6 0;
#X connect 2 0 8 0;
#X connect 3 0 2 1;
#X connect 4 0 2 0;
#X connect 5 0 9 0;
#X connect 6 0 4 0;
#X connect 6 1 3 0;
#X connect 7 0 10 1;
#X connect 8 0 5 0;
#X connect 8 1 10 0;
#X connect 9 0 4 0;
#X connect 9 1 2 1;
#X connect 9 1 1 0;
#X connect 10 0 5 1;
#X restore 134 104 pd;
#X obj 135 75 t b f b;
#X obj 227 47 inlet;
#X text 274 50 taille input;
#X text 24 48 nombre neurones;
#X connect 0 0 6 1;
#X connect 1 0 6 0;
#X connect 2 0 0 0;
#X connect 3 0 2 1;
#X connect 4 0 1 0;
#X connect 4 1 2 0;
#X connect 5 0 1 1;
#X connect 6 0 7 0;
#X connect 8 0 10 0;
#X connect 9 0 4 0;
#X connect 10 0 9 0;
#X connect 10 1 9 1;
#X connect 10 2 5 0;
#X connect 11 0 3 0;
#X restore 162 193 pd random-weigths;
#X obj 67 295 prepend weigths;
#X obj 67 145 t b b;
#X obj 112 168 i;
#X obj 67 110 t b b b;
#X floatatom 276 121 5 0 0 2 taille_de_l'input - -;
#X floatatom 177 104 5 0 0 2 nombre_de_neurones - -;
#X obj 67 76 bng 15 250 50 0 empty empty Initialisation 17 7 0 10 -262144
-1 -1;
#X obj 162 144 16;
#N canvas 0 22 456 437 count 0;
#X obj 112 54 inlet;
#X obj 95 344 outlet;
#X obj 113 159 +;
#X obj 160 142 0;
#X obj 113 129 1;
#X obj 113 271 spigot;
#X obj 112 102 t b b;
#X obj 226 231 inlet;
#X obj 113 221 t f f;
#X obj 68 304 t b f;
#X obj 146 248 <=;
#X connect 0 0 6 0;
#X connect 2 0 8 0;
#X connect 3 0 2 1;
#X connect 4 0 2 0;
#X connect 5 0 9 0;
#X connect 6 0 4 0;
#X connect 6 1 3 0;
#X connect 7 0 10 1;
#X connect 8 0 5 0;
#X connect 8 1 10 0;
#X connect 9 0 4 0;
#X connect 9 1 2 1;
#X connect 9 1 1 0;
#X connect 10 0 5 1;
#X restore 67 193 pd count;
#X obj 67 318 s nn;
#X text 174 82 comment;
#X obj 23 76 inlet;
#X obj 140 103 inlet;
#X obj 235 116 inlet;
#X connect 0 0 2 0;
#X connect 0 1 2 1;
#X connect 1 0 0 0;
#X connect 2 0 5 0;
#X connect 3 0 4 1;
#X connect 4 0 0 0;
#X connect 5 0 14 0;
#X connect 6 0 13 0;
#X connect 6 1 7 0;
#X connect 7 0 13 1;
#X connect 8 0 6 0;
#X connect 8 1 12 0;
#X connect 8 2 3 0;
#X connect 9 0 3 1;
#X connect 10 0 12 1;
#X connect 11 0 8 0;
#X connect 12 0 7 1;
#X connect 12 0 4 0;
#X connect 13 0 1 0;
#X connect 16 0 11 0;
#X connect 17 0 10 0;
#X connect 18 0 9 0;
#X restore 397 156 pd initialisation;
#X floatatom 496 134 5 0 0 2 taille_de_l'input - -;
#X floatatom 446 117 5 0 0 2 nombre_de_neurones - -;
#X obj 397 100 bng 15 250 50 0 empty empty Initialisation 0 -7 0 10
-262144 -1 -1;
#N canvas 0 22 462 264 nn 0;
#X obj 48 80 neuron nn 1;
#X obj 130 81 neuron nn 2;
#X obj 215 81 neuron nn 3;
#X obj 300 81 neuron nn 4;
#X obj 300 105 neuron nn 8;
#X obj 302 127 neuron nn 12;
#X obj 301 150 neuron nn 16;
#X obj 216 150 neuron nn 15;
#X obj 216 128 neuron nn 11;
#X obj 216 106 neuron nn 7;
#X obj 131 105 neuron nn 6;
#X obj 132 127 neuron nn 10;
#X obj 131 150 neuron nn 14;
#X obj 49 149 neuron nn 13;
#X obj 49 126 neuron nn 9;
#X obj 49 104 neuron nn 5;
#X restore 273 231 pd nn (16 neurones);
#X connect 0 0 9 0;
#X connect 1 0 9 0;
#X connect 2 0 12 0;
#X connect 4 0 5 0;
#X connect 6 0 15 0;
#X connect 7 0 8 0;
#X connect 8 0 6 0;
#X connect 9 0 10 0;
#X connect 10 0 13 0;
#X connect 14 0 4 0;
#X connect 16 0 2 0;
#X connect 19 0 18 2;
#X connect 20 0 18 1;
#X connect 21 0 18 0;

patcher [pd nn (16 neurones)]

pd nn (16 neurones)
16 neurones