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

รุ่นและชั้น

ในการเรียนรู้เครื่องรุ่นเป็นฟังก์ชั่นที่มี learnable พารามิเตอร์ ที่แมปการป้อนข้อมูลเพื่อการส่งออก พารามิเตอร์ที่เหมาะสมได้มาจากการฝึกโมเดลเกี่ยวกับข้อมูล โมเดลที่ได้รับการฝึกอบรมมาอย่างดีจะให้การแมปที่แม่นยำจากอินพุตไปยังเอาต์พุตที่ต้องการ

ใน TensorFlow.js มีสองวิธีในการสร้างโมเดลการเรียนรู้ของเครื่อง:

  1. ใช้เลเยอร์ API ที่คุณสร้างแบบจำลองโดยใช้ชั้น
  2. โดยใช้หลัก API กับปฏิบัติการในระดับต่ำกว่าเช่น tf.matMul() , tf.add() ฯลฯ

อันดับแรก เราจะดูที่ Layers API ซึ่งเป็น API ระดับสูงกว่าสำหรับการสร้างแบบจำลอง จากนั้นเราจะแสดงวิธีสร้างโมเดลเดียวกันโดยใช้ Core API

การสร้างโมเดลด้วย Layers API

รูปแบบลำดับและรูปแบบการทำงาน: มีสองวิธีในการสร้างรูปแบบการใช้เลเยอร์ API เป็น สองส่วนถัดไปจะพิจารณาแต่ละประเภทให้ละเอียดยิ่งขึ้น

โมเดลตามลำดับ

ชนิดที่พบมากที่สุดของรูปแบบเป็น Sequential รุ่นซึ่งเป็นกองเชิงเส้นของชั้น คุณสามารถสร้าง Sequential รุ่นโดยผ่านรายการของชั้นไป sequential() ฟังก์ชั่น:

const model = tf.sequential({
 layers: [
   tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}),
   tf.layers.dense({units: 10, activation: 'softmax'}),
 ]
});

หรือผ่านทาง add() วิธีการ:

const model = tf.sequential();
model.add(tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));

สำคัญ: ชั้นแรกในรูปแบบความต้องการ inputShape ให้แน่ใจว่าคุณไม่รวมชุดขนาดเมื่อให้ inputShape ตัวอย่างเช่นถ้าคุณวางแผนที่จะเลี้ยงเทนเซอร์รูปแบบของรูปร่าง [B, 784] ที่ B สามารถเป็นชุดขนาดใด ๆ ที่ระบุ inputShape เป็น [784] เมื่อมีการสร้างแบบจำลอง

คุณสามารถเข้าถึงชั้นของรูปแบบผ่าน model.layers และอื่น ๆ โดยเฉพาะ model.inputLayers และ model.outputLayers

รูปแบบการใช้งาน

วิธีการที่จะสร้างอีก LayersModel ผ่านทาง tf.model() ฟังก์ชั่น ความแตกต่างที่สำคัญระหว่าง tf.model() และ tf.sequential() คือว่า tf.model() ช่วยให้คุณสร้างกราฟโดยพลการของชั้นตราบใดที่พวกเขาไม่ได้รอบ

นี่คือข้อมูลโค้ดที่กำหนดรูปแบบเดียวกันกับข้างต้นใช้ tf.model() API:

// Create an arbitrary graph of layers, by connecting them
// via the apply() method.
const input = tf.input({shape: [784]});
const dense1 = tf.layers.dense({units: 32, activation: 'relu'}).apply(input);
const dense2 = tf.layers.dense({units: 10, activation: 'softmax'}).apply(dense1);
const model = tf.model({inputs: input, outputs: dense2});

เราเรียก apply() ในแต่ละชั้นเพื่อที่จะเชื่อมต่อการส่งออกของชั้นอื่น ผลมาจากการ apply() ในกรณีนี้เป็น SymbolicTensor ซึ่งทำหน้าที่เหมือน Tensor แต่ไม่มีค่าใด ๆ ที่เป็นรูปธรรม

หมายเหตุว่าแตกต่างจากรูปแบบตามลำดับเราจะสร้าง SymbolicTensor ผ่าน tf.input() แทนการให้ inputShape กับชั้นแรก

apply() นอกจากนี้ยังสามารถให้คุณคอนกรีต Tensor ถ้าคุณผ่านคอนกรีต Tensor ไป:

