mardi 9 septembre 2014

Mise à niveau informatique (module INF3036) (cours 2)

Fin du jeu de pendu 


Le prochain cours à lieu le 16 septembre. D'ici là vous devrez essayer de finaliser le jeu de pendu par vous même.

Je ne passerai qu'une 1/2 h pour répondre à vos question et présenter le dernier point qui est  "comment déterminer la fin de la partie?".

Maintenant qu'on a revu , par la pratique les éléments de base de la programmation (structure d'un programme, structures de contrôles variables simples et tableaux), nous allons passer au programme de deuxième année.

La leçon d'aujourd'hui portera sur ...

L'allocation mémoire

Pour comprendre la manière dont la mémoire est gérée par l'ordinateur (et en particulier dans un programme en langage C), nous allons faire une série "d'expériences", à l'issue desquelles je vous donnerai des informations permettant d'expliquer les comportements observés.

Expérience 0

Écrivez un programme qui alloue un tableau de 100 cases de valeurs entière et qui met la valeur 12 dans chacune des cases,puis affichez le contenu de la dernière case.
Cette "expérience" ne devrait normalement vous poser aucun problème et le résultat est , normalement, tout à fait prévisible, et sans surprise.

Expérience 1

Augmentez la taille du tableau du programme précédent, passez de 100 cases à 1000, et re-testez le.
Puis 10000, puis 100000, etc.... et testez votre programme à chaque fois.
À un moment ce programme ne marchera plus...
Pourquoi ? (quelle est la taille de la mémoire disponible?)

Après une explication nous verrons le fonctionnement de la fonction malloc.

Expérience 2

Re-écrivez le programme précédent en utilisant la fonction malloc pour faire une allocation "manuelle" en lieu et place de l'allocation "automatique" précédente.
Est-ce que ça marche mieux ? Pourquoi ?

Expérience 3

Maintenant que vous arrivez compris qu'une allocation ne marche pas forcément à tous les coup, écrivez un test vous permettant de savoir si l'allocation à réussi, avant d'écrire en mémoire...

Expérience 4

Maintenant que vous savez réservez des zones mémoire. essayer de vous accaparer un maximum de mémoire. Pour cela utilisez une boucle infinie. Grâce au programme "top" mesurez quel pourcentage de la mémoire vous arrivez à utiliser. Essayez (par tout les moyens que vous trouverez raisonnable) d'en avoir le plus possible.
Que se passe-t-il quand l'ordinateur commence à manquer de mémoire ?

Expérience 5

Vous comprenez maintenant qu'il nous faut donc une instruction pour rendre la mémoire au système, une fois qu'on en a plus besoin... Cela se fait via l'instruction free.
Modifiez votre dernier programme de manière à ce qu'il libère les zones mémoire qu'il n'utilise plus. Voyez la différence de comportement de l'ordinateur lors de l'exécution de cette nouvelle version du programme.
Pour encore mieux percevoir l'état de l'ordinateur, utilisez un "moniteur système" (ou "system load indicator") que vous trouverez via la barre d'applications. Un peu comme le compte tour ou la mesure de température d'un moteur de voiture, un "moniteur système" vous indique votre consommation des ressources de l'ordinateur.
Bien sûr plus un programme est économe, mieux c'est.

Expérience 6

Relancez l'"expérience 4", tout en surveillant votre moniteur système pour mieux comprendre/voir ce qu'il se passe.
À quoi peuvent servir les autres mesures du moniteur système ? ("load", "disk", "net") ?

Expérience 7

Reprenez votre programme de jeu de pendu, et remplacez toutes les allocations "automatique" (avec l'opérateur []), par une allocation "manuelle" (via la fonction malloc). Pensez aussi que pour faire un bon programme vous devrez aussi libérer ces zones mémoire via free (une fois que vous n'avez plus besoin des données correspondantes). Testez à nouveau votre programme pour vérifier que ces modifications n'ont pas généré de bug.

Profitez aussi de cette reprise en main du programme de jeu de pendu pour commenter votre code.
Pour rappel; commenter un code veux dire ajouter des annotations en langage naturel facilitant la compréhension du programme. Pour éviter que le compilateur lise ces information utilisez la suite de symbole // pour signifier au compilateur de ne pas lire ce qui suit.
exemple :  
   printf("hello world!\n"); // ceci est un commentaire

Conclusion

Listez toutes les propriétés et informations importantes concernant la mémoire que vous avez appris aujourd'hui.

Travail personnel

Votre programme de jeu de pendu est fonctionnel, mais très vraisemblablement vous avez mis un certain temps pour faire l'"expérience 7", car vous avez , naturellement mis du temps à comprendre à nouveau ce que fait chaque ligne du programme.

