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

API lớp TensorFlow.js cho người dùng Keras

API Lớp của TensorFlow.js được mô phỏng theo Keras và chúng tôi cố gắng làm cho API Lớp tương tự như Keras một cách hợp lý dựa trên sự khác biệt giữa JavaScript và Python. Điều này giúp người dùng có kinh nghiệm phát triển mô hình Keras bằng Python dễ dàng di chuyển sang Lớp TensorFlow.js trong JavaScript. Ví dụ: mã Keras sau đây dịch sang JavaScript:

# Python:
import keras
import numpy as np

# Build and compile model.
model = keras.Sequential()
model.add(keras.layers.Dense(units=1, input_shape=[1]))
model.compile(optimizer='sgd', loss='mean_squared_error')

# Generate some synthetic data for training.
xs = np.array([[1], [2], [3], [4]])
ys = np.array([[1], [3], [5], [7]])

# Train model with fit().
model.fit(xs, ys, epochs=1000)

# Run inference with predict().
print(model.predict(np.array([[5]])))
// JavaScript:
import * as tf from '@tensorlowjs/tfjs';

// Build and compile model.
const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]}));
model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});

// Generate some synthetic data for training.
const xs = tf.tensor2d([[1], [2], [3], [4]], [4, 1]);
const ys = tf.tensor2d([[1], [3], [5], [7]], [4, 1]);

// Train model with fit().
await model.fit(xs, ys, {epochs: 1000});

// Run inference with predict().
model.predict(tf.tensor2d([[5]], [1, 1])).print();

Tuy nhiên, có một số khác biệt mà chúng tôi muốn nêu ra và giải thích trong tài liệu này. Khi bạn hiểu những khác biệt này và lý do đằng sau chúng, việc di chuyển từ Python sang JavaScript của bạn (hoặc di chuyển theo hướng ngược lại) sẽ là một trải nghiệm tương đối suôn sẻ.

Các trình xây dựng lấy Đối tượng JavaScript làm cấu hình

So sánh các dòng Python và JavaScript sau từ ví dụ trên: cả hai đều tạo ra một lớp dày đặc .

# Python:
keras.layers.Dense(units=1, inputShape=[1])
// JavaScript:
tf.layers.dense({units: 1, inputShape: [1]});

Các hàm JavaScript không tương đương với các đối số từ khóa trong các hàm Python. Chúng tôi muốn tránh triển khai các tùy chọn hàm tạo dưới dạng đối số vị trí trong JavaScript, điều này sẽ đặc biệt cồng kềnh để ghi nhớ và sử dụng đối với các hàm tạo có số lượng lớn các đối số từ khóa (ví dụ: LSTM ). Đây là lý do tại sao chúng tôi sử dụng các đối tượng cấu hình JavaScript. Các đối tượng như vậy cung cấp cùng một mức độ bất biến vị trí và tính linh hoạt như các đối số từ khóa Python.

Một số phương thức của lớp Model, ví dụ: Model.compile() , cũng lấy một đối tượng cấu hình JavaScript làm đầu vào. Tuy nhiên, hãy nhớ rằng Model.fit() , Model.evaluate()Model.predict() hơi khác nhau. Vì phương pháp này lấy dữ liệu x (tính năng) và y (nhãn hoặc mục tiêu) bắt buộc làm đầu vào; xy là các đối số vị trí tách biệt với đối tượng cấu hình tiếp theo đóng vai trò của các đối số từ khóa. Ví dụ:

// JavaScript:
await model.fit(xs, ys, {epochs: 1000});

Model.fit () không đồng bộ

Model.fit() là phương thức chính mà người dùng thực hiện đào tạo mô hình trong TensorFlow.js. Phương pháp này thường có thể thực hiện lâu dài, kéo dài trong vài giây hoặc vài phút. Do đó, chúng tôi sử dụng các async tính năng của ngôn ngữ JavaScript, do đó chức năng này có thể được sử dụng trong một cách mà không chặn thread UI chính khi chạy trong trình duyệt. Điều này tương tự chức năng có khả năng kéo dài khác trong JavaScript, chẳng hạn như các async lấy . Lưu ý rằng async là một cấu trúc không tồn tại trong Python. Trong khi phương thức fit() trong Keras trả về một đối tượng Lịch sử, thì đối phương của phương thức fit() trong JavaScript trả về một Lời hứa lịch sử, có thể được chờ chỉnh sửa (như trong ví dụ trên) hoặc được sử dụng với phương thức then ().

