ดูการสาธิต #MadeWithTFJS ใหม่ที่แสดงต่อไปของเราและบอกสดในวันที่ 1 ต.ค. 09:00 PT ดูบน YouTube

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

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 และ 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 element-wise:

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