|
7 months ago | |
---|---|---|
.. | ||
README.md | 7 months ago | |
assignment.md | 7 months ago |
README.md
Erstellen Sie eine Web-App zur Empfehlungen von Küchen
In dieser Lektion werden Sie ein Klassifikationsmodell erstellen, indem Sie einige der Techniken verwenden, die Sie in früheren Lektionen gelernt haben, und mit dem köstlichen Küchendatensatz, der in dieser Reihe verwendet wird. Darüber hinaus werden Sie eine kleine Web-App erstellen, um ein gespeichertes Modell zu verwenden, und dabei die Web-Laufzeit von Onnx nutzen.
Eine der nützlichsten praktischen Anwendungen des maschinellen Lernens ist der Aufbau von Empfehlungssystemen, und Sie können heute den ersten Schritt in diese Richtung machen!
🎥 Klicken Sie auf das Bild oben für ein Video: Jen Looper erstellt eine Web-App mit klassifizierten Küchendaten
Vorlesungsquiz
In dieser Lektion werden Sie lernen:
- Wie man ein Modell erstellt und es als Onnx-Modell speichert
- Wie man Netron verwendet, um das Modell zu inspizieren
- Wie man Ihr Modell in einer Web-App für Inferenz verwendet
Erstellen Sie Ihr Modell
Der Aufbau angewandter ML-Systeme ist ein wichtiger Teil der Nutzung dieser Technologien für Ihre Geschäftssysteme. Sie können Modelle in Ihren Webanwendungen verwenden (und somit bei Bedarf auch in einem Offline-Kontext) durch die Nutzung von Onnx.
In einer früheren Lektion haben Sie ein Regressionsmodell über UFO-Sichtungen erstellt, es "eingelegt" und in einer Flask-App verwendet. Während diese Architektur sehr nützlich zu wissen ist, handelt es sich um eine Full-Stack-Python-App, und Ihre Anforderungen können die Verwendung einer JavaScript-Anwendung umfassen.
In dieser Lektion können Sie ein einfaches JavaScript-basiertes System für Inferenz erstellen. Zuerst müssen Sie jedoch ein Modell trainieren und es für die Verwendung mit Onnx konvertieren.
Übung - Klassifikationsmodell trainieren
Zuerst trainieren Sie ein Klassifikationsmodell mit dem bereinigten Küchendatensatz, den wir verwendet haben.
-
Beginnen Sie mit dem Importieren nützlicher Bibliotheken:
!pip install skl2onnx import pandas as pd
Sie benötigen 'skl2onnx', um Ihr Scikit-learn-Modell in das Onnx-Format zu konvertieren.
-
Arbeiten Sie dann mit Ihren Daten auf die gleiche Weise, wie Sie es in früheren Lektionen getan haben, indem Sie eine CSV-Datei mit
read_csv()
lesen:data = pd.read_csv('../data/cleaned_cuisines.csv') data.head()
-
Entfernen Sie die ersten beiden unnötigen Spalten und speichern Sie die verbleibenden Daten als 'X':
X = data.iloc[:,2:] X.head()
-
Speichern Sie die Labels als 'y':
y = data[['cuisine']] y.head()
Beginnen Sie die Trainingsroutine
Wir werden die 'SVC'-Bibliothek verwenden, die eine gute Genauigkeit aufweist.
-
Importieren Sie die entsprechenden Bibliotheken von 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
-
Trennen Sie die Trainings- und Testdatensätze:
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
-
Erstellen Sie ein SVC-Klassifikationsmodell, wie Sie es in der vorherigen Lektion getan haben:
model = SVC(kernel='linear', C=10, probability=True,random_state=0) model.fit(X_train,y_train.values.ravel())
-
Testen Sie jetzt Ihr Modell, indem Sie
predict()
aufrufen:y_pred = model.predict(X_test)
-
Drucken Sie einen Klassifikationsbericht aus, um die Qualität des Modells zu überprüfen:
print(classification_report(y_test,y_pred))
Wie wir zuvor gesehen haben, ist die Genauigkeit gut:
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
Konvertieren Sie Ihr Modell in Onnx
Stellen Sie sicher, dass Sie die Konvertierung mit der richtigen Tensoranzahl durchführen. Dieser Datensatz hat 380 aufgeführte Zutaten, daher müssen Sie diese Zahl in FloatTensorType
vermerken:
-
Konvertieren Sie mit einer Tensoranzahl von 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}}
-
Erstellen Sie die onx und speichern Sie sie als Datei model.onnx:
onx = convert_sklearn(model, initial_types=initial_type, options=options) with open("./model.onnx", "wb") as f: f.write(onx.SerializeToString())
Hinweis: Sie können in Ihrem Konvertierungsskript Optionen übergeben. In diesem Fall haben wir 'nocl' auf True und 'zipmap' auf False gesetzt. Da dies ein Klassifikationsmodell ist, haben Sie die Möglichkeit, ZipMap zu entfernen, das eine Liste von Dictionaries produziert (nicht notwendig).
nocl
refers to class information being included in the model. Reduce your model's size by settingnocl
to 'True'.
Running the entire notebook will now build an Onnx model and save it to this folder.
View your model
Onnx models are not very visible in Visual Studio code, but there's a very good free software that many researchers use to visualize the model to ensure that it is properly built. Download Netron and open your model.onnx file. You can see your simple model visualized, with its 380 inputs and classifier listed:
Netron is a helpful tool to view your models.
Now you are ready to use this neat model in a web app. Let's build an app that will come in handy when you look in your refrigerator and try to figure out which combination of your leftover ingredients you can use to cook a given cuisine, as determined by your model.
Build a recommender web application
You can use your model directly in a web app. This architecture also allows you to run it locally and even offline if needed. Start by creating an index.html
file in the same folder where you stored your model.onnx
-Datei.
-
In dieser Datei index.html fügen Sie das folgende Markup hinzu:
<!DOCTYPE html> <html> <header> <title>Cuisine Matcher</title> </header> <body> ... </body> </html>
-
Arbeiten Sie nun innerhalb der
body
-Tags und fügen Sie ein wenig Markup hinzu, um eine Liste von Kontrollkästchen anzuzeigen, die einige Zutaten widerspiegeln:<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>
Beachten Sie, dass jedem Kontrollkästchen ein Wert zugewiesen wird. Dies spiegelt den Index wider, an dem die Zutat laut dem Datensatz gefunden wird. Apfel zum Beispiel nimmt in dieser alphabetischen Liste die fünfte Spalte ein, daher ist ihr Wert '4', da wir bei 0 zu zählen beginnen. Sie können die Zutaten-Tabelle konsultieren, um den Index einer bestimmten Zutat zu entdecken.
Fahren Sie mit Ihrer Arbeit in der index.html-Datei fort und fügen Sie einen Skriptblock hinzu, in dem das Modell nach dem letzten schließenden
</div>
aufgerufen wird. -
Zuerst importieren Sie die Onnx-Laufzeit:
<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web@1.9.0/dist/ort.min.js"></script>
Die Onnx-Laufzeit wird verwendet, um das Ausführen Ihrer Onnx-Modelle auf einer Vielzahl von Hardwareplattformen zu ermöglichen, einschließlich Optimierungen und einer API zur Nutzung.
-
Sobald die Laufzeit eingerichtet ist, können Sie sie aufrufen:
<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>
In diesem Code passieren mehrere Dinge:
- Sie haben ein Array von 380 möglichen Werten (1 oder 0) erstellt, die gesetzt und an das Modell zur Inferenz gesendet werden, je nachdem, ob ein Zutaten-Kontrollkästchen aktiviert ist.
- Sie haben ein Array von Kontrollkästchen erstellt und eine Möglichkeit, zu bestimmen, ob sie aktiviert sind in einem
init
function that is called when the application starts. When a checkbox is checked, theingredients
array is altered to reflect the chosen ingredient. - You created a
testCheckboxes
function that checks whether any checkbox was checked. - You use
startInference
function when the button is pressed and, if any checkbox is checked, you start inference. - The inference routine includes:
- Setting up an asynchronous load of the model
- Creating a Tensor structure to send to the model
- Creating 'feeds' that reflects the
float_input
input that you created when training your model (you can use Netron to verify that name) - Sending these 'feeds' to the model and waiting for a response
Test your application
Open a terminal session in Visual Studio Code in the folder where your index.html file resides. Ensure that you have http-server installed globally, and type http-server
an der Eingabeaufforderung. Ein localhost sollte sich öffnen und Sie können Ihre Web-App anzeigen. Überprüfen Sie, welche Küche basierend auf verschiedenen Zutaten empfohlen wird:
Herzlichen Glückwunsch, Sie haben eine 'Empfehlungs'-Web-App mit einigen Feldern erstellt. Nehmen Sie sich Zeit, um dieses System weiter auszubauen!
🚀Herausforderung
Ihre Web-App ist sehr minimal, also fahren Sie fort, sie mit Zutaten und deren Indizes aus den ingredient_indexes Daten auszubauen. Welche Geschmacksrichtungenkombinationen funktionieren, um ein bestimmtes Nationalgericht zu kreieren?
Nachlesungsquiz
Überprüfung & Selbststudium
Während diese Lektion nur die Nützlichkeit der Erstellung eines Empfehlungssystems für Lebensmittelzutaten angesprochen hat, ist dieser Bereich der ML-Anwendungen sehr reich an Beispielen. Lesen Sie mehr darüber, wie diese Systeme aufgebaut sind:
- https://www.sciencedirect.com/topics/computer-science/recommendation-engine
- https://www.technologyreview.com/2014/08/25/171547/the-ultimate-challenge-for-recommendation-engines/
- https://www.technologyreview.com/2015/03/23/168831/everything-is-a-recommendation/
Aufgabe
Erstellen Sie einen neuen Empfehlungsalgorithmus
Haftungsausschluss:
Dieses Dokument wurde mit maschinellen KI-Übersetzungsdiensten übersetzt. Obwohl wir uns um Genauigkeit bemühen, sollten Sie sich bewusst sein, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für wichtige Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die aus der Verwendung dieser Übersetzung resultieren.