Pour éviter cela il est bon d'organiser son code avec des fonctions. Vous allez donc découper l'ensemble du code du jeu de pendu en fonctions qui s'occuperons de différents aspects du jeu.
Par exemple (il y a des tas de manière différentes de faire ce découpage) :

  • Allocation de tableaux de caractère (utilisé pour le "mot secret" et "le mot masque")
  • Initialisation du mot masque
  • Tester si la lettre proposée est présente, ou non, dans le mot secret (et modification éventuelle du mot masque)
Bien sur une fois ces fonctions crées il vous faudra modifier le code dans le main pour qu'il utilise ces fonctions. Idéalement le code qui reste dans le main n'est plus que des appels de fonctions. Si le nom des fonctions et des variables ont bien été choisit , ce code devient alors très facile à lire.


lundi 8 septembre 2014

Mise à niveau informatique (module INF3036) (cours 1)

(... déstiné aux nouveaux étudiants entrant en 3A)

Le séminaire de pré-rentrée que vous avez suivit visait à vous amener à un niveau de fin de première année. Il reste maintenant vous amener à un niveau de fin de deuxième année, pour cela nous avons une douzaine de séances de TP en salle informatique. C'est évidemment peu pour remplacer toute une année, mais si vous fournissez suffisamment de travail personnel, ça devrait faire l'affaire...

À l'issue de la fin de ce cours vous (ainsi que tous les étudiants de 3A) aurez un travail en C à réaliser en autonomie (LAB3040), qui sera bien sûr noté. Pour vous faire une idée du niveau de difficulté vous pouvez voir la vidéo de débriefing du projet de l'an dernier.

Pour faire le point de là où vous en êtes je vous propose, le 9 septembre, de programmer un petit jeux très simple mais qui permet de revoir tout les points travaillés lors du séminaire. Il s'agit du "jeux de pendu". Vous ne programmerez que les saisies au clavier, les affichages de l'évolution du jeu, mais bien sûr aucun graphisme. Une première saisie spécifiera le mot secret (le mot à deviner), cette saisie est supposée faite par le "maître du jeu". Les saisies suivantes seront faites par le joueur , et c'est le programme qui utilisera ces saisies et les comparera au mot secret, pour indiquer au joueur s'il progresse ou non.

  • Commencez par faire diagramme du jeu,
  • puis une description en pseudo code,
  • et enfin la réalisation en langage C. Quelques conseils : 
    • Vous réaliserez le code étape par étape, en vérifiant que tout fonctionne avant de passer à la suivante.
    • À chaque étape vous devez pouvoir vous situer précisément sur le diagramme global du jeu.

Les 3 heures de temps dont nous disposons devraient normalement suffire pour arriver au bout du problème ou du moins l'avancer suffisamment pour pouvoir le finir en travail personnel.

Les séances de la semaine suivante pourront servir à répondre à vos questions ou pour vous aider à finaliser certain détails, mais ce programme devra être globalement fini pour la séance du 16 septembre.

bon courage, et au travail ;)

lundi 1 septembre 2014

Nouveau Logo !

Voici un "presque-scoop" : l'école change de logo. Il n'est même pas encore mis à jour sur le site officiel ESIEA. Pour cette nouvelle rentrée nous avons maintenant un nouveau logo, dévoilé publiquement aujourd'hui.
On y gagne en sobriété, mais pour moi la vrai nouveauté est qu'on ne décline plus l'acronyme : pas d'explication sur le sens des lettres qui compose le nom de l'école. Mais on y gagne un sous-titre : "école d'ingénieur du monde numérique", ce qui est peut être plus explicite pour les prospects.

Et vous qu'en pensez vous ?

mardi 26 août 2014

séminaire de mise à niveau informatique

Bienvenue aux nouveaux étudiants, entrant en 2A et 3A!

Durant cette semaine vous allez faire une partie du programme d'informatique en accéléré.
L'objectif est de vous mettre au niveau de vos camarades ayant déjà commencé leur formation à l'ESIEA.

Pour cela vous avez des cours en amphi mais aussi des Travaux dirigés ainsi que du travail personnel à fournir.

Pour cela ce document va vous guider.

mardi 10 juin 2014

Transfert réussi !!

Pour des raisons techniques j'ai décidé de faire transférer mon blog professionnel sur Blogspot. Cela ne changera rien à son contenu, vous y trouverez toujours des ressources pour mes cours algorithmique, réseaux neuronaux,  projets étudiants et projets de recherche  ...

