You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/el/4-Classification/4-Applied/README.md

22 KiB

Δημιουργία Εφαρμογής Web για Προτάσεις Κουζίνας

Σε αυτό το μάθημα, θα δημιουργήσετε ένα μοντέλο ταξινόμησης χρησιμοποιώντας κάποιες από τις τεχνικές που μάθατε σε προηγούμενα μαθήματα και με το νόστιμο dataset κουζίνας που χρησιμοποιήθηκε σε αυτή τη σειρά. Επιπλέον, θα δημιουργήσετε μια μικρή εφαρμογή web για να χρησιμοποιήσετε ένα αποθηκευμένο μοντέλο, αξιοποιώντας το web runtime του Onnx.

Μία από τις πιο χρήσιμες πρακτικές εφαρμογές της μηχανικής μάθησης είναι η δημιουργία συστημάτων προτάσεων, και μπορείτε να κάνετε το πρώτο βήμα προς αυτή την κατεύθυνση σήμερα!

Παρουσίαση αυτής της εφαρμογής web

🎥 Κάντε κλικ στην εικόνα παραπάνω για ένα βίντεο: Η Jen Looper δημιουργεί μια εφαρμογή web χρησιμοποιώντας δεδομένα ταξινομημένης κουζίνας

Προ-μάθημα κουίζ

Σε αυτό το μάθημα θα μάθετε:

  • Πώς να δημιουργήσετε ένα μοντέλο και να το αποθηκεύσετε ως μοντέλο Onnx
  • Πώς να χρησιμοποιήσετε το Netron για να επιθεωρήσετε το μοντέλο
  • Πώς να χρησιμοποιήσετε το μοντέλο σας σε μια εφαρμογή web για πρόβλεψη

Δημιουργία του μοντέλου σας

Η δημιουργία εφαρμοσμένων συστημάτων μηχανικής μάθησης είναι ένα σημαντικό μέρος της αξιοποίησης αυτών των τεχνολογιών για τα επιχειρηματικά σας συστήματα. Μπορείτε να χρησιμοποιήσετε μοντέλα μέσα στις εφαρμογές web σας (και έτσι να τα χρησιμοποιήσετε σε offline περιβάλλον αν χρειαστεί) χρησιμοποιώντας το Onnx.

Σε ένα προηγούμενο μάθημα, δημιουργήσατε ένα μοντέλο Regression σχετικά με θεάσεις UFO, το "pickled" και το χρησιμοποιήσατε σε μια εφαρμογή Flask. Παρόλο που αυτή η αρχιτεκτονική είναι πολύ χρήσιμη, είναι μια πλήρης εφαρμογή Python, και οι απαιτήσεις σας μπορεί να περιλαμβάνουν τη χρήση μιας εφαρμογής JavaScript.

Σε αυτό το μάθημα, μπορείτε να δημιουργήσετε ένα βασικό σύστημα βασισμένο σε JavaScript για πρόβλεψη. Πρώτα, όμως, πρέπει να εκπαιδεύσετε ένα μοντέλο και να το μετατρέψετε για χρήση με το Onnx.

Άσκηση - εκπαίδευση μοντέλου ταξινόμησης

Πρώτα, εκπαιδεύστε ένα μοντέλο ταξινόμησης χρησιμοποιώντας το καθαρισμένο dataset κουζινών που χρησιμοποιήσαμε.

  1. Ξεκινήστε εισάγοντας χρήσιμες βιβλιοθήκες:

    !pip install skl2onnx
    import pandas as pd 
    

    Χρειάζεστε το 'skl2onnx' για να βοηθήσετε στη μετατροπή του μοντέλου Scikit-learn σε μορφή Onnx.

  2. Στη συνέχεια, δουλέψτε με τα δεδομένα σας με τον ίδιο τρόπο που κάνατε σε προηγούμενα μαθήματα, διαβάζοντας ένα αρχείο CSV χρησιμοποιώντας τη read_csv():

    data = pd.read_csv('../data/cleaned_cuisines.csv')
    data.head()
    
  3. Αφαιρέστε τις δύο πρώτες περιττές στήλες και αποθηκεύστε τα υπόλοιπα δεδομένα ως 'X':

    X = data.iloc[:,2:]
    X.head()
    
  4. Αποθηκεύστε τις ετικέτες ως 'y':

    y = data[['cuisine']]
    y.head()
    
    

