ייצוא מודל בינה מלאכותית לשימוש בדפדפן

מחבר:
בתאריך:

אחרי שלמדנו כיצד לפתח מודלים של בינה מלאכותית הגיע הזמן לאפשר למשתמשים רגילים להשתמש בבינה שאנו מפתחים. הממשק שדרכו אנשים בדרך כלל עובדים עם תוכנות הוא באמצעות האינטרנט. מדריך זה מסביר כיצד לייצא מודלים של בינה מלאכותית מבוססי ספריית Keras לדפדפן באמצעות tensorflowjs. הדוגמה שלנו מתבססת על המודל שפתחנו במדריך "מודל לינארי הכולל משתנים קטגוריים לחיזוי מחירי בתים". תוכלו לראות את הקוד בפעולה אם תגללו לתחתית המדריך, ותזינו ערכים לטופס. שימו לב! מחירי הבתים החזויים מבוססים על נתונים של מחירי בתים בסקרמנטו בארה"ב וכל קשר ביניהם ובין המציאות הישראלית מקרי בהחלט.

ייצוא מודל Keras ל-tensorflowjs לצורך שימוש באפליקציה בדפדפן

 

שמירת המודל

אחרי שפיתחתי ואימנתי את המודל באמצעות Keras, שמרתי אותו לתיקיית Models.

כדי ליצור את התיקייה השתמשתי בפקודה הבאה שהרצתי בטרמינל:

!mkdir Models/

בסביבת colab סימן הקריאה (!) משמש לעבודה עם הטרמינל.

נשמור את המודל שפתחנו לקובץ בפורמט h5:

# Save Python model
model.save('Models/multivariate_and_categorical_analysis_for_home_prices.h5', overwrite=True)
  • לקובץ המודל המיוצא נתתי שם תיאורי multivariate_and_categorical_analysis_for_home_prices.h5
  • הכרחי שפורמט הקובץ יהיה h5.

נוודא שקובץ המודל אכן קיים בתיקייה Models:

!ls –la Models

 

ייצוא המודל לקבצים שניתן להשתמש בהם בדפדפן

כדי לייצא את המודל לקבצים שניתן להשתמש בהם אחר כך בדפדפן, נתחיל מיצירת התיקייה שאליה נייצא את הקבצים:

!mkdir ModelJS/

נתקין את ספריית tensorflowjs שתשמש להמרת המודל באמצעות pip:

!pip3 install tensorflowjs

את ההמרה בפועל מבצעת הפונקציה tensorflowjs_converter, שממקמת את הקבצים המומרים בתיקיית היעד:

!tensorflowjs_converter --input_format=keras Models/multivariate_and_categorical_analysis_for_home_prices.h5 ModelJS/

הפרמטרים שמקבלת הפונקציה הם:

  • הפורמט של הקובץ המקורי שהוא Keras
  • מקור המודל (קובץ h5) שיצרנו בצעד הקודם
  • והתיקייה שאליה הפונקציה צריכה לייצא את הקבצים המומרים (ModelJS/)

נוודא שקבצי המודל אכן יוצאו לתיקיית היעד:

!ls -la ModelJS/

אפשר למצוא בתיקייה את הקבצים הבאים: model.json וקבצים נוספים.

  • קובץ json מכיל את כל המידע על המודל כולל ארכיטקרטורה ומטה-מידע.
  • כל יתר הקבצים הם קבצי המשקולות. ככל שהמודל יהיה מורכב יותר כך יהיו יותר קבצי משקולות.

 

הורדת הקבצים מסביבת colab

את המודל פתחתי בסביבת colab. אחרי שקבלנו קבצי מודל ניתנים לייצוא, נוריד אותם אל המחשב כדי שנוכל להשתמש בהם בהמשך:

import os
from google.colab import files

src_folder = 'ModelJS/'

for filename in os.listdir(folder):
  files.download('%s%s' % (src_folder, filename)) 
  print("download %s%s" % (src_folder, filename))

 

פיתוח האפליקציה

האפליקציה כוללת קובץ index.html ואת תיקיית ה-api.

הקובץ index.html מכיל טופס אינטרנטי וסקריפט שישגר את המידע שמזין המשתמש לצד ה-api שיחזיר מצידו את המידע שיוצג למשתמש באפליקציה בתור תחזית מחירי הדירות.

