|
2 weeks ago | |
---|---|---|
.. | ||
solution | 2 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 2 weeks ago | |
notebook.ipynb | 2 weeks ago |
README.md
ساخت یک اپلیکیشن وب برای استفاده از مدل یادگیری ماشین
در این درس، شما یک مدل یادگیری ماشین را بر روی مجموعه دادهای که از این دنیا نیست آموزش خواهید داد: مشاهدات بشقاب پرنده در طول قرن گذشته، که از پایگاه داده NUFORC جمعآوری شده است.
شما یاد خواهید گرفت:
- چگونه یک مدل آموزشدیده را «pickle» کنید
- چگونه از آن مدل در یک اپلیکیشن Flask استفاده کنید
ما همچنان از نوتبوکها برای پاکسازی دادهها و آموزش مدل استفاده خواهیم کرد، اما میتوانید این فرآیند را یک قدم جلوتر ببرید و مدل را در دنیای واقعی، به عبارتی در یک اپلیکیشن وب، به کار ببرید.
برای انجام این کار، باید یک اپلیکیشن وب با استفاده از Flask بسازید.
پیش آزمون
ساخت اپلیکیشن
راههای مختلفی برای ساخت اپلیکیشنهای وب وجود دارد که بتوانند مدلهای یادگیری ماشین را مصرف کنند. معماری وب شما ممکن است بر نحوه آموزش مدل تأثیر بگذارد. تصور کنید که در یک کسبوکار کار میکنید که گروه دادهکاوی آن یک مدل آموزش دادهاند و میخواهند شما از آن در اپلیکیشن استفاده کنید.
ملاحظات
سؤالات زیادی وجود دارد که باید بپرسید:
- آیا اپلیکیشن وب است یا موبایل؟ اگر در حال ساخت یک اپلیکیشن موبایل هستید یا نیاز دارید مدل را در یک زمینه IoT استفاده کنید، میتوانید از TensorFlow Lite استفاده کنید و مدل را در اپلیکیشن اندروید یا iOS به کار ببرید.
- مدل کجا قرار خواهد گرفت؟ در فضای ابری یا به صورت محلی؟
- پشتیبانی آفلاین. آیا اپلیکیشن باید به صورت آفلاین کار کند؟
- از چه تکنولوژی برای آموزش مدل استفاده شده است؟ تکنولوژی انتخابشده ممکن است بر ابزارهایی که باید استفاده کنید تأثیر بگذارد.
- استفاده از TensorFlow. اگر مدل را با استفاده از TensorFlow آموزش میدهید، این اکوسیستم امکان تبدیل مدل TensorFlow برای استفاده در اپلیکیشن وب را با استفاده از TensorFlow.js فراهم میکند.
- استفاده از PyTorch. اگر مدل را با استفاده از کتابخانهای مانند PyTorch میسازید، میتوانید آن را در قالب ONNX (Open Neural Network Exchange) برای استفاده در اپلیکیشنهای وب جاوااسکریپت که از Onnx Runtime استفاده میکنند، صادر کنید. این گزینه در درس آینده برای مدل آموزشدیده با Scikit-learn بررسی خواهد شد.
- استفاده از Lobe.ai یا Azure Custom Vision. اگر از یک سیستم SaaS یادگیری ماشین مانند Lobe.ai یا Azure Custom Vision برای آموزش مدل استفاده میکنید، این نوع نرمافزار راههایی برای صادر کردن مدل برای پلتفرمهای مختلف، از جمله ساخت یک API سفارشی برای پرسوجو در فضای ابری توسط اپلیکیشن آنلاین شما، فراهم میکند.
شما همچنین میتوانید یک اپلیکیشن وب کامل با Flask بسازید که بتواند مدل را در خود مرورگر وب آموزش دهد. این کار همچنین میتواند با استفاده از TensorFlow.js در زمینه جاوااسکریپت انجام شود.
برای اهداف ما، از آنجا که با نوتبوکهای مبتنی بر پایتون کار کردهایم، بیایید مراحل لازم برای صادر کردن یک مدل آموزشدیده از چنین نوتبوکی به فرمتی که توسط یک اپلیکیشن وب ساختهشده با پایتون قابل خواندن باشد را بررسی کنیم.
ابزار
برای این کار، به دو ابزار نیاز دارید: Flask و Pickle، که هر دو بر روی پایتون اجرا میشوند.
✅ Flask چیست؟ Flask که توسط سازندگانش به عنوان یک «میکرو-فریمورک» تعریف شده است، ویژگیهای پایهای فریمورکهای وب را با استفاده از پایتون و یک موتور قالبسازی برای ساخت صفحات وب فراهم میکند. به این ماژول آموزشی نگاهی بیندازید تا با Flask کار کنید.
✅ Pickle چیست؟ Pickle 🥒 یک ماژول پایتون است که ساختار شیء پایتون را سریالسازی و دیسریالسازی میکند. وقتی یک مدل را «pickle» میکنید، ساختار آن را برای استفاده در وب سریالسازی یا تخت میکنید. مراقب باشید: pickle ذاتاً امن نیست، بنابراین اگر از شما خواسته شد یک فایل «un-pickle» کنید، احتیاط کنید. فایلهای pickled پسوند .pkl
دارند.
تمرین - پاکسازی دادهها
در این درس، شما از دادههای ۸۰,۰۰۰ مشاهده بشقاب پرنده که توسط NUFORC (مرکز ملی گزارشدهی بشقاب پرنده) جمعآوری شده است استفاده خواهید کرد. این دادهها شامل توضیحات جالبی از مشاهدات بشقاب پرنده هستند، برای مثال:
- توضیح طولانی نمونه. "یک مرد از یک پرتو نور که در شب بر روی یک میدان چمن میتابد بیرون میآید و به سمت پارکینگ Texas Instruments میدود".
- توضیح کوتاه نمونه. "چراغها ما را دنبال کردند".
صفحهگسترده ufos.csv شامل ستونهایی درباره شهر
، ایالت
و کشور
محل مشاهده، شکل
شیء و عرض جغرافیایی
و طول جغرافیایی
آن است.
در نوتبوک خالی که در این درس گنجانده شده است:
-
pandas
،matplotlib
وnumpy
را همانطور که در درسهای قبلی انجام دادید وارد کنید و صفحهگسترده ufos را وارد کنید. میتوانید به یک نمونه داده نگاه کنید:import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head()
-
دادههای ufos را به یک dataframe کوچک با عناوین تازه تبدیل کنید. مقادیر منحصربهفرد در فیلد
Country
را بررسی کنید.ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique()
-
اکنون میتوانید مقدار دادههایی که باید با آنها کار کنید را با حذف مقادیر null و فقط وارد کردن مشاهدات بین ۱-۶۰ ثانیه کاهش دهید:
ufos.dropna(inplace=True) ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] ufos.info()
-
کتابخانه
LabelEncoder
از Scikit-learn را وارد کنید تا مقادیر متنی کشورها را به عدد تبدیل کنید:✅ LabelEncoder دادهها را به صورت الفبایی کدگذاری میکند
from sklearn.preprocessing import LabelEncoder ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) ufos.head()
دادههای شما باید به این شکل باشند:
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
تمرین - ساخت مدل
اکنون میتوانید آماده شوید تا مدل را با تقسیم دادهها به گروههای آموزشی و آزمایشی آموزش دهید.
-
سه ویژگیای که میخواهید بر اساس آنها آموزش دهید را به عنوان بردار X انتخاب کنید، و بردار y فیلد
Country
خواهد بود. شما میخواهید بتوانیدثانیهها
،عرض جغرافیایی
وطول جغرافیایی
را وارد کنید و یک شناسه کشور دریافت کنید.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)
-
مدل خود را با استفاده از رگرسیون لجستیک آموزش دهید:
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))
دقت بد نیست (حدود ۹۵٪)، که تعجبآور نیست، زیرا Country
و عرض/طول جغرافیایی
با هم مرتبط هستند.
مدلی که ایجاد کردید خیلی انقلابی نیست، زیرا باید بتوانید یک Country
را از عرض جغرافیایی
و طول جغرافیایی
استنباط کنید، اما این یک تمرین خوب است که سعی کنید از دادههای خامی که پاکسازی کردهاید، مدل را آموزش دهید، صادر کنید و سپس از این مدل در یک اپلیکیشن وب استفاده کنید.
تمرین - «pickle» کردن مدل
اکنون زمان آن است که مدل خود را pickle کنید! میتوانید این کار را در چند خط کد انجام دهید. پس از pickle کردن، مدل خود را بارگذاری کنید و آن را با یک آرایه داده نمونه که شامل مقادیر ثانیهها، عرض جغرافیایی و طول جغرافیایی است آزمایش کنید.
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]]))
مدل '3' را بازمیگرداند، که کد کشور برای بریتانیا است. شگفتانگیز! 👽
تمرین - ساخت اپلیکیشن Flask
اکنون میتوانید یک اپلیکیشن Flask بسازید تا مدل خود را فراخوانی کنید و نتایج مشابهی را به شکلی زیباتر نمایش دهید.
-
ابتدا یک پوشه به نام web-app در کنار فایل notebook.ipynb که فایل ufo-model.pkl شما در آن قرار دارد ایجاد کنید.
-
در آن پوشه سه پوشه دیگر ایجاد کنید: static، با یک پوشه css داخل آن، و templates. اکنون باید فایلها و دایرکتوریهای زیر را داشته باشید:
web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl
✅ به پوشه solution برای مشاهده اپلیکیشن نهایی مراجعه کنید
-
اولین فایلی که باید در پوشه web-app ایجاد کنید فایل requirements.txt است. مانند package.json در یک اپلیکیشن جاوااسکریپت، این فایل وابستگیهای مورد نیاز اپلیکیشن را لیست میکند. در requirements.txt خطوط زیر را اضافه کنید:
scikit-learn pandas numpy flask
-
اکنون این فایل را با حرکت به web-app اجرا کنید:
cd web-app
-
در ترمینال خود تایپ کنید
pip install
، تا کتابخانههای لیستشده در requirements.txt نصب شوند:pip install -r requirements.txt
-
اکنون آماده هستید تا سه فایل دیگر برای تکمیل اپلیکیشن ایجاد کنید:
- فایل app.py را در ریشه ایجاد کنید.
- فایل index.html را در دایرکتوری templates ایجاد کنید.
- فایل styles.css را در دایرکتوری static/css ایجاد کنید.
-
فایل styles.css را با چند سبک بسازید:
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; }
-
سپس فایل index.html را بسازید:
<!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>
به قالببندی در این فایل نگاه کنید. به سینتکس 'mustache' اطراف متغیرهایی که توسط اپلیکیشن ارائه خواهند شد، مانند متن پیشبینی:
{{}}
توجه کنید. همچنین یک فرم وجود دارد که یک پیشبینی را به مسیر/predict
ارسال میکند.در نهایت، آماده هستید تا فایل پایتون که مصرف مدل و نمایش پیشبینیها را هدایت میکند بسازید:
-
در
app.py
اضافه کنید: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)
💡 نکته: وقتی
debug=True
را هنگام اجرای اپلیکیشن وب با Flask اضافه میکنید، هر تغییری که در اپلیکیشن خود ایجاد کنید بلافاصله بدون نیاز به راهاندازی مجدد سرور منعکس میشود. مراقب باشید! این حالت را در اپلیکیشن تولیدی فعال نکنید.
اگر python app.py
یا python3 app.py
را اجرا کنید - سرور وب شما به صورت محلی راهاندازی میشود و میتوانید یک فرم کوتاه را پر کنید تا پاسخ سوال خود درباره محل مشاهده بشقاب پرندهها را دریافت کنید!
قبل از انجام این کار، به بخشهای app.py
نگاه کنید:
- ابتدا وابستگیها بارگذاری میشوند و اپلیکیشن شروع میشود.
- سپس مدل وارد میشود.
- سپس index.html در مسیر اصلی رندر میشود.
در مسیر /predict
، چندین اتفاق رخ میدهد وقتی فرم ارسال میشود:
- متغیرهای فرم جمعآوری شده و به یک آرایه numpy تبدیل میشوند. سپس به مدل ارسال میشوند و یک پیشبینی بازگردانده میشود.
- کشورهایی که میخواهیم نمایش داده شوند به متن قابل خواندن از کد کشور پیشبینیشده تبدیل میشوند و آن مقدار به index.html ارسال میشود تا در قالب رندر شود.
استفاده از مدل به این روش، با Flask و یک مدل pickled، نسبتاً ساده است. سختترین چیز این است که بفهمید دادههایی که باید به مدل ارسال شوند تا یک پیشبینی دریافت شود چه شکلی دارند. این کاملاً به نحوه آموزش مدل بستگی دارد. این مدل سه نقطه داده برای ورودی نیاز دارد تا یک پیشبینی ارائه دهد.
در یک محیط حرفهای، میتوانید ببینید که ارتباط خوب بین افرادی که مدل را آموزش میدهند و کسانی که آن را در اپلیکیشن وب یا موبایل مصرف میکنند چقدر ضروری است. در مورد ما، فقط یک نفر هستید، شما!
🚀 چالش
به جای کار در یک نوتبوک و وارد کردن مدل به اپلیکیشن Flask، میتوانید مدل را مستقیماً در اپلیکیشن Flask آموزش دهید! سعی کنید کد پایتون خود را در نوتبوک تبدیل کنید، شاید پس از پاکسازی دادهها، تا مدل را از داخل اپلیکیشن در یک مسیر به نام train
آموزش دهید. مزایا و معایب دنبال کردن این روش چیست؟
پس آزمون
مرور و مطالعه شخصی
راههای زیادی برای ساخت اپلیکیشن وب برای مصرف مدلهای یادگیری ماشین وجود دارد. لیستی از روشهایی که میتوانید با استفاده از جاوااسکریپت یا پایتون اپلیکیشن وب بسازید تا یادگیری ماشین را به کار ببرید تهیه کنید. معماری را در نظر بگیرید: آیا مدل باید در اپلیکیشن باقی بماند یا در فضای ابری قرار گیرد؟ اگر گزینه دوم، چگونه به آن دسترسی پیدا میکنید؟ یک مدل معماری برای یک راهحل وب یادگیری ماشین طراحی کنید.
تکلیف
سلب مسئولیت:
این سند با استفاده از سرویس ترجمه هوش مصنوعی Co-op Translator ترجمه شده است. در حالی که ما تلاش میکنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه میشود از ترجمه حرفهای انسانی استفاده کنید. ما مسئولیتی در قبال سوءتفاهمها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.