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/fa/3-Web-App/1-Web-App
leestott e4050807fb
🌐 Update translations via Co-op Translator
2 weeks ago
..
solution 🌐 Update translations via Co-op Translator 2 weeks ago
README.md 🌐 Update translations via Co-op Translator 2 weeks ago
assignment.md 🌐 Update translations via Co-op Translator 2 weeks ago
notebook.ipynb 🌐 Update translations via Co-op Translator 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 شامل ستون‌هایی درباره شهر، ایالت و کشور محل مشاهده، شکل شیء و عرض جغرافیایی و طول جغرافیایی آن است.

در نوت‌بوک خالی که در این درس گنجانده شده است:

  1. pandas، matplotlib و numpy را همانطور که در درس‌های قبلی انجام دادید وارد کنید و صفحه‌گسترده ufos را وارد کنید. می‌توانید به یک نمونه داده نگاه کنید:

    import pandas as pd
    import numpy as np
    
    ufos = pd.read_csv('./data/ufos.csv')
    ufos.head()
    
  2. داده‌های ufos را به یک dataframe کوچک با عناوین تازه تبدیل کنید. مقادیر منحصربه‌فرد در فیلد Country را بررسی کنید.

    ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})
    
    ufos.Country.unique()
    
  3. اکنون می‌توانید مقدار داده‌هایی که باید با آن‌ها کار کنید را با حذف مقادیر null و فقط وارد کردن مشاهدات بین ۱-۶۰ ثانیه کاهش دهید:

    ufos.dropna(inplace=True)
    
    ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]
    
    ufos.info()
    
  4. کتابخانه 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
    

تمرین - ساخت مدل

اکنون می‌توانید آماده شوید تا مدل را با تقسیم داده‌ها به گروه‌های آموزشی و آزمایشی آموزش دهید.

  1. سه ویژگی‌ای که می‌خواهید بر اساس آن‌ها آموزش دهید را به عنوان بردار 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)
    
  2. مدل خود را با استفاده از رگرسیون لجستیک آموزش دهید:

    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 بسازید تا مدل خود را فراخوانی کنید و نتایج مشابهی را به شکلی زیباتر نمایش دهید.

  1. ابتدا یک پوشه به نام web-app در کنار فایل notebook.ipynb که فایل ufo-model.pkl شما در آن قرار دارد ایجاد کنید.

  2. در آن پوشه سه پوشه دیگر ایجاد کنید: static، با یک پوشه css داخل آن، و templates. اکنون باید فایل‌ها و دایرکتوری‌های زیر را داشته باشید:

    web-app/
      static/
        css/
      templates/
    notebook.ipynb
    ufo-model.pkl
    

    به پوشه solution برای مشاهده اپلیکیشن نهایی مراجعه کنید

  3. اولین فایلی که باید در پوشه web-app ایجاد کنید فایل requirements.txt است. مانند package.json در یک اپلیکیشن جاوااسکریپت، این فایل وابستگی‌های مورد نیاز اپلیکیشن را لیست می‌کند. در requirements.txt خطوط زیر را اضافه کنید:

    scikit-learn
    pandas
    numpy
    flask
    
  4. اکنون این فایل را با حرکت به web-app اجرا کنید:

    cd web-app
    
  5. در ترمینال خود تایپ کنید pip install، تا کتابخانه‌های لیست‌شده در requirements.txt نصب شوند:

    pip install -r requirements.txt
    
  6. اکنون آماده هستید تا سه فایل دیگر برای تکمیل اپلیکیشن ایجاد کنید:

    1. فایل app.py را در ریشه ایجاد کنید.
    2. فایل index.html را در دایرکتوری templates ایجاد کنید.
    3. فایل styles.css را در دایرکتوری static/css ایجاد کنید.
  7. فایل 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;
    }
    
  8. سپس فایل 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 ارسال می‌کند.

    در نهایت، آماده هستید تا فایل پایتون که مصرف مدل و نمایش پیش‌بینی‌ها را هدایت می‌کند بسازید:

  9. در 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 نگاه کنید:

  1. ابتدا وابستگی‌ها بارگذاری می‌شوند و اپلیکیشن شروع می‌شود.
  2. سپس مدل وارد می‌شود.
  3. سپس index.html در مسیر اصلی رندر می‌شود.

در مسیر /predict، چندین اتفاق رخ می‌دهد وقتی فرم ارسال می‌شود:

  1. متغیرهای فرم جمع‌آوری شده و به یک آرایه numpy تبدیل می‌شوند. سپس به مدل ارسال می‌شوند و یک پیش‌بینی بازگردانده می‌شود.
  2. کشورهایی که می‌خواهیم نمایش داده شوند به متن قابل خواندن از کد کشور پیش‌بینی‌شده تبدیل می‌شوند و آن مقدار به index.html ارسال می‌شود تا در قالب رندر شود.

استفاده از مدل به این روش، با Flask و یک مدل pickled، نسبتاً ساده است. سخت‌ترین چیز این است که بفهمید داده‌هایی که باید به مدل ارسال شوند تا یک پیش‌بینی دریافت شود چه شکلی دارند. این کاملاً به نحوه آموزش مدل بستگی دارد. این مدل سه نقطه داده برای ورودی نیاز دارد تا یک پیش‌بینی ارائه دهد.

در یک محیط حرفه‌ای، می‌توانید ببینید که ارتباط خوب بین افرادی که مدل را آموزش می‌دهند و کسانی که آن را در اپلیکیشن وب یا موبایل مصرف می‌کنند چقدر ضروری است. در مورد ما، فقط یک نفر هستید، شما!


🚀 چالش

به جای کار در یک نوت‌بوک و وارد کردن مدل به اپلیکیشن Flask، می‌توانید مدل را مستقیماً در اپلیکیشن Flask آموزش دهید! سعی کنید کد پایتون خود را در نوت‌بوک تبدیل کنید، شاید پس از پاکسازی داده‌ها، تا مدل را از داخل اپلیکیشن در یک مسیر به نام train آموزش دهید. مزایا و معایب دنبال کردن این روش چیست؟

پس‌ آزمون

مرور و مطالعه شخصی

راه‌های زیادی برای ساخت اپلیکیشن وب برای مصرف مدل‌های یادگیری ماشین وجود دارد. لیستی از روش‌هایی که می‌توانید با استفاده از جاوااسکریپت یا پایتون اپلیکیشن وب بسازید تا یادگیری ماشین را به کار ببرید تهیه کنید. معماری را در نظر بگیرید: آیا مدل باید در اپلیکیشن باقی بماند یا در فضای ابری قرار گیرد؟ اگر گزینه دوم، چگونه به آن دسترسی پیدا می‌کنید؟ یک مدل معماری برای یک راه‌حل وب یادگیری ماشین طراحی کنید.

تکلیف

یک مدل متفاوت را امتحان کنید


سلب مسئولیت:
این سند با استفاده از سرویس ترجمه هوش مصنوعی Co-op Translator ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه حرفه‌ای انسانی استفاده کنید. ما مسئولیتی در قبال سوءتفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.