שמור וטען דגמים

TensorFlow.js מספק פונקציונליות לשמירה וטעינה של מודלים שנוצרו עם Layers API או שהומרו ממודלים קיימים של TensorFlow. אלו עשויים להיות מודלים שאימנתם בעצמכם או כאלו שאומנו על ידי אחרים. יתרון מרכזי בשימוש ב-Layers API הוא שהמודלים שנוצרו איתו ניתנים לסידרה וזה מה שנחקור במדריך זה.

מדריך זה יתמקד בשמירה וטעינה של דגמי TensorFlow.js (ניתן לזהות על ידי קבצי JSON). אנחנו יכולים גם לייבא דגמי TensorFlow Python. טעינת דגמים אלה מכוסה בשני המדריכים הבאים:

שמור tf.Model

tf.Model ו- tf.Sequential מספקים שניהם פונקציה model.save המאפשרת לשמור את הטופולוגיה והמשקלים של המודל.

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

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

בואו נסתכל איך נראה הקוד לשמירת דגם

const saveResult = await model.save('localstorage://my-model-1');

כמה דברים לשים לב:

  • שיטת save לוקחת ארגומנט מחרוזת דמוי URL שמתחיל בסכימה . זה מתאר את סוג היעד אליו אנו מנסים לשמור דגם. בדוגמה למעלה הסכימה היא localstorage://
  • אחרי הסכמה מופיע נתיב . בדוגמה למעלה הנתיב הוא my-model-1 .
  • שיטת save היא אסינכרונית.
  • ערך ההחזרה של model.save הוא אובייקט JSON הנושא מידע כגון גודל הבתים של הטופולוגיה והמשקלים של המודל.
  • הסביבה המשמשת לשמירת המודל אינה משפיעה על אילו סביבות יכולות לטעון את המודל. שמירת דגם ב-node.js אינה מונעת את טעינתו בדפדפן.

להלן נבחן את התוכניות השונות הזמינות.

אחסון מקומי (דפדפן בלבד)

תוכנית: localstorage://

await model.save('localstorage://my-model');

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

IndexedDB (דפדפן בלבד)

סכימה: indexeddb://

await model.save('indexeddb://my-model');

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

הורדות קבצים (דפדפן בלבד)

סכימה: downloads://

await model.save('downloads://my-model');

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

  1. קובץ JSON טקסט בשם [my-model].json , הנושא את הטופולוגיה וההפניה לקובץ המשקולות המתואר להלן.
  2. קובץ בינארי הנושא את ערכי המשקל בשם [my-model].weights.bin .

אתה יכול לשנות את השם [my-model] כדי לקבל קבצים עם שם אחר.

מכיוון שקובץ ה- .json מצביע על .bin באמצעות נתיב יחסי, שני הקבצים צריכים להיות באותה תיקיה.

בקשת HTTP(S).

תוכנית: http:// או https://

await model.save('http://model-server.domain/upload')

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

המודל יישלח לשרת HTTP שצוין באמצעות בקשת POST . גוף ה-POST הוא בפורמט multipart/form-data ומורכב משני קבצים

  1. קובץ JSON טקסט בשם model.json , הנושא את הטופולוגיה וההפניה לקובץ המשקולות המתואר להלן.
  2. קובץ בינארי הנושא את ערכי המשקל בשם model.weights.bin .

שימו לב שהשם של שני הקבצים תמיד יהיה בדיוק כפי שצוין למעלה (השם מובנה בפונקציה). מסמך API זה מכיל קטע קוד של Python המדגים כיצד ניתן להשתמש במסגרת האינטרנט של flask כדי לטפל בבקשה שמקורה ב- save .

לעתים קרובות תצטרך להעביר ארגומנטים נוספים או כותרות בקשה לשרת ה-HTTP שלך (למשל לצורך אימות או אם ברצונך לציין תיקיה שבה יש לשמור את המודל). אתה יכול להשיג שליטה עדינה על היבטים אלה של הבקשות save על ידי החלפת ארגומנט מחרוזת ה-URL ב- tf.io.browserHTTPRequest . API זה מעניק גמישות רבה יותר בשליטה בבקשות HTTP.