Ξεκινήστε τη διαδικασία εκπαίδευσης

Θα χρησιμοποιήσουμε τη βιβλιοθήκη 'SVC', η οποία έχει καλή ακρίβεια.

  1. Εισάγετε τις κατάλληλες βιβλιοθήκες από το Scikit-learn:

    from sklearn.model_selection import train_test_split
    from sklearn.svm import SVC
    from sklearn.model_selection import cross_val_score
    from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report
    
  2. Χωρίστε τα δεδομένα σε σύνολα εκπαίδευσης και δοκιμής:

    X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
    
  3. Δημιουργήστε ένα μοντέλο ταξινόμησης SVC όπως κάνατε στο προηγούμενο μάθημα:

    model = SVC(kernel='linear', C=10, probability=True,random_state=0)
    model.fit(X_train,y_train.values.ravel())
    
  4. Τώρα, δοκιμάστε το μοντέλο σας, καλώντας τη predict():

    y_pred = model.predict(X_test)
    
  5. Εκτυπώστε μια αναφορά ταξινόμησης για να ελέγξετε την ποιότητα του μοντέλου:

    print(classification_report(y_test,y_pred))
    

    Όπως είδαμε πριν, η ακρίβεια είναι καλή:

                    precision    recall  f1-score   support
    
         chinese       0.72      0.69      0.70       257
          indian       0.91      0.87      0.89       243
        japanese       0.79      0.77      0.78       239
          korean       0.83      0.79      0.81       236
            thai       0.72      0.84      0.78       224
    
        accuracy                           0.79      1199
       macro avg       0.79      0.79      0.79      1199
    weighted avg       0.79      0.79      0.79      1199
    

Μετατροπή του μοντέλου σας σε Onnx

Βεβαιωθείτε ότι κάνετε τη μετατροπή με τον σωστό αριθμό Tensor. Αυτό το dataset έχει 380 συστατικά, οπότε πρέπει να σημειώσετε αυτόν τον αριθμό στο FloatTensorType:

  1. Μετατρέψτε χρησιμοποιώντας αριθμό tensor 380.

    from skl2onnx import convert_sklearn
    from skl2onnx.common.data_types import FloatTensorType
    
    initial_type = [('float_input', FloatTensorType([None, 380]))]
    options = {id(model): {'nocl': True, 'zipmap': False}}
    
  2. Δημιουργήστε το αρχείο onx και αποθηκεύστε το ως model.onnx:

    onx = convert_sklearn(model, initial_types=initial_type, options=options)
    with open("./model.onnx", "wb") as f:
        f.write(onx.SerializeToString())
    

    Σημείωση, μπορείτε να περάσετε επιλογές στο σενάριο μετατροπής σας. Σε αυτή την περίπτωση, περάσαμε το 'nocl' να είναι True και το 'zipmap' να είναι False. Επειδή αυτό είναι ένα μοντέλο ταξινόμησης, έχετε την επιλογή να αφαιρέσετε το ZipMap που παράγει μια λίστα λεξικών (δεν είναι απαραίτητο). Το nocl αναφέρεται στις πληροφορίες κατηγορίας που περιλαμβάνονται στο μοντέλο. Μειώστε το μέγεθος του μοντέλου σας ορίζοντας το nocl σε 'True'.

Εκτελώντας ολόκληρο το notebook, θα δημιουργηθεί ένα μοντέλο Onnx και θα αποθηκευτεί σε αυτόν τον φάκελο.

Δείτε το μοντέλο σας

Τα μοντέλα Onnx δεν είναι πολύ ορατά στο Visual Studio Code, αλλά υπάρχει ένα πολύ καλό δωρεάν λογισμικό που χρησιμοποιούν πολλοί ερευνητές για να οπτικοποιήσουν το μοντέλο και να βεβαιωθούν ότι έχει κατασκευαστεί σωστά. Κατεβάστε το Netron και ανοίξτε το αρχείο model.onnx. Μπορείτε να δείτε το απλό μοντέλο σας οπτικοποιημένο, με τα 380 inputs και τον ταξινομητή να εμφανίζονται:

Οπτικοποίηση Netron

