NEUROMUSE3

Work in progress …

code source


Parent page.

Pour illustrer le comportement du SOM dans Neuromuse3, il a été choisi au hasard un panel de 100 couleurs réparti aléatoirement dans une carte de 100 neurones (voir illustration 1):

Lisp code

(defparameter *data* (loop repeat 100 collect (list (random 1.0) (random 1.0) (random 1.0))))
(create-mlt 'color 3 100 :data *data*)

Illustration 1 – Initialisation d'une carte de 100 neurones selon un panel de couleurs à priori.

Puis, l'apprentissage a été réalisé selon la fonction decroissante exp-decay avec un voisinage initial de rayon 5 (radius), un taux d'apprentissage initial de 0.1 (learning-rate) pour 10000 itérations. L'illustration 2 nous montre le résultat de cette procédure:

Lisp code

(let ((num 10000)
      (initial-learning-rate (learning-rate color))
      (initial-radius (radius color))
      (initial-epoch (epoch color)))
  (dotimes (k num)
    (setf (input color) (nth (random (length *data*)) *data*)
	  (radius color) (exp-decay (1+ (- (epoch color) initial-epoch)) initial-radius num)
	  (learning-rate color) (exp-decay (1+ (- (epoch color) initial-epoch)) initial-learning-rate num (list 0.01)))
    (sleep 0.1)
    (learn color)
    (send-udp (read-from-string (format nil "(\"\/COLOR\" \"[~{[~{~S, ~}], ~}]\")" (loop for i in (neurons-list color) collect (append (xpos i) (output i))))) "127.0.0.1" 57120)))

Illustration 2 – La même carte de l'illustration 1 après un apprentissage de 10000 itérations.

L'illustration 3 est une variante proposant une distance euclidienne avec modulo entre neurones en terme de voisinage (distance-in). Cela permet de considérer chaque neurone comme le centre de la carte, éludant de la sorte les « frontières » que forment les « bords » de la carte.

Illustration 3 – Même procédure que l'illustration 2 mais avec modulo.

SuperCollider code

// a = sqrt of number of neurons and b = the size of each little square
var w, o, data, a = 10, b = 50, run = true;
w = Window("SOM activity: COLOR",Rect(rrand(100,200),rrand(100,200),a*b,a*b));
w.view.background = Color(1, 1, 1, 0.3);
w.onClose = { run = false; 0.exit; };
w.front;
w.alwaysOnTop_(true);
o = OSCFunc({ arg msg, time, addr, recvPort;
    data=msg[1];
    data=data.asString.interpret;
    /*
    dat[0]=array(neuron_i)[x_i, y_i, red_i, green_i, blue_i]
    */
    {
       x = UserView( w, Rect( 0, 0, a*b, a*b )).canFocus_( false );
       x.drawFunc = {
			Pen.use {
				Pen.width = 0.2;
				Array.fill(data.size,{|i|
					Pen.color = Color.new(data[i][2], data[i][3], data[i][4]);
					Pen.addRect(Rect(data[i][0]*b,data[i][1]*b,b,b));
					Pen.perform(\fill);
				});
			};
		};
       x.clearOnRefresh_( false );
       x.animate = true;
    }.defer;
    { while { run } { 0.1.wait } }.fork(AppClock);
}, '/COLOR');
Imprimer/exporter
QR Code
QR Code wiki:n3_color (generated for current page)