const t = tf.tensor([-2, 1, 0, 5]);
const o = tf.layers.activation({activation: 'relu'}).apply(t);
o.print(); // [0, 1, 0, 5]

สิ่งนี้มีประโยชน์เมื่อทดสอบเลเยอร์แบบแยกส่วนและเห็นผลลัพธ์

เช่นเดียวกับในรูปแบบลำดับคุณสามารถเข้าถึงชั้นของรูปแบบผ่าน model.layers และอื่น ๆ โดยเฉพาะ model.inputLayers และ model.outputLayers

การตรวจสอบความถูกต้อง

ทั้งสองรูปแบบตามลำดับและรูปแบบการทำงานกรณีของ LayersModel ระดับ หนึ่งในผลประโยชน์ที่สำคัญของการทำงานร่วมกับ LayersModel มีการตรวจสอบ: มันบังคับให้คุณสามารถระบุรูปร่างการป้อนข้อมูลและจะใช้ในภายหลังเพื่อตรวจสอบการป้อนข้อมูลของคุณ LayersModel ยังไม่อนุมานรูปร่างอัตโนมัติเป็นข้อมูลที่ไหลผ่านชั้น การรู้รูปร่างล่วงหน้าช่วยให้โมเดลสร้างพารามิเตอร์ได้โดยอัตโนมัติ และสามารถบอกคุณได้ว่าเลเยอร์ที่ต่อเนื่องกัน 2 ชั้นเข้ากันไม่ได้หรือไม่

สรุปโมเดล

โทร model.summary() เพื่อพิมพ์สรุปประโยชน์ของรูปแบบซึ่งรวมถึง:

  • ชื่อและประเภทของเลเยอร์ทั้งหมดในแบบจำลอง
  • รูปร่างเอาต์พุตสำหรับแต่ละชั้น
  • จำนวนพารามิเตอร์น้ำหนักของแต่ละชั้น
  • หากโมเดลมีโทโพโลยีทั่วไป (อธิบายไว้ด้านล่าง) อินพุตแต่ละเลเยอร์จะได้รับ
  • จำนวนพารามิเตอร์ที่ฝึกได้และไม่สามารถฝึกได้ทั้งหมดของโมเดล

สำหรับโมเดลที่เรากำหนดไว้ข้างต้น เราได้ผลลัพธ์ต่อไปนี้บนคอนโซล:

เลเยอร์ (ประเภท) รูปร่างเอาต์พุต พารามิเตอร์ #
หนาแน่น_Dense1 (หนาแน่น) [null,32] 25120
หนาแน่น_หนาแน่น2 (หนาแน่น) [null,10] 330
พารามิเตอร์ทั้งหมด: 25450
Params ที่ฝึกได้: 25450
พารามิเตอร์ที่ไม่สามารถฝึกได้: 0

หมายเหตุ null ค่าในรูปทรงที่การส่งออกของชั้น: เตือนว่ารูปแบบคาดว่าการป้อนข้อมูลที่จะมีชุดขนาดเป็นมิติด้านนอกสุดซึ่งในกรณีนี้สามารถมีความยืดหยุ่นเนื่องจากการ null ค่า

การทำให้เป็นอนุกรม

หนึ่งในผลประโยชน์ที่สำคัญของการใช้ LayersModel มากกว่าในระดับที่ต่ำกว่า API เป็นความสามารถในการบันทึกและโหลดรูปแบบ LayersModel รู้เกี่ยวกับ:

  • สถาปัตยกรรมของแบบจำลอง ช่วยให้คุณสร้างแบบจำลองใหม่ได้
  • น้ำหนักของรุ่น
  • การกำหนดค่าการฝึกอบรม (การสูญเสีย ตัวเพิ่มประสิทธิภาพ ตัวชี้วัด)
  • สถานะของเครื่องมือเพิ่มประสิทธิภาพ ช่วยให้คุณกลับมาฝึกต่อได้

ในการบันทึกหรือโหลดโมเดลนั้น มีโค้ดเพียง 1 บรรทัด:

const saveResult = await model.save('localstorage://my-model-1');
const model = await tf.loadLayersModel('localstorage://my-model-1');