Το Netron είναι ένα χρήσιμο εργαλείο για την προβολή των μοντέλων σας.

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

Δημιουργία εφαρμογής web προτάσεων

Μπορείτε να χρησιμοποιήσετε το μοντέλο σας απευθείας σε μια εφαρμογή web. Αυτή η αρχιτεκτονική σας επιτρέπει επίσης να το εκτελέσετε τοπικά και ακόμη και offline αν χρειαστεί. Ξεκινήστε δημιουργώντας ένα αρχείο index.html στον ίδιο φάκελο όπου αποθηκεύσατε το αρχείο model.onnx.

  1. Στο αρχείο index.html, προσθέστε την παρακάτω σήμανση:

    <!DOCTYPE html>
    <html>
        <header>
            <title>Cuisine Matcher</title>
        </header>
        <body>
            ...
        </body>
    </html>
    
  2. Τώρα, δουλεύοντας μέσα στις ετικέτες body, προσθέστε λίγη σήμανση για να εμφανίσετε μια λίστα με checkboxes που αντιπροσωπεύουν κάποια συστατικά:

    <h1>Check your refrigerator. What can you create?</h1>
            <div id="wrapper">
                <div class="boxCont">
                    <input type="checkbox" value="4" class="checkbox">
                    <label>apple</label>
                </div>
    
                <div class="boxCont">
                    <input type="checkbox" value="247" class="checkbox">
                    <label>pear</label>
                </div>
    
                <div class="boxCont">
                    <input type="checkbox" value="77" class="checkbox">
                    <label>cherry</label>
                </div>
    
                <div class="boxCont">
                    <input type="checkbox" value="126" class="checkbox">
                    <label>fenugreek</label>
                </div>
    
                <div class="boxCont">
                    <input type="checkbox" value="302" class="checkbox">
                    <label>sake</label>
                </div>
    
                <div class="boxCont">
                    <input type="checkbox" value="327" class="checkbox">
                    <label>soy sauce</label>
                </div>
    
                <div class="boxCont">
                    <input type="checkbox" value="112" class="checkbox">
                    <label>cumin</label>
                </div>
            </div>
            <div style="padding-top:10px">
                <button onClick="startInference()">What kind of cuisine can you make?</button>
            </div> 
    

    Παρατηρήστε ότι κάθε checkbox έχει δοθεί μια τιμή. Αυτό αντανακλά τον δείκτη όπου βρίσκεται το συστατικό σύμφωνα με το dataset. Το μήλο, για παράδειγμα, σε αυτήν την αλφαβητική λίστα, καταλαμβάνει την πέμπτη στήλη, οπότε η τιμή του είναι '4' καθώς ξεκινάμε την αρίθμηση από το 0. Μπορείτε να συμβουλευτείτε το spreadsheet συστατικών για να ανακαλύψετε τον δείκτη ενός δεδομένου συστατικού.

    Συνεχίζοντας τη δουλειά σας στο αρχείο index.html, προσθέστε ένα μπλοκ script όπου καλείται το μοντέλο μετά το τελικό κλείσιμο </div>.

  3. Πρώτα, εισάγετε το Onnx Runtime:

    <script src="https://cdn.jsdelivr.net/npm/onnxruntime-web@1.9.0/dist/ort.min.js"></script> 
    

    Το Onnx Runtime χρησιμοποιείται για να επιτρέψει την εκτέλεση των μοντέλων Onnx σας σε μια ευρεία γκάμα πλατφορμών υλικού, συμπεριλαμβανομένων βελτιστοποιήσεων και ενός API για χρήση.

  4. Μόλις το Runtime είναι στη θέση του, μπορείτε να το καλέσετε:

    <script>
        const ingredients = Array(380).fill(0);
    
        const checks = [...document.querySelectorAll('.checkbox')];
    
        checks.forEach(check => {
            check.addEventListener('change', function() {
                // toggle the state of the ingredient
                // based on the checkbox's value (1 or 0)
                ingredients[check.value] = check.checked ? 1 : 0;
            });
        });
    
        function testCheckboxes() {
            // validate if at least one checkbox is checked
            return checks.some(check => check.checked);
        }
    
        async function startInference() {
    
            let atLeastOneChecked = testCheckboxes()
    
            if (!atLeastOneChecked) {
                alert('Please select at least one ingredient.');
                return;
            }
            try {
                // create a new session and load the model.
    
                const session = await ort.InferenceSession.create('./model.onnx');
    
                const input = new ort.Tensor(new Float32Array(ingredients), [1, 380]);
                const feeds = { float_input: input };
    
                // feed inputs and run
                const results = await session.run(feeds);
    
                // read from results
                alert('You can enjoy ' + results.label.data[0] + ' cuisine today!')
    
            } catch (e) {
                console.log(`failed to inference ONNX model`);
                console.error(e);
            }
        }
    
    </script>
    