את הטופס נמקם בתוך index.html לחץ כאן כדי להוריד את קוד ה-HTML של הטופס.

בתיקיית ה-api נמקם את קבצי המשקולות של המודל המאומן שהורדנו בצעד הקודם. לחץ כאן כדי להוריד את קבצי המשקולות.

הסקריפט מבוסס ה-javascript הבא שולח את הנתונים לצד ה-api ומציג את הנתונים המוחזרים למשתמש.

// API url
var model;
var apiUrl = './api/model.json';

// get the model from the api when loaded
(async function getModel() {
    return model = await tf.loadLayersModel(apiUrl);
}());

var predict = function(){
  var beds = +jQuery('#beds').val();
  var baths = +jQuery('#baths').val();
	
  // convert m^2 to sq__ft
  var sq__ft = jQuery('#sq__ft').val() * 10.764; 
	
  // one-hot encode the type
  var multiFamily = 0;
  var residential = 0;
  var type = jQuery('#type').val();
  if(type == 1){
    multiFamily = 1;
  } else if(type == 2){
    residential = 1;
  }

  // send to the api
  var inputData = tf.tensor2d([[beds,baths,sq__ft,multiFamily,residential]], [1, 5]);

  // get the results
  var res = model.predict(inputData).dataSync();

  // convert dollars to nis
  var resNis = res[0] * 3.5;
	
  // show the results
  jQuery('#msg').text(Math.ceil(resNis) + '₪');
};

// on form submit call the predict method
jQuery('#theForm').on('submit', function(event){
	event.preventDefault();
    predict();
});

הסקריפט מדבר בעד עצמו, ולכן לא ארחיב עליו את ההסברים. לחץ כאן כדי להוריד גרסה משוכללת יותר של הסקריפט.

 

הערכת מחירי בתים

במדריך הבא נפרוס את המודל על שרת של פייתון כדי שמשתמשים יוכלו להוציא תחזיות של מחירי בתים.

לכל המדריכים בנושא של למידת מכונה

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

הוסף תגובה חדשה

 

= 7 + 8

תמונת המגיב

רזיאל בתאריך: 25.04.2021

היי , מדריך מעולה , תודה ! רק דבר אחד לא מפורש. כאשר אני מזין נתונים בתוך המודל הוא מציג לי תוצאות לא נכונות , מהסיבה שאנחנו עשינו נרמול לערכים לערכים והוא מצפה לקבל ערכים מנורמלים ולא ערכים רגילים. לא ברור במה השתמשת כדי להתגבר על כך..? INVERSE_TRANSFORM? אשמח לעדכון:)

תמונת המגיב

יוסי בן הרוש בתאריך: 01.05.2021

שאלה מצוינת. תעשה לנתונים שהמשתמש מזין את אותה הטרנספורמציה שעשית לנתונים ששימשו במסגרת אימון המודל. אם כשאימנתי את המודל נירמלתי על ידי הפחתת ממוצע קבוצת האימון וחילקתי בסטיית התקן אז כתבתי פונקציה שמקבלת את הנתונים שמזין המשתמש ומפעילה עליהם את הטנספורמציה עם הערכים הסטטיסטיים הידועים מאימון המודל.

תמונת המגיב

רזיאל בתאריך: 08.05.2021

היי , תודה רבה על המענה!!! תיארתי לעצמי שזה מה שצריך לעשות:) בנוסף אשמח לדעת באיזה שיטת נרמול כדאי להשתמש? מה שאתה כתבת או min_max_scalar ? או שפשוט ניסוי וטעייה:(

תמונת המגיב

יוסי בן הרוש בתאריך: 14.05.2021

הי רזיאל, אפשר לחלק את הפרש הדוגמה מממוצע העמודה בסטיית התקן. ראה: חיזוי מחירי בתים באמצעות למידת מכונה ומודל מרובה משתנים

תמונת המגיב

יוסי בן הרוש בתאריך: 17.07.2021

בהמשך לתשובתי כתבתי מדריך שמלמד כיצד לפרוס את המודל על שרת פייתון FastApi עם שני יתרונו מרכזיים: המודל מוסתר מהמשתמש וגם ה-preprocessing יכול להיות זהה למודל שכתבנו בפייתון.