IA… Mais c’est koi ? (4)

Making an artificial intelligence

Bravo vous êtes arrivé au dernier niveau de cette petite (toute petite) introduction à l’intelligence artificielle. Pour ce dernier article, plus de math promis 😉 Cette fois on va s’amuser à programmer notre IA de détection de chat ou de chien. Dans le même esprit que précédemment, nous allons faire très très simple, pas besoin d’être un expert en code, c’est juste pour s’amuser. Nous allons faire ça en Python donc si vous voulez le faire faudra installer Python (https://www.python.org/) Pour écrire le code un simple éditeur de texte comme notepad fonctionne très bien. Je vous conseille Sublime Text (https://www.sublimetext.com/) par ce que j’aime bien et il y a des couleurs différentes de typo pour bien se repérer dans le code, c’est tout joli 😊 Cet article servira aussi d’introduction à la programmation.

Alors ready ?

Python est un langage informatique avec une syntaxe simple et intuitive, très flexible, c’est le candidat idéal pour débuter. Il y a plusieurs manières de programmer, nous allons pour notre cas créer un fichier python : ma_super_ia.py (.py est l’extension utiliser pour les fichiers Python vous l’aurez compris) avec tout notre code. On ouvre un nouveau fichier dans Sublime Text, on le renomme et on choisit la syntaxe Python (menu « View/Syntax/Python »). Maintenant on commencer notre code.

Bon avant de commencer faut peut être définir de façon clair ce que l’on veut faire non ? Ok, on veut pouvoir donner des poids et des tailles de moustaches à notre IA et quelle nous réponde si c’est un chat ou chien. Il faut aussi qu’elle s’entraine pour améliorer ses résultats sur les données qu’elle reçoit. Du coup elle doit pouvoir les stocker. On commence par quoi ? Hum… On est un libre, du coup c’est pas toujours évident de commencer. L’important c’est que le résultats corresponde à ce que l’on cherche à faire. Je vous propose de commencer par l’algorithme de classification.

De quoi l’IA à besoin pour classifier :

  • de la formule de la droite y = ax + b
  • d’un a et d’un b qu’on va arbitrairement choisir au début.
  • des données de poids et de tailles de moustaches

Première étape, définir a et b. En programmation, on appelle ça des variables et c’est très simple de les créer en python. Il suffit de donner un caractère ou même un mot, d’ajouter le signe = et de mettre la valeur que l’on veut. Attention, il y a des règles de syntaxe précises dont je ne vais pas parler ici (suffit de vérifier dans la doc Python si vous êtes curieux)

a = 2
b = 3

Voilà tout simplement. Nous avons stocker la valeur 2 et la valeur 3 dans le caractère a et le caractère b. On les appellera variable a et variable b.

Deuxième étape, écrire notre formule… En fait non, il y a un soucis, avant de définir des actions, formules sur des variables, encore faut il les définir. Si on écrit la formule y = a * x + b (la multiplication c’est * en Python et l’addition + tout simplement), la a et b on les a définit mais le x ? Python ne va pas comprendre. Au passage vous remarquerez que l’on peut attribuer des calculs à une variable (ici le y). Donc x c’est quoi ? Oui la taille de nos moustaches (enfin celles de notre animal). Comme c’est l’utilisateur qui doit donner l’information il nous faut une commande qui lui permet de renseigner cette information. Et magie, il y a une commande pour ça en Python : input(). Elle prend un paramètre entre les parenthèses qui est une chaine de caractères (une phrase quoi) et elle renvoi ce que l’utilisateur a entré. Là encore on va mettre tout ça dans une variable. Si vous voulez afficher ce que l’utilisateur à entré, vous pouvez utiliser la fonction Python print() qui peut afficher le contenu d’une variable. Voyons notre code :

moustaches = input("Merci de donner la taille des moustaches de votre animal")

print("Ce que l'utilisateur a entré :", moustaches)

Cette fois on a utilisé un mot pour définir notre variable plutôt qu’une simple lettre, c’est plus clair comme ça. Dans le print() vous pouvez mettre plusieurs variables ou même des valeurs et du texte (entre guillemets). Il faut veiller à séparer les différents éléments par une virgule. (Attention aux guillemets, le premier ouvre la phrase, le suivant la ferme, il ne faut donc pas en mettre au milieu de la phrase, si c’est obligatoire il faut mettre une barre oblique inversée devant ( \ » ) pour empêcher Python d’interpréter le «  comme la fin du texte)

Pour tester le code, il suffit de le lancer à partir d’un terminal de commande. Si vous êtes sous windows, taper cmd dans la barre de recherche, allez dans le dossier de votre code (pour se déplacer dans les dossier dans le terminal utilisez la commande cd (cd nom_du_dossier ou cd .. pour remonter l’arborescence) puis taper le nom de votre fichier. Il devrait se lancer.

Copie écran du terminal Windows où le code a été exécuté.
Exécution du programme dans le terminal de Windows

Bon jusque là tout va bien (j’espère que c’est le cas aussi pour vous). Maintenant on peut construire notre formule.

Hé attend ! Qu’est ce qui se passe si l’utilisateur entre n’importe quoi ? 😱

Bonne question, très bonne question même ! C’est un bon reflexe en programmation de toujours imaginer les cas tordus ^^ Dans cet exemple je vais considérer que le cas n’arrive jamais mais dans la réalité il faut absolument prendre en compte toutes les possibilités et par exemple vérifier ce que l’utilisateur entre et mettre un message d’erreur si les données ne sont pas celles qu’on attend.

Bon construisons notre formule.

y = a * int(moustaches) + b

Whaaaat ! C’est quoi ce int() ?!

Ah ça… c’est juste pour dire à Python que la valeur dans la variable moustaches est un nombre entier (integer en anglais) sinon il croit que c’est du texte et n’arrive pas à calculer.

Voilà pas très compliqué.

Maintenant, il nous faut calculer la différence entre le y et le poids de l’animal. Mince on a oublié de demander le poids à l’utilisateur !!! Bon maintenant qu’on sait faire ça va être facile.

poids = input("Merci de donner le poids de votre animal :")

print("Le poids de votre animal est de :", poids)

Et maintenant notre formule de comparaison. (on oubli pas de préciser que le poids est un nombre entier)

z = int(poids) - y

Troisième étape, déterminer la race de l’animal. Pour rappel, si z > 0 c’est un chien, et un chat sinon. Ici on a besoin d’une autre technique de programmation : la condition. Cette méthode a une syntaxe assez explicite (surtout pour les anglophone) : if … else …

if z > 0:
    print("C'est un chien.")
else:
    print("C'est un chat.")

Attention, l’indentation est très importante ici. Elle peut être de 2 ou 4 espaces (une tabulation) et ne pas oublier les : après if et else. On peut tester maintenant notre code 😀

Capture d'écran du terminal où le programme a été lancé.
Extrait du terminal avec les résultats du programme lancé

HOURRA !!! Ca marche !!!! C’est bôôôô ! … Mais elle apprend pas notre IA là ?

Oui ! Faut programmer ça. Aller on se lance.

Quatrième étape, créer une base de données de chats et de chiens.

Oula… ça parait bien compliqué ça !!

Pas d’inquiétude, on va faire simple. On va créer une nouvelle variable de type liste qui contiendra nos données. Une liste est une forme de variable spéciale pouvant contenir d’autres variables et on peut mettre des listes dans des listes comme des poupées russes. Notre liste contiendra les listes des valeurs pour chaque animal. Les valeurs à l’intérieur des listes sont séparées par des virgules et les listes sont indiquées par des crochets. Par exemple : la liste [1,2,3] contient les valeurs 1, 2 et 3. Pour nous la première valeur sera le poids, la seconde la taille des moustaches et enfin le label 0 ou 1 (chat ou chien).

bdd = [ [3, 8, 0], [8, 6, 1], [5, 10, 0], [12, 6, 1] ]

On arrive à la partie compliquée.

Comme si c’était pas déjà compliqué ! 😡

Vous inquiétez pas on y va doucement. Notre programme doit récupérer les données et les traitées. Comme on ne connait pas à l’avance la taille de la liste, il faut que le programme se débrouille pour itérer sur chaque éléments. Voilà grossièrement l’algorithme que nous allons mettre en place :

  1. Récupération de la première liste de la bdd ( [ 3, 8, 0 ] )
  2. Récupération des différentes valeurs de la liste et sauvegarde de ces valeurs dans des variables
  3. Calcul avec ces données
  4. Calcul de l’erreur avec le label
  5. Ajout de l’erreur à la somme des erreurs
  6. Récupération de la liste suivante dans bdd
  7. On recommence les étapes à partir de 2 jusqu’à la fin de la liste bdd
  8. Calcul de la moyenne des erreurs
  9. Mise à jour de la variable a selon la moyenne des erreurs.

Pour parcourir des listes en Python il y a une méthode simple : la boucle for. Voilà une exemple :

for animal in bdd:
    print(animal)

Voici comme elle fonctionne, d’abord elle récupère le premier élément de la liste bdd, elle met cet élément dans la variable animal puis effectue les actions décrites à l’intérieur (tous ce qui est indenté) ici elle affiche (print) la valeur de la la variable animal. Ensuite, elle passe au second élément de la liste, met dans la variable animal (l’ancienne valeur est écrasée) et ainsi de suite jusqu’à ce que la liste soit terminée.

Les boucles peuvent s’imbriquer les unes dans les autres (même si ce n’est pas trop conseillé de le faire pour des raisons d’efficacité de calculs).

Une autre possibilité est d’utiliser l’index des éléments car les listes sont ordonnées. L’index commence par 0, du coup si on tape bdd[0] on va récupérer les premier élément de la liste. Si on veut le troisième élément : bdd[2] et si on sort de la liste, Python va planter !

On sait parcourir notre bdd, il nous faut pouvoir gérer les erreurs maintenant. Le but étant de faire la moyenne des erreurs, il faut en faire la somme puis diviser par leur nombre. Pour incrémenter, c’est simple, il suffit de prendre notre nombre somme des erreurs puis de lui rajouter la valeur de l’erreur et d’attribuer ce résultats à notre variable somme. Voilà la syntaxe :

somme = somme + nombre

Hé ! mais là on ne sait pas le nombre d’erreurs pour faire la moyenne.

C’est vrai, on pourrait faire un nombre qui s’incrémente de 1 à chaque itération mais bon on sait que ce nombre correspond au nombre d’éléments de la liste bdd et évidement Python a une méthode pour avoir la taille d’une liste : len() (pour length en anglais)

Voilà on a tous ce qui nous faut pour faire notre boucle d’entrainement.

bdd = [ [3, 8, 0], [8, 6, 1], [5, 10, 0], [12, 6, 1] ]

somme_erreurs = 0

for animal in bdd:
	poids = animal[0]
	moustaches = animal[1]
	label = animal[2]

	y = a * moustaches + b
	z = poids - y
	if z > 0:
		classification = 1
	else:
		classification = 0

	erreur = classification - label
	somme_erreurs = somme_erreurs + erreur

moy_erreurs = somme_erreurs / len(bdd)

Voilà. Le point important, il faut créer la variable somme_erreurs avant de l’utiliser en incrémentation (avant d’entrer dans la boucle ici). C’est logique mais c’est une erreur classique.

Et maintenant on a presque fini 😊, il nous faut maintenant calculer le nouveau a pour modifier la pente de notre droite. Easy n’est ce pas ?

a = a + moy_erreurs

print("Notre nouveau a :", a)

Maintenant vous pouvez mettre à jour votre programme avec le nouveau a. C’est fini 😁

Euh… Attend, c’est l’arnaque là. On doit faire la mise à jour du code à la main ?! 😢 T’aurais pas un moyen d’automatiser ça ? 🥺

Bon ok, mais je vous explique rien😈

D’abord il faut créer un fichier texte a.txt avec juste la valeur au hasard de a. Ensuite il faut transformer le code comme ci-dessous au début.

file = open("a.txt", "r")

a = float(file.read())
b = 3

Enfin, la fin du code ressemble à ça :

a = a + moy_erreurs

file = open("a.txt", "w")

file.write(str(a))
file.close()

Et le résultat :

Affichage de l’exécution du programme dans le terminal

Je vous laisse vérifier que le fichier a.txt est bien actualisé.

Voilà c’est fini ! Ouf ! C’était un gros morceau. Vous êtes des génies maintenant et moi je peux aller me coucher😴

Notre série introductive à l’IA est maintenant terminée mais vous inquiétez pas, bientôt de nouveaux épisodes bien plus complexe maintenant que vous êtes des pros ^^

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.