Lưu ngày! Google I / O hoạt động trở lại từ ngày 18 đến 20 tháng 5 Đăng ký ngay
Trang này được dịch bởi Cloud Translation API.
Switch to English

Mô hình và lớp

Trong học máy, một mô hình là một hàm với các tham số có thể học được ánh xạ một đầu vào đến một đầu ra. Các tham số tối ưu có được bằng cách huấn luyện mô hình trên dữ liệu. Một mô hình được đào tạo tốt sẽ cung cấp một ánh xạ chính xác từ đầu vào đến đầu ra mong muốn.

Trong TensorFlow.js, có hai cách để tạo mô hình học máy:

  1. sử dụng API lớp nơi bạn xây dựng mô hình bằng cách sử dụng các lớp .
  2. sử dụng Core API với các hoạt động cấp thấp hơn như tf.matMul() , tf.add() , v.v.

Đầu tiên, chúng ta sẽ xem xét API Lớp, là một API cấp cao hơn để xây dựng mô hình. Sau đó, chúng tôi sẽ chỉ ra cách xây dựng cùng một mô hình bằng cách sử dụng API Core.

Tạo mô hình bằng API lớp

Có hai cách để tạo mô hình bằng cách sử dụng API Lớp: Mô hình tuần tự và mô hình chức năng . Hai phần tiếp theo xem xét từng loại kỹ hơn.

Mô hình tuần tự

Loại mô hình phổ biến nhất là mô hình Sequential , là một chồng các lớp tuyến tính. Bạn có thể tạo mô hình Sequential bằng cách chuyển danh sách các lớp vào hàm sequential() :

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

Hoặc thông qua phương thức 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'}));

QUAN TRỌNG: Lớp đầu tiên trong mô hình cần một inputShape . Đảm bảo rằng bạn loại trừ kích thước lô khi cung cấp inputShape . Ví dụ: nếu bạn định cung cấp các bộ căng mô hình có hình dạng [B, 784] , trong đó B có thể là bất kỳ kích thước lô nào, hãy chỉ định inputShape[784] khi tạo mô hình.

Bạn có thể truy cập các lớp của mô hình thông qua model.layers và cụ thể hơn là model.inputLayersmodel.outputLayers .

Mô hình chức năng

Một cách khác để tạo LayersModel là thông qua hàm tf.model() . Sự khác biệt chính giữa tf.model()tf.sequential()tf.model() cho phép bạn tạo một đồ thị tùy ý của các lớp, miễn là chúng không có chu kỳ.

Đây là đoạn mã xác định mô hình tương tự như trên bằng cách sử dụng API tf.model() :

// 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});

Chúng tôi gọi apply() trên mỗi lớp để kết nối nó với đầu ra của một lớp khác. Kết quả của apply() trong trường hợp này là SymbolicTensor , hoạt động giống như Tensor nhưng không có bất kỳ giá trị cụ thể nào.

Lưu ý rằng không giống như mô hình tuần tự, chúng tôi tạo một SymbolicTensor thông qua tf.input() thay vì cung cấp một inputShape cho lớp đầu tiên.

apply() cũng có thể cung cấp cho bạn một Tensor cụ thể, nếu bạn chuyển một Tensor cụ thể cho nó:

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

Điều này có thể hữu ích khi kiểm tra các lớp riêng biệt và xem đầu ra của chúng.

Cũng giống như trong mô hình tuần tự, bạn có thể truy cập các lớp của mô hình thông qua model.layers và cụ thể hơn là model.inputLayersmodel.outputLayers .

Thẩm định

Cả mô hình tuần tự và mô hình chức năng đều là các thể hiện của lớp LayersModel . Một trong những lợi ích chính khi làm việc với LayersModel là xác thực: nó buộc bạn phải chỉ định hình dạng đầu vào và sẽ sử dụng nó sau này để xác thực đầu vào của bạn. LayersModel cũng thực hiện suy luận hình dạng tự động khi dữ liệu chảy qua các lớp. Biết trước hình dạng cho phép mô hình tự động tạo các tham số của nó và có thể cho bạn biết nếu hai lớp liên tiếp không tương thích với nhau.

Tóm tắt mô hình

