CREATION ARTIFICIELLE PAR CONNECVOLUTION
Auteur: Michel Bret, juin 2007
Matériel : PC , système Windows XP,1Go de mémoire, processeur à 3Gh minimum
carte graphique GeFORCE4 64Mo minimum
Logiciel : anyflo version 9.1
Exécutables :
anyflo.exe : Anyflo version 9.1 de juin 2007.
cjpeg.exe, djpeg.exe : Lecture écriture d’images en format jpg
*.h : fichiers de lancement
*.dll : link dynamique
images.js : script java de lancement
dossier env contenant les fichiers *.h de configuration
dossier uti contenant :
images.fon : fichier source écrit en langage anyflo
CON_fra et CON_eng : interfaces française et anglaise
D’autres langues peuvent être ajoutées (il suffit de créer un fichier CON_xxx, une entrée case « xxx » : dans la fonction OPT_CON() et préciser xxx à la place de far dans le fichier images.js ).
*.jpg, *.bmp : images
*.par : paramètres
*.res : réseaux neuronaux.
Dossier ima contenant les images xxxx.bmp (voir g et G).
2-1
Système de création artificielle
Je propose une méthode de construction d’un système de création artificielle qui observe son environnement en catégorisant ses perceptions à l’aide d’apprentissages non supervisés. Ainsi à chaque perception correspond un certain état d’une mémoire associative. Si l’on code ces états comme une population de génomes, il est possible de leur appliquer une évolution darwinienne (par des algorithmes génétiques) visant à favoriser ceux qui répondent le mieux à une certaine fonction d’évaluation. Une façon de les noter serait de noter l’image (qui n’existe pas) lui correspondant, ce qui suppose que soit trouvée une méthode de « remontée » du réseau. Pour cela on peut utiliser un apprentissage supervisé sur le réseau inverse (obtenu en permutant les entrées et les sorties), les couples d’apprentissages étant les couples inverses (état, expérience) du premier apprentissage. Ainsi à tout nouvel état obtenu par croisement de deux états correspond une nouvelle image qu’il suffit alors d’évaluer.
J’ai réalisé une application artistique en proposant en entrée de réseaux neuronaux de très nombreuses images, lesquelles génèrent une population d’états dont les enfants donnent, en remontant le réseau, une infinité de nouvelles images. Une expérimentation analogue pourrait être tentée avec de la musique.
2-2
Rêves artificiels
Résumons ce que Damasio appelle le proto-soi : un
organisme est cartographié dans son cerveau, un objet (réel ou remémoré)
interagissant avec lui y est également cartographié : il s’agit de
cartographies du premier ordre qui sont des configurations neuronales (ou
images mentales). Les changements de ces cartes donnent lieu à d’autres
cartographies, du second ordre, représentant la relation entre l’objet et
l’organisme. Il y a production de
conscience-noyau chaque fois qu'un objet interagit avec l'organisme en
modifiant le proto-soi et en construisant de nouvelles connaissances. Les
informations neuronales correspondantes peuvent devenir des images,
représentées à leur tour dans des cartes de second ordre donnant naissance à
des sentiments. Être conscient, c'est être capable de se représenter certaines
de ses représentations.
La conscience-noyau résulte du flux des
impulsions provoquées par les interactions avec les objets : objets du
monde réel, mais aussi perceptions de l'état du corps, et encore évocations
d’images mentales mémorisées (objets pensés).
Le soi-central apparaît dès qu'un objet modifie le proto-soi. Au-delà du
soi-central, nous trouverons le soi-autobiographique, constitué de souvenirs
implicites d'expériences antérieures, des prévisions simulées de ce qui peut se
produire compte tenu de ces expériences passées et des états actuels du corps
(souvenirs du futur). Le soi-autobiographique se développe ensuite en la
conscience étendue lors d’interactions sociales avec d'autres organismes.
Je propose de faire rêver un être artificiel
en simulant ces différents niveaux de conscience : des configurations
neuronales du premier ordre cartographieront, sous forme d’images mentales, la
perception d’images réelles (proto-soi). Un changement de ces cartes par
évolution génétique sera une représentation, au second ordre, de la
relation entre les images et l’organisme (conscience noyau), qui produira de
nouvelles images mentales. Par un processus inverse (allant du mental au réel)
l’organisme pourra alors interagir socialement avec d’autres organismes pour,
peut-être, atteindre un degré de conscience plus élevé.
2-3
Conception du système
Une rétine, sur laquelle viennent s’inscrire des images, se projette sur la couche d’entrée d’un réseau neuronal. L’activation neuronale se propage jusqu’à la couche de sortie qui est interprétée comme un code. En fait plusieurs réseaux sont utilisés : 3 pour chacune des composantes rouge, verte et bleue de la couleur, et un quatrième prenant en entrée des informations géométriques (à partir d’extractions de contours). Plusieurs couples (image,code) sont présentées aux réseaux qui s’auto configurent au cours d’apprentissages.
Ces 4 populations de codes sont traitées par des algorithmes génétiques qui les croisent et les mutent en optimisant certaines fonctions d’adaptation (comme la convergence des luminances ou des distributions de contours).
On définit 4 réseaux inverses obtenus en permutant les entrées et les sorties des réseaux d’origine. Remarquons que leurs topologies ont changées (nombre différents de neurones sur les couches) et qu’il faut donc les redéfinir. Il faut aussi les reconfigurer par les apprentissages dont les couples sont les inverses (code,image) des couples (image,code) utilisés dans les apprentissages des réseaux directs.
Chaque nouveau code obtenu par croisement génère une nouvelle image en remontant les réseaux inverses.
Ces nouvelles images peuvent être intégrées à l’ensemble des images vues par le système et faire partie des couples de nouveaux apprentissages.
Le système peut ainsi fonctionner indéfiniment en générant sans cesse de nouvelles images.
3-1
Lancement
Cliquer sur images.js
Un menu apparaît :
CON HEL VER EXP
IMA GEN RES PAR CRO AFI AFG . GAR . EXIT DEB
HEL : donne le help général
VER : mode verbose (des messages
s’affichent en haut de l’écran à chaque action)
EXP : explications
IMA : gestion des images
GEN : gestion des génotypes
RES : réseaux neuronaux
PAR : paramètres
CRO : croisement de génotypes
AFI : affichage des images
AFG : affichage des génotypes
EXIT : quitter le programme
DEB : debuging
Cliquer sur l’un de
ces items affiche le menu correspondant en dessous du menu principal. Chacun de
ces menus contient une case HEL donnant le help particulier pour ce menu
3-2
Description des cases du menu principal
3-2-1 HEL
Affiche le help général.
3-2-2 VER
Mode verbose (des
messages s’affichent en haut de l’écran à chaque action).
3-2-3 EXP
Menu des
explications :
* IMAGES
RESEAUX CODES ALGO_GENE NOUV_IMA NOUV_IMA
IMAGES : Deux images de base apparaissent à
gauche
RESEAUX : Un réseau multi couches apparaît avec :
une couche d’entrée (en rouge) connectée aux pixels de la rétine
une couche cachée (en gris)
une couche de sortie (en vert) connectée aux codes
la matrice des poids synaptiques
CODES : Chaque image donne lieu à un code à
travers le réseau
ALGO GENE : Cliquer dans le cadre gris croise
les deux codes et construit un nouveau code
NOUV IMA : Le réseau inverse (obtenu en
échangeant les entrées et les sorties du 1er réseau) apparaît avec
sa matrice de poids synaptiques. Cliquer dans le cadre gris croise les deux
codes et construit un nouveau code qui, par remontée du réseau inverse,
construit une nouvelle image.
NOUV IMA : Même opération pour un autre
croisement.
3-2-4 IMA
Menu des images :
IMA HEL LIR GAR NUM ALE VAL SUP INI
HEL : donne le help de ce menu
LIR :
La liste des noms des images présentes apparaît à droite, cliquer sur l’un d’eux charge l’image et l’affiche à gauche, s’il y en a trop augmenter le nombre d’images par lignes sur l’échelle nb.
Changer l’extension en cliquant sur jpg ou bmp.
Changer de dossier en cliquant sur son nom
GAR : non implémenté
NUM : Les numéros des images sont affichés
ALE : génère une image aléatoire
SUP : supprime la dernière image chargée
INI : supprime toutes les images chargées.
L’échelle nb permet de choisir le nombre d’images affichées par ligne
3-2-5 GEN
Menu des génotypes:
GEN HEL LIR
GAR NUM ALE IMA SUP INI
HEL: donne le help de ce menu
LIR :
La liste des noms des fichiers *.gen des génotypes apparaît à droite, cliquer sur l’un d’eux le charge et l’affiche à gauche.
GAR : non implémenté
NUM : Les génotypes sont affichés numériquement
ALE : génère un génotype aléatoire
IMA : génére un génotype à partir d’une image préalablement cliquée (AFI pour les afficher)
SUP : supprime le dernier génotype
INI : supprime tous lesgénotypes.
3-2-6 RES
Menu des réseaux:
RES HEL MAT ACQ MOT LOI APP STO VOI BAS SEQ INV SUP INI
HEL: donne le help de ce menu
MAT : affiche la matrice des poids synaptiques
ACQ : début de construction
MOT : début de définition des motifs d’entrés
LOI : début de définition des lois de sortie
APP : lancement de l’apprentissage
STO : stopper l’apprentissage
VOI : visualisation du réseau, cliquer sur l’un
des motifs, la loi correspondante est affichée.
BAS : bascule vers le réseau inverse
SEQ : parallélisation des apprentissages.
INV : construit et entraîne le réseau inverse.
SUP : supprime le dernier couple
d’apprentissage.
INI : supprime tous les réseaux.
3-2-7 PAR
Menu des paramètres:
PAR HEL
MUL KOH COM I->I I->G G->I G->G V->G GAR LIR
HEL: donne le help de ce menu
MUL : réseau de type multi couches
KOH : réseau de Kohonen
COM : réseau complètement connecté
I->I : entrée = images, sorties = images
G->I : entrée = génotypes, sorties =images
G->G : entrée = génotypes, sorties = génotypes
V->G : entrée = voisins, sorties = génotypes
GAR :
La liste des noms des fichiers XXX.par des paramètres apparaît à droite, cliquer sur l’un d’eux écrit le fichier XXX.par ainsi que tous les réseaux présents en mémoire dans le fichier XXX.res.
LIR :
La liste des noms des fichiers XXX.par des paramètres
apparaît à droite, cliquer sur l’un d’eux le lit, lit les réseaux XXX.res
correspondants, ainsi que les images correspondantes.
L’échelle type mot permet de choisir le type des
motifs d’entrée :
L :
luminance
LP : luminance +
paramètres
RVB : couleurs
RVBL : couleurs + paramètres
L’échelle rétine permet de choisir la taille de la rétine qui apparaît à droite (en blanc)
L’échelle sous_ima permet de choisir le nombre de partage de la rétine en sous images (en rouge)
L’échelle par permet de choisir la dimension des individus de la population des algorithmes génétiques.
L’échelle gen permet de choisir la taille des génotypes.
L’échelle luminance permet de choisir la luminance.
L’échelle cou permet de choisir la couleur des contours :
<0 : automatique
entre 0 et 1 : du noir au blanc.
L’échelle cont permet de choisir l’épaisseur des contours.
L’échelle cache permet de choisir le nombre de couches cachées des réseaux multi couches.
3-2-8 CRO
Menu des croisements:
CRO HEL
IT1 IT2 CRO CON ALE SEL TES SUI
HEL: donne le help de ce menu
IT1 : Cliquer sur un premier élément d’entrée,
celui ci s’affiche à droite.
IT2 : Cliquer sur un deuxième élément d’entrée,
celui ci s’affiche à droite.
CRO : lance les croisements sur ces deux
éléments.
CON : lance les croisements sur des couples aléatoires d’éléments
SEL : lance le module d’algorithmes génétiques,
choisir les éléments sur l’échelle num_ima
TES : mode pas à pas
SUI : image suivante du mode pas à pas
L’échelle inter permet de choisir le pas d’interpolation
L’échelle cont permet de choisir le type des contours :
* : pas de contour
CON : contours
PIX : pixels
L’échelle dim permet de choisir la dimension de l’image affichée lors des croisements :
1 : taille de la rétine
2 : taille des images affichées
3 : taille des images chargées (choisir la taille sur l’échelle gra).
L’échelle gra permet de choisir la taille des grandes images
Les échelles tran permettent de choisir les bornes de l’aléatoire des transparences.
L’échelle lisse permet de choisir l’épaiseur des contours.
L’échelle num_ima permet de choisir le numéro de
l’élément traité par les génétiques :
-1 : tous
0 : aucun
sinon le numéro cliqué
3-2-9 AFI
Affiche les images d’entrée
3-2-10 AFG
Affiche les génotypes de sortie
3-2-12 EXIT
Sort du programme.
3-2-13 DEB
Mode debugging.
3-3
Raccourcis clavier
h: donne le help général
g: gare l’image courante.
G: gare l’image obtenue par croisement.
Les images sont garées dans les fichiers ima/xxxx.bmp, xxx est automatiquement incréménté. Le numéro xxxx est réinitialisé à 1 au lancement du programme. Pour l’initialiser à 100 passer l’option « num=100 ».
$ : mode verbose (comme VER)
q : quitte le programme (comme EXIT)
4-1
Exemple transformant des images en codes
1) Commencer par définir le type du réseau dans le menu
PAR :
cliquer sur I->G (images -> génotypes).
Cliquer sur RVBP de
l’échelle type_mot (couleurs + paramètres).
2) Puis rentrer des images : IMA->LIR, cliquer sur des noms, les images chargées apparaissent à gauche, s’il y en a trop augmenter le nombre d’images par ligne sur l’échelle nb.
4) Saisir des couples d’apprentissage dans le menu RES :
Cliquer sur RES->ACQ : un réseau est construit et apparaît à droite
Cliquer sur RES->MOT puis sur des images qui sont chargées en entrée et apparaissent en haut et à droite
Cliquer sur RES->GEN puis sur autant de génotypes qui sont chargées en sortiee et apparaissent en dessous
5) Entraîner le réseau en cliquant sur RES->APP :
4 courbes d’erreur sont affichées en rouge, vert, bleu et jaune correspondant respectivement aux réseaux rouge, vert, bleu et paramètres,
ainsi que les valeurs des erreurs courantes (qui sont remplacées par noise en cas de réinitialisation automatique, lorsque l’erreur reste longtemps trop élevée).
La case noise permet de bruiter les matrices des poids synaptiques.
Deux échelles montrent l’évolution des constantes d’apprentissage (modifiables).
Une échelle montre le maximum et le compteur des réinitialisations (modifiables).
Il est possible de contrôler l’apprentissage en agissant sur ces échelles.
6) Stopper l’apprentissage, lorsque les erreurs sont
suffisamment petites, en cliquant sur RES->STO.
7) Inverser le réseau en cliquant sur RES_>INV, ce qui provoque la construction et l’apprentissage du réseau inverse.
8) Pour voir les réseaux :
Cliquer sur RES_>VOI, puis sur un élément d’entrée, la sortie apparaît à droite.
Pour voir le réseau inverse cliquer sur RES->INV puis sur RES_>VOI, puis sur un élément d’entrée, la sortie apparaît à droite.
9) Croiser deux codes en cliquant sur CRO
Cliquer sur CRO->IT1 puis sur une image, celle ci apparaît à droite.
Cliquer sur CRO->IT2 puis sur une image, celle ci apparaît en dessous.
Cliquer sur CRO->CRO, ce qui provoque des croisements interpolés entre ces 2 images (régler le pas d’interpolation sur l’échelle inter).
Pour voir les images une par une, cliquer sur CRO->TES, puis successivement sur CRO->SUI.
Pour faire apparaître les contours cliquer sur CONT de l’échelle cont.
Pour faire
apparaître les pixels cliquer sur PIX de l’échelle cont.
Pour voir les images en grande dimension cliquer sur 3 de l’échelle dim. On peut changer la dimension en cliquant sur l’échelle gra, ces images apparaissent en bas et à gauche.
10) Croiser tous les codes en cliquant sur CRO->CON
11) Croiser aléatoirement tous les codes en cliquant sur CRO->ALE
12) Croiser en optimisant une fonction d’évaluation en
cliquant sur CRO->SEL
L’échelle mut permet de choisir le taux de mutation
L’échelle
num_ima permet de choisir le numéro de l’élément traité :
-1 :
tous
0 :
aucun
sinon le numéro cliqué
Les bornes de la transparence aléatoire peuvent être changées :
Cliquer
sur les deux échelles tran
13) Pour écrire les images croisées enfoncer la touche G .Ces images sont garées dans les fichiers ima/xxxx.bmp
4-2
Deuxième exemple transformant des voisinages en codes
5-1
Fichiers source
Le fichier source images.fon, écrit en langage
anyflo, se trouve dans le dossier uti ainsi que les fichier CON_fra et
CON_eng correspondant aux interfaces française et anglaise.
5-2
Fonctions principales
Fonction principale images(w) :
w est la liste des options passées entre « « à la fonction OPT_CON(w) :
fra : français, le fichier CON_fra est lu
eng : anglais, le fichier CON_eng est lu
nom=nn, les images sont stockées dans les fichiers nnxxxx.bmp (ima/xxxx.bmp par défaut)
ext=xxx extension des images (bmp par défaut)
num=n, les images sont stockées à partir du numéro n (1 par défaut)
Fonction externes() : définit les externes, elle peut être déclarée en tête de chaque fonction
#include « externes() »
Fonction OPT_CON(w) traitant les options
Fonction INI_CON(langue) faisant les initialisatu=ions
Fonction F0() appelée une seule fois en début d’interaction définissant les menus et les flags.
Fonction F5() appelée à chaque image :
Traitement du menu courant :
Menu EXP appelle aff_EXP()
Menu IMA
affiche les
échelles nb et gra
lit
éventuellement des images par lire_CON_IMA()
Menu GEN
affiche l’échelle d
lit éventuellement des génotypes par lire_CON_GEN()
Menu PAR : affiche, gare et lit éventuellement des paramètres
Menu CRO : croisements
Affichage éventuel des images et des génotypes
Affichage éventuel du help
Gare éventuellement les images croisées.
5-2
Fonctions des menus
La fonction set_CON() définit les menus d’après le fichier Con_langue chargé
Les fonctions du menu principal : CON_XXX()
Les fonctions du menu EXP
Les fonctions CON_IMA_XXX() du menu IMA
Les fonctions CON_GEN_XXX() du menu GEN
Les fonctions CON_RES_XXX() du menu RES
Les fonctions CON_PAR_XXX() du menu PAR
Les fonctions CON_CRO_XXX() du menu CRO
D’autres fonctions particulières à chaque menu existent aussi.
5-3
Les structures de données
5-3-1 Objets
traités
Des images repérées par leurs numéros
num+Inc_ORI : images originales (taille sur le disque)
num +Inc_AFF: affichable de taille (D_IMA,D_IMA]
num+Inc_RET : rétinienne de taille [Nb_S_IMA*(N_RET,N_RET)]
num +Inc_GRA: grande de taille [D_GRA,D_GRA]
Elles peuvent être garées dans le dossier ima sous le non générique xxx.bmp. Leur nom peut être changé :
Nom_Image= « ima/
Des réseaux neuronaux repérés par leurs numéros.
Des génétiques repérées par leurs numéros.
3 buffers Buf_GEN1, Buf_GEN2 et Buf_GEN3 stockant les génotypes.
5-3-2 Construction d’un réseau
Les motifs d’entrée sont :
Des images si Type_Entree=IMA ou VOI
Des génotypes si Type_Entree=GEN
Des paramètres si Type_Entree=PAR
De même les lois de sortie sont :
Des images si Type_Sortie=IMA ou VOI
Des génotypes si Type_Sortie=GEN
Des paramètres si Type_Sortie=PAR
meta input reseau(num)=Type_Entree
meta print reseau(num)=Type_Sortie
meta image reseau(num)=numéros des images en entrée
Lors de l’apprentissage :
meta erreur reseau(num) contient la liste des erreurs récentes
meta valider reseau(num) contient l’évaluation du réseau :
(nombre de passes, erreur, flag), sortie si flag=1
5-3-3 Construction d’une génétique
Les particules sont des chaînes de bits obtenus à partir de
valeurs numériques v par la fonction gen_part(v)
La fonction
d’adaptation est fonc_gen(g,num,p) qui retourne la moyenne de la particule p,
elle peut être changée.
Une valeur numérique est donnée à partir
d’une particule p par la fonction part_gen(p)
Croisement : selon le paramètre Type_CRO :
CRO_SEL :
croisement et mutation par les génétiques
CRO_CRO :
croisement simple des génotypes correspondant à 2 images définies par IT1
et IT2
CRO_CON :
croisement simple des
génotypes correspondant à des images choisies aléatoirement
Dans tous les cas les 2 images de base sont
mélangées après avoir été traitées par les lois paramétriques.
5-3-4
Remontée des réseaux
Croisements simples :
L’image rétinienne est copiée en Num_RET2 et
passée en entrée du réseau direct qui délivre en sortie le génotype qu’il stocke.
Lorsque l’on croise desu génotypes, le
génotype obtenu est passé en entrée du
réseau inverse qui délivre en sortie la nouvelle image.
Pour MOT_L :
ima_gen_1() copie
l’image rétinienne en Num_RET2 et stocke le génotype correspondant.
inv_ima_gen_1()
passe le génotype en entrée du réseau inverse et trouve en sortie la nouvelle
image.
Pour et MOT_L_P
Mêmes
opérations sur les réseaux des paramètres.
Pour MOT_RVB :
ima_gen_3()copie
l’image rétinienne en Num_RET2 et stocke le génotype correspondant.
inv_ima_gen_3()passe
le génotype en entrée du réseau inverse et trouve en sortie la nouvelle image.
Pour et MOT_RVB_P
Mêmes
opérations sur les réseaux des paramètres.
croisements et mutations par les génétiques
Les populations de codes et de paramètres
sont régénérées à chaque image.
Chaque particule (individu d’une population)
est un code qui est passés en entrée des réseaux inverses qui délivrent une
première image.
S’il y a une génétique de paramètres (pour
MOT_L_P et MOT_RVB_P), la particule correspondante, qui est un paramètre, est
passée au réseau inverse, et donne des paramètres. Les parents de cette
particule donnent de même 2 images que l’on mélange avec la première image et
que l’on traite selon les paramètres.
Pour MOT_L et MOT_L_P :
Genetique_ima_gen_1()
Pour MOT_RVB et MOT_RVB_P
Genetique_ima_gen_3()