تانسورها و عملیات

TensorFlow.js چارچوبی برای تعریف و اجرای محاسبات با استفاده از تانسورها در جاوا اسکریپت است. تانسور تعمیم بردارها و ماتریس ها به ابعاد بالاتر است.

تانسورها

واحد مرکزی داده در 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 دارای dtype float32 خواهد بود dtype. tf.Tensor s را نیز می توان با bool، int32، complex64 و string dtypes ایجاد کرد:

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 و بسیاری موارد دیگر ارائه می‌کند که می‌توانید در اینجا بیابید.

تغییر شکل یک تانسور

تعداد عناصر موجود در یک 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());

عملیات

در حالی که تانسورها به شما امکان ذخیره داده ها را می دهند، عملیات (ops) به شما امکان می دهد آن داده ها را دستکاری کنید. 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 s عنصر:

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 پشتیبانی می‌کند را در اینجا بیابید.

حافظه

هنگام استفاده از Backend WebGL، حافظه 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 هایی را که پس از اجرای یک تابع برگردانده نمی‌شوند، پاک می‌کند، مشابه روشی که متغیرهای محلی هنگام اجرای یک تابع پاک می‌شوند:

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() حاوی اطلاعاتی در مورد مقدار حافظه اختصاص داده شده در حال حاضر خواهد بود. اطلاعات بیشتر را می توانید در اینجا بیابید.