Σε αυτόν τον κώδικα, συμβαίνουν αρκετά πράγματα:

  1. Δημιουργήσατε έναν πίνακα με 380 πιθανές τιμές (1 ή 0) που θα οριστούν και θα σταλούν στο μοντέλο για πρόβλεψη, ανάλογα με το αν έχει επιλεγεί ένα checkbox συστατικού.
  2. Δημιουργήσατε έναν πίνακα με checkboxes και έναν τρόπο να προσδιορίσετε αν έχουν επιλεγεί σε μια συνάρτηση init που καλείται όταν ξεκινά η εφαρμογή. Όταν επιλέγεται ένα checkbox, ο πίνακας ingredients τροποποιείται για να αντικατοπτρίζει το επιλεγμένο συστατικό.
  3. Δημιουργήσατε μια συνάρτηση testCheckboxes που ελέγχει αν έχει επιλεγεί κάποιο checkbox.
  4. Χρησιμοποιείτε τη συνάρτηση startInference όταν πατηθεί το κουμπί και, αν έχει επιλεγεί κάποιο checkbox, ξεκινάτε την πρόβλεψη.
  5. Η διαδικασία πρόβλεψης περιλαμβάνει:
    1. Ρύθμιση ασύγχρονης φόρτωσης του μοντέλου
    2. Δημιουργία δομής Tensor για αποστολή στο μοντέλο
    3. Δημιουργία 'feeds' που αντικατοπτρίζει την είσοδο float_input που δημιουργήσατε κατά την εκπαίδευση του μοντέλου σας (μπορείτε να χρησιμοποιήσετε το Netron για να επαληθεύσετε αυτό το όνομα)
    4. Αποστολή αυτών των 'feeds' στο μοντέλο και αναμονή για απάντηση

Δοκιμάστε την εφαρμογή σας

Ανοίξτε μια συνεδρία τερματικού στο Visual Studio Code στον φάκελο όπου βρίσκεται το αρχείο index.html. Βεβαιωθείτε ότι έχετε εγκαταστήσει http-server παγκοσμίως και πληκτρολογήστε http-server στη γραμμή εντολών. Ένας localhost θα ανοίξει και μπορείτε να δείτε την εφαρμογή web σας. Ελέγξτε ποια κουζίνα προτείνεται με βάση διάφορα συστατικά:

Εφαρμογή web συστατικών

Συγχαρητήρια, δημιουργήσατε μια εφαρμογή web 'προτάσεων' με λίγα πεδία. Αφιερώστε λίγο χρόνο για να αναπτύξετε αυτό το σύστημα!

🚀Πρόκληση

Η εφαρμογή web σας είναι πολύ βασική, οπότε συνεχίστε να την αναπτύσσετε χρησιμοποιώντας συστατικά και τους δείκτες τους από τα δεδομένα ingredient_indexes. Ποιοι συνδυασμοί γεύσεων λειτουργούν για τη δημιουργία ενός εθνικού πιάτου;

Μετά το μάθημα κουίζ

Ανασκόπηση & Αυτομελέτη

Ενώ αυτό το μάθημα απλώς άγγιξε τη χρησιμότητα της δημιουργίας ενός συστήματος προτάσεων για συστατικά τροφίμων, αυτή η περιοχή εφαρμογών μηχανικής μάθησης είναι πολύ πλούσια σε παραδείγματα. Διαβάστε περισσότερα για το πώς κατασκευάζονται αυτά τα συστήματα:

Εργασία

Δημιουργήστε ένα νέο σύστημα προτάσεων


Αποποίηση ευθύνης:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης Co-op Translator. Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.