升级到 TensorFlow.js 3.0

TensorFlow.js 3.0 中有哪些变化

发行说明在此处提供。一些值得注意的用户界面功能包括

自定义模块

我们提供对创建自定义 tfjs 模块的支持,以支持生成大小优化的浏览器包。向用户发送更少的 JavaScript 代码。要了解更多信息,请参阅本教程

此功能针对浏览器中的部署,但启用此功能会推动下面描述的一些更改。

ES2017 代码

除了某些预编译包之外,我们现在通过 NPM 向用户提供代码的主要方式是作为ES 模块,使用ES2017 语法。这使开发人员能够利用现代 JavaScript 功能,并更好地控制他们向最终用户提供的代码。

我们的 package.json module 入口点指向 ES2017 格式的单个库文件(即不是包)。这使树形抖动和开发人员对下游转译的更大控制成为可能。

我们确实提供了一些替代格式作为预编译包,以支持旧版浏览器和其他模块系统。它们遵循下表中描述的命名约定,您可以从流行的 CDN(如 JsDelivr 和 Unpkg)加载它们。

文件名 模块格式 语言版本
tf[-package].[min].js* UMD ES5
tf[-package].es2017.[min].js UMD ES2017
tf[-package].node.js** CommonJS ES5
tf[-package].es2017.fesm.[min].js ESM(单个扁平文件) ES2017
index.js*** ESM ES2017

* [package] 指的是主 tf.js 包的子包的名称,如 core/converter/layers。[min] 描述了我们除了未压缩文件之外还提供压缩文件的位置。

** 我们的 package.json main 入口点指向此文件。

*** 我们的 package.json module 入口点指向此文件。

如果您通过 npm 使用 tensorflow.js,并且使用捆绑器,则可能需要调整捆绑器配置以确保它可以消费 ES2017 模块或将其指向我们 package.json 中的另一个条目。

@tensorflow/tfjs-core 默认情况下更精简

为了实现更好的树形抖动,我们不再默认在 @tensorflow/tfjs-core 中包含张量的链接/流畅 API。我们建议直接使用操作(运算符)以获得最小的包。我们提供一个导入import '@tensorflow/tfjs-core/dist/public/chained_ops/register_all_chained_ops';,它会恢复链接 API。

我们也不再默认注册内核的梯度。如果您需要梯度/训练支持,您可以import '@tensorflow/tfjs-core/dist/register_all_gradients';

代码重组、内核和梯度注册表

我们已经重组了代码,使其更容易贡献运算符和内核,以及实现自定义运算符、内核和梯度。请参阅本指南以了解更多信息

重大更改

可以在此处找到重大更改的完整列表,但它们包括删除所有 *Strict 运算符,如 mulStrict 或 addStrict。

从 2.x 升级代码

@tensorflow/tfjs 的用户

解决此处列出的任何重大更改(https://github.com/tensorflow/tfjs/releases

@tensorflow/tfjs-core 的用户

解决此处列出的任何重大更改(https://github.com/tensorflow/tfjs/releases),然后执行以下操作

添加链接运算符增强器或直接使用运算符

而不是

import * as tf from '@tensorflow/tfjs-core';
import '@tensorflow/tfjs-backend-webgl';

const a = tf.tensor([1,2,3,4]);
const b = a.sum(); // this is a 'chained' op.

您需要执行

import * as tf from '@tensorflow/tfjs-core';
import '@tensorflow/tfjs-backend-webgl';
import '@tensorflow/tfjs-core/dist/public/chained_ops/sum'; // add the 'sum' chained op to all tensors

const a = tf.tensor([1,2,3,4]);
const b = a.sum();

您也可以使用以下导入导入所有链接/流畅 API

import '@tensorflow/tfjs-core/dist/public/chained_ops/register_all_chained_ops';

或者,您可以直接使用运算符(您也可以在此处使用命名导入)

import * as tf from '@tensorflow/tfjs-core';
import '@tensorflow/tfjs-backend-webgl';

const a = tf.tensor([1,2,3,4]);
const b = tf.sum(a);

导入初始化代码

如果您只使用命名导入(而不是 import * as ...),那么在某些情况下您可能需要执行

import @tensorflow/tfjs-core

在程序顶部附近,这可以防止积极的树形摇动器丢弃任何必要的初始化。

从 1.x 升级代码

@tensorflow/tfjs 的用户

解决 此处 列出的任何重大更改。然后按照从 2.x 升级的说明进行操作。

@tensorflow/tfjs-core 的用户

解决 此处 列出的任何重大更改,选择下面描述的后端,然后按照从 2.x 升级的步骤进行操作。

选择后端

在 TensorFlow.js 2.0 中,我们将 cpu 和 webgl 后端移到了它们自己的包中。请参阅 @tensorflow/tfjs-backend-cpu@tensorflow/tfjs-backend-webgl@tensorflow/tfjs-backend-wasm@tensorflow/tfjs-backend-webgpu,了解有关如何包含这些后端的说明。