Introduction à PLearn
Au cours de cette démo pratique, vous allez écrire votre premier
programme C++ dans PLearn.
(Ré)-installation de PLearn
Les instructions ci-desous vous permettront de compiler votre propre version de PLearn, sans
pour autant être limité par les quotas en vigueur au DIRO:
- Faites un rm -rf ~/.plearn
- Téléchargez le fichier plearn.tar.gz
et décompressez-le dans le répertoire de votre choix par tar zxvf plearn.tar.gz (attention
à ne pas le confondre avec le fichier de la démo précédente)
- Éditez votre fichier de démarrage .bashrc et
modifiez la ligne définissant PLEARNDIR pour qu'elle devienne export PLEARNDIR=~dift3390/PLearn
- Rajoutez une ligne export PATH=XXX/plearn:$PATH où XXX est le répertoire
dans lequel vous avez décompressé plearn.tar.gz
- Faites un source .bashrc pour que cette modification soit bien prise en compte dans votre shell actuel
- Lancez la commande $PLEARNDIR/setup
- Allez dans le répertoire XXX/plearn et compilez PLearn par la commande pymake -tmp plearn (l'option -tmp
permet de compiler dans le répertoire /tmp, ce qui élimine tout souci de quota)
- Essayez la commande plearn help Perceptron pour vérifier que tout fonctionne correctement
Installation des fichiers de la démo
- Téléchargez le fichier demo_5.tar.gz
et décompressez-le dans un répertoire de travail par tar zxvf demo_5.tar.gz
Implémentation du perceptron batch
Éditez le fichier Perceptron.cc (dans XXX/plearn), et complétez l'implémentation des
méthodes train et computeOutput (voir Perceptron.h pour l'interface
de la classe et la description de ces méthodes).
Pour le pseudo-code, référez-vous à la page 23 des transparents du cours (attention, le vecteur y_i représente la partie input à laquelle on a rajouté
un 1, et multipliée ensuite par par la valeur z_i correspondant à la classe (-1 ou 1)). Gardez également à l'esprit que les classes dans PLearn sont notées par 0 et 1, pas -1 et 1, donc le z_i correspondant à la classe 0 est -1 et celui
correspondant à la classe 1 est +1.
Regardez en particulier le début de la méthode declareOptions, qui vous donne le nom des
paramètres de l'algorithme.
Pour compiler votre code, faites pymake Perceptron.cc, et une fois que cela compile, compilez PLearn par pymake -tmp plearn
(vous pouvez aussi taper cette dernière commande directement, mais il est plus pratique de corriger
les erreurs de compilation en ne compilant que Perceptron.cc pour commencer).
Si vous voulez regarder les headers de PLearn, ils sont accessibles dans $PLEARNDIR (par exemple, PLearner.h est dans $PLEARNDIR/plearn_learners/generic/PLearner.h).
Si vous avez besoin du code implémenté dans les .cc, regardez dans ~dift3390/PLearn.full
Vous allez manipuler les objets suivants :
- Un real est un nombre flottant, comme double en Java (en fait, real est défini comme double à la compilation, mais pourrait ètre défini comme float afin d'occuper moins de mémoire)
- Un Vec est un vecteur de real. Si vec est du type Vec, vous pouvez faire :
- vec.length() : retourne la taille du vecteur (c'est un int)
- vec[int i] = x : affecte x à la position i (i peut varier de 0 à vec.length() - 1)
- vec.last() = x : identique à vec[vec.length() - 1] = x
- vec.resize(int n) : fixe la taille du vecteur à n
- vec.fill(real x) : remplit le vecteur avec la valeur x
- dot(Vec vec1, Vec vec2) : retourne un real qui est le produit scalaire entre deux vecteurs vec1 et vec2
- norm(Vec vec) : retourne la norme L2 du vecteur
- random_gen->fill_random_uniform(Vec vec, real a, real b) : remplit le vecteur par des nombres aléatoires tirés uniformémement dans [a, b]
- vec1.subVec(0, int n) << vec2 : remplit les n premiers éléments de vec1 par le contenu de vec2 (qui doit ètre de longueur n, sinon le programme plantera à l'exécution)
- vec *= x : pour chaque élément i de vec, fait vec[i] *= x
- vec1 += vec2 : pour chaque élément i de vec1, fait vec1[i] += vec2[i]
- multiplyAcc(Vec vec1, Vec vec2, real x) : pour chaque élément i de vec1, fait vec1[i] += vec2[i] * x
- Pour plus d'informations sur les Vec: consultez la documentation de PLearn ici
- Dans la méthode train, vous pouvez utiliser le champ train_set (l'ensemble d'entraînement), qui est de type VMat
et est hérité de la classe parent PLearner. Une VMat est un jeu de données (comme la classe Dataset de la démo 1). Si vmat est du type VMat, vous pouvez faire :
- vmat->inputsize() : retourne la taille de la partie 'input' (c'est un int, comme toutes les autres tailles dans PLearn)
- vmat->targetsize(): retourne la taille de la partie 'target'
- vmat->length(): retourne le nombre d'exemples
- vmat->getExample(int i, Vec& input, Vec& target, real& weight) : remplit input, target et weight avec les données correspondant à l'exemple i (vous pouvez ignorer la valeur du poids puisque votre algorithme ne l'utilise pas). Remarque : le symbole & indique le passage par référence des paramètres, ce qui permet de les modifier.
- Pour plus d'informations sur les VMat: consultez la documentation de PLearn ici
Test de votre code
Lorsque votre code compile, faites plearn help Perceptron > perceptron.plearn pour créer une ébauche de script PLearn.
Éditez le fichier ainsi créé pour éliminer les lignes inutiles (il ne faut garder que ce qu'il y a dans le bloc Perceptron( ... )), et rajoutez des variables du type ${precision} pour pouvoir passer des paramètres sur la ligne de commande (comme dans les scripts de la démo 4).
Utilisez, comme dans la démo 4, le script pyplot et les commandes PLearn learner train et learner test sur les jeux de données fournis dans la démo 5 (dataset*.amat).
Vous pouvez par exemple visualiser les surfaces de décision, calculer des erreurs en validation et en test, faire varier vos hyperparamètres pour voir quelle influence ils peuvent avoir, etc.