ตัวอย่างข้างต้นบันทึกโมเดลไปยังที่จัดเก็บในตัวเครื่องในเบราว์เซอร์ ดู model.save() documentation และ บันทึกและโหลด คู่มือสำหรับวิธีการที่จะบันทึกลงในสื่อที่แตกต่างกัน (เช่นการจัดเก็บไฟล์, IndexedDB , เรียกการดาวน์โหลดเบราว์เซอร์อื่น ๆ )

เลเยอร์ที่กำหนดเอง

เลเยอร์เป็นส่วนสำคัญของโมเดล หากโมเดลของคุณใช้การคำนวณแบบกำหนดเอง คุณสามารถกำหนดเลเยอร์ที่กำหนดเอง ซึ่งจะโต้ตอบกับเลเยอร์ที่เหลือได้ดี ด้านล่างนี้ เรากำหนดเลเยอร์ที่กำหนดเองซึ่งคำนวณผลรวมของสี่เหลี่ยมจัตุรัส:

class SquaredSumLayer extends tf.layers.Layer {
 constructor() {
   super({});
 }
 // In this case, the output is a scalar.
 computeOutputShape(inputShape) { return []; }

 // call() is where we do the computation.
 call(input, kwargs) { return input.square().sum();}

 // Every layer needs a unique name.
 getClassName() { return 'SquaredSum'; }
}

เพื่อทดสอบเราสามารถเรียก apply() ด้วยวิธีเมตริกซ์คอนกรีต:

const t = tf.tensor([-2, 1, 0, 5]);
const o = new SquaredSumLayer().apply(t);
o.print(); // prints 30

สำคัญ: หากคุณเพิ่มเลเยอร์ที่กำหนดเอง คุณจะสูญเสียความสามารถในการทำให้โมเดลเป็นอนุกรม

การสร้างโมเดลด้วย Core API

ในตอนต้นของคู่มือนี้ เรากล่าวว่ามีสองวิธีในการสร้างแบบจำลองการเรียนรู้ของเครื่องใน TensorFlow.js

กฎทั่วไปของหัวแม่มือคือการพยายามที่จะใช้เลเยอร์ API แรกเพราะมันเป็นแบบจำลองหลังจาก Keras API ดีลูกบุญธรรมซึ่งต่อไปนี้ ปฏิบัติที่ดีที่สุดและช่วยลดภาระทางปัญญา Layers API ยังนำเสนอโซลูชันที่พร้อมใช้งานได้ทันที เช่น การเริ่มต้นน้ำหนัก การทำให้เป็นอนุกรมของแบบจำลอง การฝึกตรวจสอบ การพกพา และการตรวจสอบความปลอดภัย

คุณอาจต้องการใช้ Core API เมื่อใดก็ตามที่:

  • คุณต้องการความยืดหยุ่นหรือการควบคุมสูงสุด
  • คุณไม่จำเป็นต้องซีเรียลไลซ์เซชั่น หรือสามารถใช้ลอจิกซีเรียลไลซ์เซชั่นของคุณเองได้

รุ่นในคอ API ที่มีฟังก์ชั่นที่ใช้เวลาเพียงแค่หนึ่งหรือมากกว่า Tensors และกลับ Tensor โมเดลเดียวกับด้านบนที่เขียนโดยใช้ Core API มีลักษณะดังนี้:

// The weights and biases for the two dense layers.
const w1 = tf.variable(tf.randomNormal([784, 32]));
const b1 = tf.variable(tf.randomNormal([32]));
const w2 = tf.variable(tf.randomNormal([32, 10]));
const b2 = tf.variable(tf.randomNormal([10]));

function model(x) {
  return x.matMul(w1).add(b1).relu().matMul(w2).add(b2).softmax();
}

โปรดทราบว่าใน Core API เรามีหน้าที่สร้างและเริ่มต้นน้ำหนักของโมเดล น้ำหนักทุกคนจะได้รับการสนับสนุนโดย Variable ที่สัญญาณไปยัง TensorFlow.js ว่าเทนเซอร์เหล่านี้เป็น learnable คุณสามารถสร้าง Variable ใช้ tf.variable () และผ่านในที่มีอยู่ Tensor

ในคู่มือนี้ คุณจะได้ทำความคุ้นเคยกับวิธีต่างๆ ในการสร้างแบบจำลองโดยใช้ Layers และ Core API ถัดไปดู การฝึกอบรมรุ่นที่ แนะนำสำหรับวิธีการในการฝึกอบรมแบบ