לדוגמה:

await model.save(tf.io.browserHTTPRequest(
    'http://model-server.domain/upload',
    {method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));

מערכת קבצים מקורית (Node.js בלבד)

סכימה: file://

await model.save('file:///path/to/my-model');

כשמריצים על Node.js יש לנו גם גישה ישירה למערכת הקבצים ויכולים לשמור שם דגמים. הפקודה למעלה תשמור שני קבצים path שצוין לאחר scheme .

  1. קובץ JSON טקסט בשם [model].json , הנושא את הטופולוגיה וההפניה לקובץ המשקולות המתואר להלן.
  2. קובץ בינארי הנושא את ערכי המשקל בשם [model].weights.bin .

שימו לב שהשם של שני הקבצים תמיד יהיה בדיוק כפי שצוין למעלה (השם מובנה בפונקציה).

טוען tf.Model

בהינתן מודל שנשמר באחת מהשיטות שלמעלה, נוכל לטעון אותו באמצעות tf.loadLayersModel API.

בואו נסתכל איך נראה הקוד לטעינת דגם

const model = await tf.loadLayersModel('localstorage://my-model-1');

כמה דברים לשים לב:

  • כמו model.save() , הפונקציה loadLayersModel לוקחת ארגומנט מחרוזת דמוי URL שמתחיל בסכמה . זה מתאר את סוג היעד ממנו אנו מנסים לטעון דגם.
  • אחרי הסכמה מופיע נתיב . בדוגמה למעלה הנתיב הוא my-model-1 .
  • ניתן להחליף את המחרוזת דמוית url באובייקט התואם לממשק IOHandler.
  • הפונקציה tf.loadLayersModel() היא אסינכרונית.
  • ערך ההחזר של tf.loadLayersModel הוא tf.Model

להלן נבחן את התוכניות השונות הזמינות.

אחסון מקומי (דפדפן בלבד)

תוכנית: localstorage://

const model = await tf.loadLayersModel('localstorage://my-model');

פעולה זו טוענת דגם בשם my-model מהאחסון המקומי של הדפדפן .

IndexedDB (דפדפן בלבד)

סכימה: indexeddb://

const model = await tf.loadLayersModel('indexeddb://my-model');

פעולה זו טוענת דגם מאחסון IndexedDB של הדפדפן.

HTTP(S)

תוכנית: http:// או https://

const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');

זה טוען מודל מנקודת קצה http. לאחר טעינת קובץ json הפונקציה תבצע בקשות לקבצי .bin תואמים שקובץ json מפנה אליהם.

מערכת קבצים מקורית (Node.js בלבד)

סכימה: file://

const model = await tf.loadLayersModel('file://path/to/my-model/model.json');

כשמריצים על Node.js יש לנו גם גישה ישירה למערכת הקבצים ויכולים לטעון מודלים משם. שימו לב שבקריאת הפונקציה למעלה אנו מתייחסים לקובץ model.json עצמו (בעוד שבשמירה אנו מציינים תיקיה). קבצי .bin המתאימים צריכים להיות באותה תיקיה כמו קובץ json .

טעינת דגמים עם IOHandlers

אם הסכמות לעיל אינן מספיקות לצרכים שלך, תוכל ליישם התנהגות טעינה מותאמת אישית עם IOHandler . IOHandler אחד ש-TensorFlow.js מספקת הוא tf.io.browserFiles המאפשר למשתמשי דפדפן להעלות קבצי דגמים לדפדפן. עיין בתיעוד למידע נוסף.

שמירה וטעינה של דגמים עם IOHandlers מותאמים אישית

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

IOHandler הוא אובייקט עם שיטת save load .

פונקציית save לוקחת פרמטר אחד שתואם את ממשק ModelArtifacts וצריכה להחזיר הבטחה שנפתרת לאובייקט SaveResult .

פונקציית load אינה לוקחת פרמטרים וצריכה להחזיר הבטחה שנפתרת לאובייקט ModelArtifacts . זהו אותו אובייקט שמועבר save .

ראה BrowserHTTRequest לקבלת דוגמה כיצד ליישם IOHandler.