Βήμα 2ο: Εκπαιδεύοντας το μοντέλο
Είναι πολύ απλό να κάνουμε την εκπαίδευση του μοντέλου που χτίσαμε συλλέγοντας δεδομένα μιας και υπάρχει η εντολή train() της ml5.
Θα μπορούσαμε να φτιάξουμε ένα όμορφο UI αλλά θα παραμείνουμε στην εισαγωγή εντολών από το πληκτρολόγιο, οπότε θα χρησιμοποιήσουμε το κουμπί t για την εκκίνηση της εκπαίδευσης. Αντί της χρήσης μιας απλής if η υλοποίηση θα γίνει με τη χρήση της switch επειδή αργότερα, σε επερχόμενα tutorials, θα χρειαστούμε κι άλλες λειτουργίες.
Έτσι έχουμε μια σχεδόν καινούργια keyPressed()
function keyPressed() { switch (key) { case 't' : console.log('training model with collected data'); trainData(); break; default: currentNote = key.toUpperCase(); break; } } function trainData() { let trainingOptions = { epochs: 200 } nn.train(trainingOptions, onEachEpoch, trainingFinished); } function onEachEpoch(epoch, loss) { console.log('Epoch ' + epoch); } function trainingFinished() { console.log('training finished.'); }
Ώπα, τι έγινε εδώ; Πολύς κώδικας ξαφνικά! Μην ανησυχείτε, ολα θα εξηγηθούν.
Πρωτα απ' όλα η keyPressed πλέον καλείται να αποφασίσει αν πατήθηκε το κουμπί t ή κάποιο άλλο. Αν δεν πατήθηκε το t τότε θα συνεχίζουμε να αλλάζουμε νότα αλλά αν πατηθεί το t ξεκινάει η εκπαίδευση, το 2ο βήμα δηλαδή
Έπειτα, περνώντας στην δική μας μέθοδο trainData(), στις γραμμές 17 - 19 δημιουργήσαμε ένα αντικείμενο που θα κρατάει τις επιλογές της εκπαίδευσης. Μπορείτε να δείτε στο documentation της ml5 τις επιλογές που είναι διαθέσιμες, αλλά εμείς θα χρησιμοποιήσουμε μόνο την απολύτως απαραίτητη Epochs (εποχες).
Η epochs αντιπροσωπεύει τον αριθμό των κύκλων εκπαίδευσης. Ο κάθε κύκλος εκπαίδευσης διαρκεί κάποιο χρονικό διάστημα , ανάλογα το πρόβλημα και τα δεδομένα, οπότε θέλουμε να κρατήσουμε αυτόν τον αριθμό όσο πιο χαμηλό γίνεται. Τυχαίνει να γνωρίζουμε ότι για την περίπτωση μας 200 εποχές είναι αρκετές, αλλά αυτός είναι ένας αριθμός που για να τον βρούμε θα πρέπει να πειραματιστούμε λίγο και θα δούμε παρακάτω το πως.
Στη συνέχεια, στη γραμμή 20 , καλούμε την μαγική μέθοδο train() η οποία όπως βλέπουμε παίρνει 3 παραμέτρους, 1 αντικείμενο για τα options και 2 προεραιτικές callback functions. Η 1η callback μεθοδος καλείται κάθε φορά που τελειώνει ένας κύκλος εκπαίδευσης ή αλλιώς μόλις περάσει μια εποχή ενώ η 2η μόλις τελειώσει η εκπαίδευση και όπως βλέπεται τις χρησιμοποιούμε για να κάνουμε ένα απλό log στην κονσόλα.
Κανονικοποίηση δεδομένων
Ο όρος αυτός είναι γνωστός ως data normalization και αφορά ένα πολύ σημαντικό κομμάτι της όλης διαδικασίας, είναι ένα βήμα που πρέπει να γίνει προτού ζητήσουμε από το μοντέλο μας να εκπαιδευτεί.
Ουσιαστικά αυτό που γίνεται με την κανονικοποίηση είναι η μετατροπή των αριθμητικών δεδομένων που συλλέξαμε σε μια κλίμακα που είναι πιο ευκολοχώνευτη για το nn μας. Για παράδειγμα αν έχουμε μια λίστα με αριθμούς από το 1 εώς το 100 η κανονικοποίηση θα μετατρέψει αυτό το εύρος από 0 έως 1 και όλες τις ενδιάμεσες τιμές του. Το ίδιο θα κάνει και αν π.χ. η λίστα περιέχει αριθμούς από το 43 έως το 1623. Το 43 θα γίνει 0 και το 1623 θα γίνει 1, διατηρώντας όλες τις ενδιάμεσες αναλογίες.
Για να το πετύχουμε αυτό για ακόμα μία φορά μπορούμε να βασιστούμε σε μία μαγική μέθοδο της ml5 την normalizeData()
function trainData() { nn.normalizeData(); let trainingOptions = { epochs: 200 } nn.train(trainingOptions, onEachEpoch, trainingFinished); }
Πρόοδος εκπαίδευσης και η παράμετρος Loss
Η tensorflow, η βιβλιοθήκη πάνω στην οποία είναι χτισμένη η ml5.js, μας παρέχει την δυνατότητα να παρακολουθήσουμε την πορεία της εκπαίδευσης σε γραφικό περιβάλλον. Για να το κάνουμε αυτό αρκεί να ρυθμίσουμε μια ακόμα παράμετρο του nn μας, την debug.
function setup() { createCanvas(400, 400); background(200); let nnOptions = { inputs: ['x', 'y'], outputs: ['note'], task: 'classification', debug: 'true', }; nn = ml5.neuralNetwork(nnOptions); }
Αν τώρα τρέξουμε το πρόγραμμα μας, συλλέξουμε τα δεδομένα και πατήσουμε t τότε θα εμφανιστεί αυτό το γράφημα στο δεξί μέρος της οθόνης.

Το γράφημα αυτό δείχνει την απώλεια (loss) σε σχέση με τον χρόνο / εποχές. Ο όρος Loss αναφέρεται στο πόσο έξω έπεσε το nn μας στις προβλέψεις του. Με την κάθε εποχή , η απώλεια μειώνεται. Ιδανικά θέλουμε η Loss να είναι κάτω από 0.1.
Σε αυτό το σημείο μπορείτε να τρέξετε το πρόγραμμα και να δείτε ζωντανά το μοντέλο μας να εκπαιδεύεται.
Δείτε στον p5 editor