Không có NumPy cho TensorFlow.js

Người dùng Python Keras thường sử dụng NumPy để thực hiện các phép toán số và mảng cơ bản, chẳng hạn như tạo các tensors 2D trong ví dụ trên.

# Python:
xs = np.array([[1], [2], [3], [4]])

Trong TensorFlow.js, loại hoạt động số cơ bản này được thực hiện với chính gói. Ví dụ:

// JavaScript:
const xs = tf.tensor2d([[1], [2], [3], [4]], [4, 1]);

Không gian tên tf.* Cũng cung cấp một số hàm khác cho các phép toán mảng và đại số tuyến tính như phép nhân ma trận. Xem tài liệu cốt lõi của TensorFlow.js để biết thêm thông tin.

Sử dụng các phương pháp của nhà máy, không phải phương pháp xây dựng

Dòng này trong Python (từ ví dụ trên) là một lời gọi hàm tạo:

# Python:
model = keras.Sequential()

Nếu được dịch đúng sang JavaScript, lệnh gọi hàm tạo tương đương sẽ giống như sau:

// JavaScript:
const model = new tf.Sequential();  // !!! DON'T DO THIS !!!

Tuy nhiên, chúng tôi quyết định không sử dụng các hàm tạo “mới” vì 1) từ khóa “mới” sẽ làm cho mã trở nên cồng kềnh hơn và 2) hàm tạo “mới” được coi là một “phần xấu” của JavaScript: một cạm bẫy tiềm ẩn, như được lập luận trong JavaScript: Phần tốt . Để tạo các mô hình và lớp trong TensorFlow.js, bạn gọi các phương thức gốc, có tên thấp hơnCamelCase, ví dụ:

// JavaScript:
const model = tf.sequential();

const layer = tf.layers.batchNormalization({axis: 1});

Giá trị chuỗi tùy chọn là lowCamelCase, không phải solid_case

Trong JavaScript, việc sử dụng chữ hoa lạc đà cho tên biểu tượng (ví dụ: xem Hướng dẫn kiểu JavaScript của Google ) phổ biến hơn, so với Python, trong đó chữ viết hoa con rắn là phổ biến (ví dụ: trong Keras). Do đó, chúng tôi quyết định sử dụng LowerCamelCase cho các giá trị chuỗi cho các tùy chọn bao gồm:

  • DataFormat, ví dụ, channelsFirst thay vì channels_first
  • Trình khởi tạo, ví dụ: glorotNormal thay vì glorot_normal
  • Mất mát và số liệu, ví dụ: meanSquaredError thay vì mean_squared_error , categoricalCrossentropy thay vì categorical_crossentropy .

Ví dụ, như trong ví dụ trên:

// JavaScript:
model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});

Liên quan đến tuần tự hóa mô hình và giải mã hóa, hãy yên tâm. Cơ chế nội bộ của TensorFlow.js đảm bảo rằng các trường hợp rắn trong các đối tượng JSON được xử lý chính xác, ví dụ: khi tải các mô hình được đào tạo trước từ Python Keras.

Chạy các đối tượng Layer với apply (), không phải bằng cách gọi chúng dưới dạng hàm

Trong Keras, một đối tượng Layer có phương thức __call__ được định nghĩa. Do đó, người dùng có thể gọi logic của lớp bằng cách gọi đối tượng dưới dạng một hàm, ví dụ:

# Python:
my_input = keras.Input(shape=[2, 4])
flatten = keras.layers.Flatten()

print(flatten(my_input).shape)

Đường cú pháp Python này được triển khai dưới dạng phương thức apply () trong TensorFlow.js:

// JavaScript:
const myInput = tf.input({shape: [2, 4]});
const flatten = tf.layers.flatten();

console.log(flatten.apply(myInput).shape);

Layer.apply () hỗ trợ đánh giá bắt buộc (háo hức) trên máy căng bê tông

Hiện tại, trong Keras, phương thức gọi chỉ có thể hoạt động trên các đối tượng tf.Tensor của TensorFlow (giả sử TensorFlow backend), mang tính biểu tượng và không chứa các giá trị số thực tế. Đây là những gì được hiển thị trong ví dụ trong phần trước. Tuy nhiên, trong TensorFlow.js, phương thức apply () của các lớp có thể hoạt động ở cả chế độ tượng trưng và mệnh lệnh. Nếu apply() được gọi bằng SymbolicTensor (tương tự như tf.Tensor), giá trị trả về sẽ là SymbolicTensor. Điều này thường xảy ra trong quá trình xây dựng mô hình. Nhưng nếu apply() được gọi với một giá trị Tensor cụ thể thực tế, nó sẽ trả về một Tensor cụ thể. Ví dụ:

// JavaScript:
const flatten = tf.layers.flatten();

flatten.apply(tf.ones([2, 3, 4])).print();

Tính năng này gợi nhớ đến (Python) TensorFlow's Eager Execution . Nó mang lại khả năng tương tác và gỡ lỗi cao hơn trong quá trình phát triển mô hình, ngoài ra còn mở ra cánh cửa để tạo ra các mạng nơ-ron động.

Trình tối ưu hóa đang được đào tạo. , không phải trình tối ưu hóa.

Trong Keras, các hàm tạo cho các đối tượng của Trình tối ưu hóa nằm trong không gian tên keras.optimizers.* . Trong TensorFlow.js Layers, các phương thức ban đầu cho Trình tối ưu hóa nằm trong không gian tên tf.train.* . Ví dụ:

# Python:
my_sgd = keras.optimizers.sgd(lr=0.2)
// JavaScript:
const mySGD = tf.train.sgd({lr: 0.2});

loadLayersModel () tải từ một URL, không phải tệp HDF5

Trong Keras, các mô hình thường được lưu dưới dạng tệp HDF5 (.h5), tệp này có thể được tải sau bằng phương thức keras.models.load_model() . Phương thức này có một đường dẫn đến tệp .h5. Bản sao của load_model() trong TensorFlow.js là tf.loadLayersModel() . Vì HDF5 không phải là định dạng tệp thân thiện với trình duyệt, tf.loadLayersModel() có định dạng dành riêng cho TensorFlow.js. tf.loadLayersModel() nhận tệp model.json làm đối số đầu vào của nó. Model.json có thể được chuyển đổi từ tệp Keras HDF5 bằng cách sử dụng gói pip tensorflowjs.

// JavaScript:
const model = await tf.loadLayersModel('https://foo.bar/model.json');

Cũng lưu ý rằng tf.loadLayersModel() trả về một Promise của tf.Model .

Nói chung, tiết kiệm và tải tf.Model s trong TensorFlow.js được thực hiện bằng cách sử dụng tf.Model.savetf.loadLayersModel phương pháp tương ứng. Chúng tôi đã thiết kế các API này tương tự như API save và load_model của Keras. Nhưng môi trường trình duyệt hoàn toàn khác với môi trường phụ trợ mà trên đó các khung học sâu chủ yếu như Keras chạy, đặc biệt là trong mảng các tuyến để lưu trữ và chuyển đổi dữ liệu. Do đó, có một số khác biệt thú vị giữa các API lưu / tải trong TensorFlow.js và trong Keras. Xem hướng dẫn của chúng tôi về Lưu và tải tf.Model để biết thêm chi tiết.

Sử dụng fitDataset() để huấn luyện các mô hình bằng cách sử dụng các đối tượngtf.data.Dataset

Trong tf.keras của Python TensorFlow, một mô hình có thể được đào tạo bằng cách sử dụng đối tượng Dataset . Phương thức fit() của mô hình chấp nhận trực tiếp một đối tượng như vậy. Mô hình TensorFlow.js cũng có thể được đào tạo với JavaScript tương đương của các đối tượng Dataset (xem tài liệu về API tf.data trong TensorFlow.js ). Tuy nhiên, không giống như trong Python, đào tạo dựa trên Dataset được thực hiện thông qua một phương pháp chuyên dụng, đó là fitDataset . Phương thức fit () chỉ dành cho đào tạo mô hình dựa trên tensor.

Quản lý bộ nhớ của các đối tượng Lớp và Mô hình

TensorFlow.js chạy trên WebGL trong trình duyệt, nơi trọng số của các đối tượng Lớp và Mô hình được hỗ trợ bởi các kết cấu WebGL. Tuy nhiên, WebGL không có hỗ trợ thu gom rác tích hợp sẵn. Các đối tượng Layer và Model quản lý nội bộ bộ nhớ tensor cho người dùng trong các cuộc gọi suy luận và huấn luyện của họ. Nhưng chúng cũng cho phép người dùng loại bỏ chúng để giải phóng bộ nhớ WebGL mà chúng chiếm. Điều này hữu ích trong trường hợp nhiều phiên bản mô hình được tạo và phát hành trong một lần tải trang. Để loại bỏ một đối tượng Layer hoặc Model, hãy sử dụng phương thức dispose() .