Merci aux étudiants : Serre Kevin, Al Hakawati Mouaz et Fabbro Alexis pour leur travail.

dimanche 1 juin 2014

Analyse Sémantique Automatique



Analyse Semantique automatique from Hubert Wassner on Vimeo.


La sémantique est la science qui s'intéresse au sens des mots. C'est un défi majeur des technologies de l'information, tout simplement parce que la notion de sens attaché à un mot est implicite lors de n'importe quelle requête d'un utilisateur. Le problème est qu'informatiquement c'est difficile à gérer. Heureusement, dans de nombreux cas, on peut se satisfaire d'une mesure de distance sémantique. C'est à dire mesurer la similarité de sens de deux mots. Il est possible de mesurer automatiquement ce type de distance. (Cf. L'article original : « Automatic Meaning Discovery using Google » , Paul Vitanyi et Rudi Cilibrasi). Ainsi, pour une liste de mots donnés on peut mesurer les distances qu'ils ont les uns par rapport aux autres, et créer une « carte ». ...
Cette technique nous a déjà permis de générer deux cartes, une cartographie de bloggeurs, et une cartographie d'auteurs. Aujourd'hui nous avons réalisé une cartographie sémantique de métiers, pour le compte de Meteojob (nouveau site d'offres d'emplois). L'objectif est de faire un système de « intelligent » capable de « comprendre » la similarité entre deux intitulés de métier tels que : « marbrier » et « tailleur de pierre ».


Si cet article vous a plus merci de voter (sur le site wikio) en cliquant sur cette icone.

1er TD sur les réseaux neuronaux



L'objectif de ce TD est de faire une première prise en main intuitive de l'utilisation de réseaux neuronaux (simpliste) avec une interface graphique puis une première mise en pratique via un programme en langage C.

Partie 1
Nous allons tout d'abord, utiliser cet applet : http://www.sund.de/netze/applets/BPN/bpn2/ochre.html de manière classique, c'est à dire, ce pour quoi il a été construit : reconnaître les chiffres de 0 à 9.
Dans un deuxième temps (une fois que vous aurez compris ce que ça fait et comment ça marche), vous allez modifier les donnés d'apprentissage pour que le réseau apprenne à reconnaître une croix (x) d'un rond (o). Vous pouvez modifier les données d'apprentissage en cliquant dessus (clic gauche ajoute un point, clic droit en supprime, 'c' remet le digit à 0. Voici les concepts qui seront illustré par cet exercice.
  • Notion d'apprentissage, et de mesure d'erreur via matrice de confusion
  • Notion de de généralisation. (essayer de faire reconnaître différent type de digit)
  • Notion de différent type de variabilité des données. (inter et intra-personnelle)
Partie 2
Nous allons ensuite apprendre à réaliser un apprentissage de réseau de neurone à partir d'un programme en langage C, utilisant une librairie. La librairie que nous allons utiliser FANN , elle est déjà installée dans les salles de TP. Pour commencer avec un exemple de base vous trouverez, presque tout, sur cette page. Une fois que vous aurez réussi à entraîner (et tester) un réseau sur la fonction XOR à 2 entrés, modifiez ces codes de manière a le faire avec un XOR à 3 entrés.
À l'issue de cet exercice vous aurez normalement compris ce qui est nécessaire pour construire un réseau, l'entrainer, et l'utiliser.

Partie 3
(Selon votre vitesse d'avancement , cette partie pourra être repoussée au TD suivant).
Attention : une erreur s'était glissé dans le lien vers les donnés, téléchargez à nouveau les donnés pour être sur d'avoir les bonnes valeurs.
En utilisant la libraire FANN, faites un programme qui détecte des cellules cancéreuse.Voir le contexte de l'étude ici, ainsi que la description des donnés. Vous trouverez les données nécessaire ici. Il y aura bien sûr une discussion pour savoir comment transformer ces données de manières à ce qu'elles soient utilisable par un réseau de neurones. Avec cet exercice vous aurez compris (normalement) la formalisation exigé par l'utilisation de réseaux de neurones.

Conclusion
à l'issue de de ce TD j'espère que avez une idée plus précise de ce qu'est un réseau de neurones par la pratique. Vous aurez peut être l'impression d'avoir tout vu, mais attention c'est une illusion car pour le moment on n'a pas encore réellement aborder les points critiques de cette technique : l'analyse d'erreur. Soyez en sûr les réseaux que nous avons crées ici sont finalement très très imprécis, malgré nos tests. Nous avons sauté un tas d'étapes qui sont primordiales à la création d'un réseau de neurone réellement fonctionnel. Nous verrons cela en cours et dans les TD suivants...

Annexe(s) :