16 KiB
Rakenna verkkosovellus ML-mallin käyttöön
Tässä oppitunnissa koulutat ML-mallin datajoukolla, joka on kirjaimellisesti "maailman ulkopuolelta": UFO-havainnot viimeisen vuosisadan ajalta, jotka on kerätty NUFORC:n tietokannasta.
Opit:
- Kuinka 'pickle' koulutettu malli
- Kuinka käyttää mallia Flask-sovelluksessa
Jatkamme muistikirjojen käyttöä datan puhdistamiseen ja mallin kouluttamiseen, mutta voit viedä prosessin askeleen pidemmälle tutkimalla mallin käyttöä "luonnossa", eli verkkosovelluksessa.
Tätä varten sinun täytyy rakentaa verkkosovellus Flaskin avulla.
Ennakkokysely
Sovelluksen rakentaminen
On olemassa useita tapoja rakentaa verkkosovelluksia, jotka hyödyntävät koneoppimismalleja. Verkkosovelluksen arkkitehtuuri voi vaikuttaa siihen, miten mallisi koulutetaan. Kuvittele, että työskentelet yrityksessä, jossa data-analytiikkatiimi on kouluttanut mallin, jota he haluavat sinun käyttävän sovelluksessa.
Huomioitavat asiat
On monia kysymyksiä, joita sinun täytyy esittää:
- Onko kyseessä verkkosovellus vai mobiilisovellus? Jos rakennat mobiilisovellusta tai tarvitset mallin IoT-kontekstissa, voit käyttää TensorFlow Lite ja hyödyntää mallia Android- tai iOS-sovelluksessa.
- Missä malli sijaitsee? Pilvessä vai paikallisesti?
- Offline-tuki. Pitääkö sovelluksen toimia offline-tilassa?
- Mitä teknologiaa käytettiin mallin kouluttamiseen? Valittu teknologia voi vaikuttaa tarvittaviin työkaluihin.
- TensorFlowin käyttö. Jos koulutat mallin TensorFlowilla, kyseinen ekosysteemi tarjoaa mahdollisuuden muuntaa TensorFlow-malli verkkosovelluksessa käytettäväksi TensorFlow.js avulla.
- PyTorchin käyttö. Jos rakennat mallin kirjastolla, kuten PyTorch, voit viedä sen ONNX (Open Neural Network Exchange) -muodossa JavaScript-verkkosovelluksiin, jotka voivat käyttää Onnx Runtime. Tätä vaihtoehtoa tutkitaan tulevassa oppitunnissa Scikit-learnilla koulutetulle mallille.
- Lobe.ai:n tai Azure Custom Visionin käyttö. Jos käytät ML SaaS (Software as a Service) -järjestelmää, kuten Lobe.ai tai Azure Custom Vision, tämäntyyppinen ohjelmisto tarjoaa tapoja viedä malli monille alustoille, mukaan lukien räätälöidyn API:n rakentaminen, jota verkkosovelluksesi voi kysyä pilvessä.
Sinulla on myös mahdollisuus rakentaa kokonainen Flask-verkkosovellus, joka pystyy kouluttamaan mallin itse verkkoselaimessa. Tämä voidaan tehdä myös TensorFlow.js:n avulla JavaScript-kontekstissa.
Meidän tarkoituksiimme, koska olemme työskennelleet Python-pohjaisten muistikirjojen kanssa, tutkitaan vaiheita, joita tarvitaan koulutetun mallin viemiseksi muistikirjasta Pythonilla rakennetun verkkosovelluksen luettavaksi muodoksi.
Työkalut
Tätä tehtävää varten tarvitset kaksi työkalua: Flaskin ja Picklen, jotka molemmat toimivat Pythonilla.
✅ Mikä on Flask? Flaskin luojat määrittelevät sen "mikro-kehykseksi", joka tarjoaa verkkokehysten perusominaisuudet Pythonilla ja mallinnusmoottorin verkkosivujen rakentamiseen. Tutustu tähän oppimismoduuliin harjoitellaksesi Flaskin käyttöä.
✅ Mikä on Pickle? Pickle 🥒 on Python-moduuli, joka sarjoittaa ja desarjoittaa Python-objektirakenteita. Kun "picklaat" mallin, sarjoitat tai litistät sen rakenteen verkkokäyttöä varten. Ole varovainen: pickle ei ole luontaisesti turvallinen, joten ole varovainen, jos sinua pyydetään "un-picklaamaan" tiedosto. Picklattu tiedosto päättyy .pkl
.
Harjoitus - puhdista datasi
Tässä oppitunnissa käytät dataa 80 000 UFO-havainnosta, jotka on kerätty NUFORC (The National UFO Reporting Center) -organisaation toimesta. Tämä data sisältää mielenkiintoisia kuvauksia UFO-havainnoista, esimerkiksi:
- Pitkä esimerkkikuvaus. "Mies astuu valonsäteestä, joka loistaa ruohokentälle yöllä, ja juoksee kohti Texas Instrumentsin parkkipaikkaa."
- Lyhyt esimerkkikuvaus. "valot ajoivat meitä takaa."
ufos.csv -taulukko sisältää sarakkeita, jotka kertovat kaupungin
, osavaltion
ja maan
, jossa havainto tapahtui, objektin muodon
sekä sen leveysasteen
ja pituusasteen
.
Tyhjään muistikirjaan, joka sisältyy tähän oppituntiin:
-
tuo
pandas
,matplotlib
janumpy
kuten teit aiemmissa oppitunneissa ja tuo UFO-taulukko. Voit tarkastella näyte datajoukkoa:import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head()
-
Muunna UFO-data pieneksi datafreimiksi uusilla otsikoilla. Tarkista
Country
-kentän uniikit arvot.ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique()
-
Nyt voit vähentää käsiteltävän datan määrää pudottamalla pois kaikki tyhjät arvot ja tuomalla vain havainnot, jotka kestivät 1-60 sekuntia:
ufos.dropna(inplace=True) ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] ufos.info()
-
Tuo Scikit-learnin
LabelEncoder
-kirjasto muuntaaksesi maiden tekstiarvot numeroiksi:✅ LabelEncoder koodaa datan aakkosjärjestyksessä
from sklearn.preprocessing import LabelEncoder ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) ufos.head()
Datasi pitäisi näyttää tältä:
Seconds Country Latitude Longitude 2 20.0 3 53.200000 -2.916667 3 20.0 4 28.978333 -96.645833 14 30.0 4 35.823889 -80.253611 23 60.0 4 45.582778 -122.352222 24 3.0 3 51.783333 -0.783333
Harjoitus - rakenna mallisi
Nyt voit valmistautua kouluttamaan mallin jakamalla datan koulutus- ja testiryhmään.
-
Valitse kolme ominaisuutta, joilla haluat kouluttaa mallisi X-vektoriksi, ja y-vektori on
Country
. Haluat pystyä syöttämäänSeconds
,Latitude
jaLongitude
ja saada maa-ID:n palautettavaksi.from sklearn.model_selection import train_test_split Selected_features = ['Seconds','Latitude','Longitude'] X = ufos[Selected_features] y = ufos['Country'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
-
Kouluta mallisi logistisella regressiolla:
from sklearn.metrics import accuracy_score, classification_report from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) predictions = model.predict(X_test) print(classification_report(y_test, predictions)) print('Predicted labels: ', predictions) print('Accuracy: ', accuracy_score(y_test, predictions))
Tarkkuus ei ole huono (noin 95%), mikä ei ole yllättävää, koska Country
ja Latitude/Longitude
korreloivat.
Luomasi malli ei ole kovin vallankumouksellinen, koska Country
voidaan päätellä sen Latitude
ja Longitude
perusteella, mutta tämä on hyvä harjoitus yrittää kouluttaa raakadataa, jonka puhdistit, viet ja sitten käytät tätä mallia verkkosovelluksessa.
Harjoitus - 'picklaa' mallisi
Nyt on aika picklata mallisi! Voit tehdä sen muutamalla koodirivillä. Kun malli on picklattu, lataa picklattu malli ja testaa sitä näyte datajoukolla, joka sisältää arvot sekunneille, leveysasteelle ja pituusasteelle.
import pickle
model_filename = 'ufo-model.pkl'
pickle.dump(model, open(model_filename,'wb'))
model = pickle.load(open('ufo-model.pkl','rb'))
print(model.predict([[50,44,-12]]))
Malli palauttaa '3', joka on Iso-Britannian maa-ID. Uskomatonta! 👽
Harjoitus - rakenna Flask-sovellus
Nyt voit rakentaa Flask-sovelluksen, joka kutsuu malliasi ja palauttaa samankaltaisia tuloksia, mutta visuaalisesti miellyttävämmällä tavalla.
-
Aloita luomalla kansio nimeltä web-app notebook.ipynb-tiedoston viereen, jossa ufo-model.pkl-tiedosto sijaitsee.
-
Luo kyseiseen kansioon kolme muuta kansiota: static, jonka sisällä on kansio css, ja templates. Sinulla pitäisi nyt olla seuraavat tiedostot ja hakemistot:
web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl
✅ Katso ratkaisukansiota nähdäksesi valmiin sovelluksen näkymän
-
Ensimmäinen tiedosto, joka luodaan web-app-kansioon, on requirements.txt-tiedosto. Kuten package.json JavaScript-sovelluksessa, tämä tiedosto listaa sovelluksen tarvitsemat riippuvuudet. Lisää requirements.txt-tiedostoon rivit:
scikit-learn pandas numpy flask
-
Nyt suorita tämä tiedosto siirtymällä web-app-kansioon:
cd web-app
-
Kirjoita terminaaliin
pip install
, jotta asennat requirements.txt-tiedostossa listatut kirjastot:pip install -r requirements.txt
-
Nyt olet valmis luomaan kolme muuta tiedostoa sovelluksen viimeistelyä varten:
- Luo app.py juureen.
- Luo index.html templates-hakemistoon.
- Luo styles.css static/css-hakemistoon.
-
Täydennä styles.css-tiedosto muutamalla tyylillä:
body { width: 100%; height: 100%; font-family: 'Helvetica'; background: black; color: #fff; text-align: center; letter-spacing: 1.4px; font-size: 30px; } input { min-width: 150px; } .grid { width: 300px; border: 1px solid #2d2d2d; display: grid; justify-content: center; margin: 20px auto; } .box { color: #fff; background: #2d2d2d; padding: 12px; display: inline-block; }
-
Seuraavaksi täydennä index.html-tiedosto:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>🛸 UFO Appearance Prediction! 👽</title> <link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}"> </head> <body> <div class="grid"> <div class="box"> <p>According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?</p> <form action="{{ url_for('predict')}}" method="post"> <input type="number" name="seconds" placeholder="Seconds" required="required" min="0" max="60" /> <input type="text" name="latitude" placeholder="Latitude" required="required" /> <input type="text" name="longitude" placeholder="Longitude" required="required" /> <button type="submit" class="btn">Predict country where the UFO is seen</button> </form> <p>{{ prediction_text }}</p> </div> </div> </body> </html>
Tarkastele tämän tiedoston mallinnusta. Huomaa 'viiksisyntaksi' muuttujien ympärillä, jotka sovellus tarjoaa, kuten ennusteteksti:
{{}}
. Siellä on myös lomake, joka lähettää ennusteen/predict
-reitille.Lopuksi olet valmis rakentamaan Python-tiedoston, joka ohjaa mallin käyttöä ja ennusteiden näyttämistä:
-
Lisää
app.py
-tiedostoon:import numpy as np from flask import Flask, request, render_template import pickle app = Flask(__name__) model = pickle.load(open("./ufo-model.pkl", "rb")) @app.route("/") def home(): return render_template("index.html") @app.route("/predict", methods=["POST"]) def predict(): int_features = [int(x) for x in request.form.values()] final_features = [np.array(int_features)] prediction = model.predict(final_features) output = prediction[0] countries = ["Australia", "Canada", "Germany", "UK", "US"] return render_template( "index.html", prediction_text="Likely country: {}".format(countries[output]) ) if __name__ == "__main__": app.run(debug=True)
💡 Vinkki: kun lisäät
debug=True
Flask-verkkosovellusta suorittaessasi, kaikki sovellukseen tekemäsi muutokset näkyvät välittömästi ilman, että palvelinta tarvitsee käynnistää uudelleen. Ole varovainen! Älä ota tätä tilaa käyttöön tuotantosovelluksessa.
Jos suoritat python app.py
tai python3 app.py
- verkkopalvelimesi käynnistyy paikallisesti, ja voit täyttää lyhyen lomakkeen saadaksesi vastauksen polttavaan kysymykseesi siitä, missä UFO-havaintoja on tehty!
Ennen kuin teet sen, tarkastele app.py
-tiedoston osia:
- Ensin riippuvuudet ladataan ja sovellus käynnistyy.
- Sitten malli tuodaan.
- Sitten index.html renderöidään kotireitillä.
/predict
-reitillä tapahtuu useita asioita, kun lomake lähetetään:
- Lomakkeen muuttujat kerätään ja muunnetaan numpy-taulukoksi. Ne lähetetään mallille, ja ennuste palautetaan.
- Maa, jonka haluamme näyttää, renderöidään uudelleen luettavana tekstinä ennustetusta maa-ID:stä, ja tämä arvo lähetetään takaisin index.html-tiedostoon, jotta se voidaan renderöidä mallissa.
Mallin käyttö tällä tavalla, Flaskin ja picklatun mallin avulla, on suhteellisen suoraviivaista. Vaikeinta on ymmärtää, millaisessa muodossa datan täytyy olla, jotta se voidaan lähettää mallille ennusteen saamiseksi. Tämä riippuu täysin siitä, miten malli on koulutettu. Tässä mallissa tarvitaan kolme datakohtaa syötettäväksi ennusteen saamiseksi.
Ammatillisessa ympäristössä näet, kuinka hyvä viestintä on välttämätöntä niiden ihmisten välillä, jotka kouluttavat mallin, ja niiden, jotka käyttävät sitä verkkosovelluksessa tai mobiilisovelluksessa. Meidän tapauksessamme kyseessä on vain yksi henkilö, sinä!
🚀 Haaste
Sen sijaan, että työskentelisit muistikirjassa ja toisit mallin Flask-sovellukseen, voisit kouluttaa mallin suoraan Flask-sovelluksessa! Kokeile muuntaa muistikirjan Python-koodi, ehkä datan puhdistamisen jälkeen, kouluttaaksesi mallin sovelluksen sisällä reitillä nimeltä train
. Mitkä ovat tämän menetelmän hyvät ja huonot puolet?
Jälkikysely
Kertaus ja itseopiskelu
On monia tapoja rakentaa verkkosovellus, joka hyödyntää ML-malleja. Tee lista tavoista, joilla voisit käyttää JavaScriptiä tai Pythonia rakentaaksesi verkkosovelluksen koneoppimisen hyödyntämiseen. Mieti arkkitehtuuria: pitäisikö mallin pysyä sovelluksessa vai sijaita pilvessä? Jos jälkimmäinen, miten pääsisit siihen käsiksi? Piirrä arkkitehtuurimalli sovelletulle ML-verkkoratkaisulle.
Tehtävä
Vastuuvapauslauseke:
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua Co-op Translator. Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.