TensorFlow.jsjs.tensorflow.org ## 简介

TensorFlow.js 是一个利用 WebGL 来进行加速的机器学习类库，它基于浏览器，提供了高层次的 JavaScript API 接口。它将高性能机器学习构建块带到您的指尖，使您能够在浏览器中训练神经网络或在推理模式下运行预先训练的模型。有关安装/配置 TensorFlow.js 的指南，请参阅 入门指南

## Tensors（张量）

TensorFlow.js 中数据的核心表现形式是 张量 ：一组数值形成的一维或多维的数组。每个`Tensor`的实例都有 `shape` 属性来用于定义数组的维度形状——即数组有几个维度，每个维度有几个值。 其中 `tensor` 最主要的构造函数就是 `tf.tensor`

``````// 2x3 张量
const shape = [2, 3]; // 2 行, 3 列
const a = tf.tensor([1.0, 2.0, 3.0, 10.0, 20.0, 30.0], shape);
a.print(); // 输出张量的值
// 输出: [[1 , 2 , 3 ],
//       [10, 20, 30]]

// 张量的维度形状是可以被推测的:
const b = tf.tensor([[1.0, 2.0, 3.0], [10.0, 20.0, 30.0]]);
b.print();
// 输出: [[1 , 2 , 3 ],
//       [10, 20, 30]]
``````

``````const c = tf.tensor2d([[1.0, 2.0, 3.0], [10.0, 20.0, 30.0]]);
c.print();
// 输出: [[1 , 2 , 3 ],
//       [10, 20, 30]]
``````

TensorFlow.js 还提供了一些带有初始化功能的张量构造函数，比如创建所有值均为 0 的 `tf.zeros` 或为 1 的 `tf.ones`

``````// 所有值均为 0 的 3x5 张量
const zeros = tf.zeros([3, 5]);
// 输出: [[0, 0, 0, 0, 0],
//       [0, 0, 0, 0, 0],
//       [0, 0, 0, 0, 0]]
``````

## Variables（变量）

Variables 是由张量的值来初始化的。然而，与张量不同的是，它们的值是可变的。您可以使用 `assign` 方法为现有变量分配一个新的张量：

``````const initialValues = tf.zeros();
const biases = tf.variable(initialValues); // 初始化 biases
biases.print(); // 输出: [0, 0, 0, 0, 0]

const updatedValues = tf.tensor1d([0, 1, 0, 1, 0]);
biases.assign(updatedValues); // 更新 biases 的值
biases.print(); // 输出: [0, 1, 0, 1, 0]
``````

## Operations (操作)

``````const d = tf.tensor2d([[1.0, 2.0], [3.0, 4.0]]);
const d_squared = d.square();
d_squared.print();
// 输出: [[1, 4 ],
//       [9, 16]]
``````

``````const e = tf.tensor2d([[1.0, 2.0], [3.0, 4.0]]);
const f = tf.tensor2d([[5.0, 6.0], [7.0, 8.0]]);

e_plus_f.print();
// 输出: [[6 , 8 ],
//       [10, 12]]
``````

TensorFlow.js 的 API 是支持链式调用的，所以你可以在 ops 的结果上继续调用 ops：

``````const sq_sum = e.add(f).square();
sq_sum.print();
// 输出: [[36 , 64 ],
//       [100, 144]]

// 所有的操作符在主命名空间中都是公开的,
// 所以你可以像👇这么做:
``````

## Models and Layers（模型与层）

``````// 定义常量: y = 2x^2 + 4x + 8
const a = tf.scalar(2);
const b = tf.scalar(4);
const c = tf.scalar(8);

// 定义函数
function predict(input) {
// y = a * x ^ 2 + b * x + c
// 下一节中会有更多关于 tf.tidy 的内容
return tf.tidy(() => {
const x = tf.scalar(input);

const ax2 = a.mul(x.square());
const bx = b.mul(x);

return y;
});
}

// 预测当输入值为2时的输出
const result = predict(2);
result.print() // 输出: 24
``````

``````const model = tf.sequential();
tf.layers.simpleRNN({
units: 20,
recurrentInitializer: 'GlorotNormal',
inputShape: [80, 4]
})
);

const optimizer = tf.train.sgd(LEARNING_RATE);
model.compile({optimizer, loss: 'categoricalCrossentropy'});
model.fit({x: data, y: labels)});
``````

TensorFlow.js 中有多种不同类型的层，例如 `tf.layers.simpleRNN``tf.layers.gru``tf.layers.lstm`等。

## 内存管理: dispose 与 tf.tidy

TensorFlow.js 提供了两个有助于解决这个问题的函数：`dispose``tf.tidy`

## dispose

``````const x = tf.tensor2d([[0.0, 2.0], [4.0, 6.0]]);
const x_squared = x.square();

x.dispose();
x_squared.dispose();
``````

## tf.tidy

``````// tf.tidy takes a function to tidy up after
const average = tf.tidy(() => {
// tf.tidy 将会清除此函数内由张量使用的所有GPU内存
// 但是不会清除作为返回值的那个张量
//
// 即使在像下面这样这么短的操作中，
// TensorFlow.js 也会创建一些中间张量。 因此，
// 将您的数学运算放在一个 tf.tidy 中是一个很不错的选择！
const y = tf.tensor1d([1.0, 2.0, 3.0, 4.0]);
const z = tf.ones();

return y.sub(z).square().mean();
});

average.print() // 输出: 3.5
``````

## 两条重要提示

• 传递给 `tf.tidy` 的函数应该是同步的，并且不应该返回 Promise。我们建议将更新 UI 或者网络请求等异步代码放在 `tf.tidy` 函数外。
• `tf.tidy` 不会清理变量。变量通常存活于机器学习模型的整个生命周期中，因此TensorFlow.js 不会去清理它们，即使它们创建于 `tf.tidy` 之中。但是，您可以通过手动调用 `dispose` 去清除它们。
{"ft_lang_label":"__label__zh","ft_lang_prob":0.8304444,"math_prob":0.9988859,"size":4542,"snap":"2020-10-2020-16","text_gpt3_token_len":2615,"char_repetition_ratio":0.17210224,"word_repetition_ratio":0.07220217,"special_character_ratio":0.3538089,"punctuation_ratio":0.30089375,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.995621,"pos_list":[0,1,2],"im_url_duplicate_count":[null,1,null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2020-02-25T14:33:37Z\",\"WARC-Record-ID\":\"<urn:uuid:d761dd08-9a03-41de-bd02-31021ca8e68c>\",\"Content-Length\":\"118732\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:a43725b9-ed95-4ab3-b45d-fe634fede28a>\",\"WARC-Concurrent-To\":\"<urn:uuid:13e06805-e56f-48fe-88c5-911f844d9d9e>\",\"WARC-IP-Address\":\"23.196.109.73\",\"WARC-Target-URI\":\"https://zhuanlan.zhihu.com/p/35650226\",\"WARC-Payload-Digest\":\"sha1:MBFSOO45WM4PYBA4SVCGXWW5UCGHIQUG\",\"WARC-Block-Digest\":\"sha1:R6LX3POY42MMCQUEZG63UF7C2WAVFBAU\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2020/CC-MAIN-2020-10/CC-MAIN-2020-10_segments_1581875146123.78_warc_CC-MAIN-20200225141345-20200225171345-00483.warc.gz\"}"}