เทนเซอร์และการทำงาน

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 จะมี dtype. float32 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 และอื่นๆ อีกมากมาย ซึ่งคุณสามารถพบได้ ที่นี่

การเปลี่ยนรูปร่างของเทนเซอร์

จำนวนองค์ประกอบใน 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 สองรายการ:

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() จะมีข้อมูลเกี่ยวกับจำนวนหน่วยความจำที่ได้รับการจัดสรรในปัจจุบัน คุณสามารถหาข้อมูลเพิ่มเติม ได้ที่นี่