Αποθήκευση και ανάκτηση δεδομένων στην ml5.js

Για να ακολουθήσετε αυτό το tutorial θα πρέπει να έχετε ολοκληρώσει το προηγούμενο tutorial Regression με την ml5.js

Σε αυτό το tutorial θα δούμε πως μπορούμε να αποθηκεύσουμε και να ανακτήσουμε τα δεδομένα που χρησιμοποιούμε στο project μας.

Υπάρχουν δύο ειδών δεδομένα που μπορούμε να εξάγουμε απο την ml5, αυτά που συλλέξαμε εμείς και αυτά που αφορούν το εκπαιδευμένο μοντέλο.

Τα δεδομένα που συλλέξαμε

Για να μην χρειάζεται κάθε φορά να εισάγουμε στο προγραμμα μας τα σημεία με τις νότες (που στη συνεχεια θα αποτελέσουν το input για το νευρωνικό μας δίκτυο) μπορούμε να εξάγουμε τα δεδομένα που συλλέξαμε και στη συνέχεια, όποτε θέλουμε, να τα φορτώσουμε και πάλι στο nn.

Πρώτα εισάγουμε τις περιπτώσεις εισαγωγής από το πληκτρολόγιο. Για την αποθήκευση χρησιμοποιούμε την SaveData() , την οποία θα αντιστοιχήσουμε στο κουμπί S και για την ανάκτηση θα γράψουμε μια δικη μας μέθοδο, χρησιμοποιώντας το κουμπί L αντίστοιχα.

function keyPressed() {
    switch (key) {
        case 't' : 
            console.log('training model with collected data');
            trainData();
            break;
        case 's' :
            console.log('saving collected data');
            nn.saveData('collected-data');
            break;
        case 'l':
            console.log('loading collected data');
            loadCollectedData();
            break;
        ....

Έπειτα γράφουμε την μέθοδο που θα διαβάσει τα δεδομένα και ζωγραφίζουμε τις θέσεις των σημείων στον καμβά, χωρίς όμως ετικέτες αυτή τη φορά. Τέλος θέτουμε το state = 'idle' το οποίο είναι κάτι εντελώς ασήμαντο.

Σημείωση: Θα πρέπει να ανεβάσετε στον p5 web editor το αρχείο που εξάγαμε στο προηγούμενο βήμα.

//load saved model and data
function loadCollectedData () {
    nn.loadData('collected-data.json', onCollectedDataLoaded);
}

function onCollectedDataLoaded() {
    console.log('collected data loaded');
    console.log(nn.data);
    let data = nn.data.data.raw;
    
    for (let i = 0; i < data.length; i++) {
      let inputs = data[i].xs;
      let output = data[i].ys;
      drawNote('x', inputs.x, inputs.y);
    }

    appState = 'idle';

}

 

 

Τα δεδομένα του εκπαιδευμένου μοντέλου

Αφού συλλέξουμε τα δεδομένα μας τα τροφοδοτούμε στο nn μας για να εκπαιδευτεί με αυτά. Αφού τελειώσει η εκπαίδευση, με το πέρας των εποχών (epochs), έχουμε φτιάξει ενα nn με τα ανάλογα weights, neurons κλπ. Αυτή τη πληροφορία θέλουμε να την κρατήσουμε μιας και αποτελεί το εκπαιδευμένο μοντέλο μας (trained model) και για να γίνει αυτό απλά γράφουμε την εντολή model.Save().

Θα το κάνουμε αυτό αντιστοιχώντας το κουμπί Μ για την αποθήκευση του μοντέλου και O για την ανάκτηση του

function keyPressed() {
    switch (key) {
        case 't' : 
            console.log('training model with collected data');
            trainData();
            break;
        case 's' :
            console.log('saving collected data');
            nn.saveData('collected-data');
            break;
        case 'm':
            console.log ('saving trained model');
            nn.save();
            break;
        case 'l':
            console.log('loading collected data');
            loadCollectedData();
            break;
        case 'o':
            console.log('loading trained model');
            loadTrainedModel();
            break;
        ....

Όταν αποθηκεύουμε το μοντέλο μας θα παρατηρήσετε ότι μας εξάγει 3 αρχεία, τα οποία είναι όλα απαραίτητα για να δουλέψει το nn μας.

Για να ανακτήσουμε το μοντέλο μας θα γράψουμε μια μέθοδο με callback όταν φορτοθούν τα δεδομένα από το path που δώσαμε. 

Σημείωση: Θα προσέξατε ότι η ανάκτηση γίνεται από τον φάκελο model. Αυτό σημαίνει ότι πρέπει να δημιουργήστε έναν φάκελο στον p5 web editor και να μεταφορτώσετε τα αρχεία εκεί.

//load saved model and data
...
function loadTrainedModel() {

    let nnOptions = {
        inputs: ['x', 'y'],
        outputs: ['frequency'],
        task: 'regression',
        debug: 'true',
    };  

    nn = ml5.neuralNetwork(nnOptions);
    const modelInfo = {
        model: 'model/model.json',
        metadata: 'model/model_meta.json',
        weights: 'model/model.weights.bin'
    }
    nn.load(modelInfo, onTrainedModelLoaded);
}

function onTrainedModelLoaded() {
    console.log('model loaded');
    appState = 'predict';
}

Εν κατακλείδι

Αφου πλέον είμαστε σε θέση να αποθηκεύσουμε και να ανακτήσουμε όλα αυτά που μας ενδιαφέρουν, μπορούμε να κάνουμε την συλλογή δεδομένων , την εκπαίδευση και την παρουσίαση σε εντελώς διαφορετικούς υπολογιστές και πλατφόρμες για το καθένα.