Gọi model.summary() để in tóm tắt hữu ích về mô hình, bao gồm:

  • Tên và kiểu của tất cả các lớp trong mô hình.
  • Hình dạng đầu ra cho mỗi lớp.
  • Số lượng các thông số trọng lượng của mỗi lớp.
  • Nếu mô hình có cấu trúc liên kết chung (được thảo luận bên dưới), các đầu vào mà mỗi lớp nhận được
  • Tổng số thông số có thể đào tạo và không thể đào tạo của mô hình.

Đối với mô hình chúng tôi đã xác định ở trên, chúng tôi nhận được kết quả sau trên bảng điều khiển:

Lớp (loại) Đầu ra hình dạng Thông số #
dày đặc_Dense1 (Dày đặc) [null, 32] 25120
dầy đặc_Dense2 (Dày đặc) [null, 10] 330
Tổng số tham số: 25450
Các thông số có thể huấn luyện: 25450
Các thông số không thể đào tạo: 0

Lưu ý các null trị null trong các hình dạng đầu ra của các lớp: lời nhắc rằng mô hình mong đợi đầu vào có kích thước lô là kích thước ngoài cùng, trong trường hợp này có thể linh hoạt do giá trị null .

Serialization

Một trong những lợi ích chính của việc sử dụng LayersModel trên API cấp thấp hơn là khả năng lưu và tải một mô hình. Một LayersModel biết về:

  • kiến trúc của mô hình, cho phép bạn tạo lại mô hình.
  • trọng lượng của mô hình
  • cấu hình đào tạo (mất mát, trình tối ưu hóa, số liệu).
  • trạng thái của trình tối ưu hóa, cho phép bạn tiếp tục đào tạo.

Để lưu hoặc tải một mô hình chỉ cần 1 dòng mã:

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

Ví dụ trên lưu mô hình vào bộ nhớ cục bộ trong trình duyệt. Xem model.save() documentation và hướng dẫn lưu và tải để biết cách lưu vào các phương tiện khác nhau (ví dụ: lưu trữ tệp, IndexedDB , kích hoạt tải xuống trình duyệt, v.v.)

Các lớp tùy chỉnh

Các lớp là các khối xây dựng của một mô hình. Nếu mô hình của bạn đang thực hiện tính toán tùy chỉnh, bạn có thể xác định một lớp tùy chỉnh, lớp này tương tác tốt với phần còn lại của các lớp. Dưới đây, chúng tôi xác định một lớp tùy chỉnh tính tổng các hình vuông:

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'; }
}

Để kiểm tra nó, chúng ta có thể gọi phương thức apply() với một tensor bê tông:

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

QUAN TRỌNG: Nếu bạn thêm một lớp tùy chỉnh, bạn sẽ mất khả năng tuần tự hóa một mô hình.

Tạo mô hình bằng Core API

Trong phần đầu của hướng dẫn này, chúng tôi đã đề cập rằng có hai cách để tạo mô hình học máy trong TensorFlow.js.

Nguyên tắc chung là luôn cố gắng sử dụng API Lớp trước, vì nó được mô phỏng theo API Keras được chấp nhận tốt, tuân theo các phương pháp hay nhất và giảm tải nhận thức . API Lớp cũng cung cấp các giải pháp khác nhau như khởi tạo trọng lượng, tuần tự hóa mô hình, đào tạo giám sát, tính di động và kiểm tra an toàn.

Bạn có thể muốn sử dụng Core API bất cứ khi nào:

  • Bạn cần sự linh hoạt hoặc kiểm soát tối đa.
  • Bạn không cần tuần tự hóa hoặc có thể triển khai logic tuần tự hóa của riêng bạn.

Các mô hình trong Core API chỉ là các hàm sử dụng một hoặc nhiều Tensors và trả về một Tensor . Mô hình tương tự như trên được viết bằng Core API trông giống như sau:

// 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();
}

Lưu ý rằng trong Core API, chúng tôi chịu trách nhiệm tạo và khởi tạo các trọng số của mô hình. Mọi trọng lượng được hỗ trợ bởi một Variable thể báo hiệu cho TensorFlow.js rằng những sức căng này có thể học được. Bạn có thể tạo một Variable bằng cách sử dụng tf.variable () và chuyển vào một Tensor hiện có.

Trong hướng dẫn này, bạn đã tự làm quen với các cách khác nhau để tạo mô hình bằng cách sử dụng Lớp và API lõi. Tiếp theo, hãy xem hướng dẫn mô hình đào tạo để biết cách đào tạo một người mẫu.