الموترات والعمليات

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 باستخدام أنواع 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 s، وغيرها الكثير التي يمكنك العثور عليها هنا .

تغيير شكل Tensor

عدد العناصر في 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();

الحصول على القيم من Tensor

يمكنك أيضًا الحصول على القيم من 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();

نظرًا لأن الموترات غير قابلة للتغيير، فإن هذه العمليات لا تغير قيمها. بدلاً من ذلك، تقوم ops return دائمًا بإرجاع tf.Tensor s جديد.

يمكنك العثور على قائمة بالعمليات التي يدعمها TensorFlow.js هنا .

ذاكرة

عند استخدام الواجهة الخلفية 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().

يمكنك أيضًا الحصول على عدد Tensors التي يتم تتبعها بواسطة TensorFlow.js:

console.log(tf.memory());

سيحتوي الكائن المطبوع بواسطة tf.memory() على معلومات حول مقدار الذاكرة المخصصة حاليًا. يمكنك العثور على مزيد من المعلومات هنا .