טנזורים ומבצעים

TensorFlow.js היא מסגרת להגדרה והרצה של חישובים באמצעות טנסורים ב-JavaScript. טנזור הוא הכללה של וקטורים ומטריצות לממדים גבוהים יותר.

טנזורים

היחידה המרכזית של נתונים ב-TensorFlow.js היא ה- tf.Tensor : קבוצה של ערכים המעוצבים למערך של מימד אחד או יותר. tf.Tensor s דומים מאוד למערכים רב מימדיים.

tf.Tensor מכיל גם את המאפיינים הבאים:

  • rank : מגדיר כמה ממדים מכיל הטנזור
  • shape : המגדירה את הגודל של כל מימד של הנתונים
  • dtype : שמגדיר את סוג הנתונים של הטנזור.

ניתן ליצור tf.Tensor ממערך בשיטת tf.tensor() :

// Create a rank-2 tensor (matrix) matrix tensor from a multidimensional array.
const a = tf.tensor([[1, 2], [3, 4]]);
console.log('shape:', a.shape);
a.print();

// Or you can create a tensor from a flat array and specify a shape.
const shape = [2, 2];
const b = tf.tensor([1, 2, 3, 4], shape);
console.log('shape:', b.shape);
b.print();

כברירת מחדל, tf.Tensor s יהיה float32 dtype. ניתן ליצור tf.Tensor s גם עם bool, int32, complex64 ו-dtypes string:

const a = tf.tensor([[1, 2], [3, 4]], [2, 2], 'int32');
console.log('shape:', a.shape);
console.log('dtype', a.dtype);
a.print();

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

שינוי הצורה של טנסור

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

const a = tf.tensor([[1, 2], [3, 4]]);
console.log('a shape:', a.shape);
a.print();

const b = a.reshape([4, 1]);
console.log('b shape:', b.shape);
b.print();

קבלת ערכים מטנסור

אתה יכול גם לקבל את הערכים מ- tf.Tensor באמצעות השיטות Tensor.array() או Tensor.data() :

 const a = tf.tensor([[1, 2], [3, 4]]);
 // Returns the multi dimensional array of values.
 a.array().then(array => console.log(array));
 // Returns the flattened data that backs the tensor.
 a.data().then(data => console.log(data));

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

const a = tf.tensor([[1, 2], [3, 4]]);
// Returns the multi dimensional array of values.
console.log(a.arraySync());
// Returns the flattened data that backs the tensor.
console.log(a.dataSync());

פעולות

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

דוגמה: חישוב x 2 של כל האלמנטים ב- tf.Tensor :

const x = tf.tensor([1, 2, 3, 4]);
const y = x.square();  // equivalent to tf.square(x)
y.print();

דוגמה: הוספת אלמנטים של שני tf.Tensor של אלמנטים:

const a = tf.tensor([1, 2, 3, 4]);
const b = tf.tensor([10, 20, 30, 40]);
const y = a.add(b);  // equivalent to tf.add(a, b)
y.print();

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

תוכל למצוא רשימה של הפעולות שבהן TensorFlow.js תומך כאן .

זיכרון

בעת שימוש ב-WebGL backend, זיכרון tf.Tensor חייב להיות מנוהל באופן מפורש ( לא מספיק לתת ל- tf.Tensor לצאת מהתחום כדי שהזיכרון שלו ישוחרר).

כדי להרוס את הזיכרון של tf.Tensor, אתה יכול להשתמש בשיטת dispose() או tf.dispose() :

const a = tf.tensor([[1, 2], [3, 4]]);
a.dispose(); // Equivalent to tf.dispose(a)

מקובל מאוד לשרשר מספר פעולות יחד באפליקציה. החזקת הפניה לכל משתני הביניים כדי להיפטר מהם יכולה להפחית את קריאות הקוד. כדי לפתור בעיה זו, TensorFlow.js מספקת שיטה tf.tidy() אשר מנקה את כל tf.Tensor s שאינם מוחזרים על ידי פונקציה לאחר ביצועה, בדומה לאופן שבו משתנים מקומיים מנקים כאשר פונקציה מבוצעת:

const a = tf.tensor([[1, 2], [3, 4]]);
const y = tf.tidy(() => {
  const result = a.square().log().neg();
  return result;
});

בדוגמה זו, התוצאה של square() ו- log() תימחק אוטומטית. התוצאה של neg() לא תימחק מכיוון שהיא ערך ההחזרה של ה-tf.tidy().

אתה יכול גם לקבל את מספר הטנסורים שעוקבים אחריהם על ידי TensorFlow.js:

console.log(tf.memory());

האובייקט המודפס על ידי tf.memory() יכיל מידע על כמה זיכרון מוקצה כעת. תוכל למצוא מידע נוסף כאן .