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