在大会上午的 Keynote 中,谷歌大脑负责人 Jeff Dean、TensorFlow 总监 Rajat Monga 等人围绕 TensorFlow 做了表现、流行度等方面的介绍。
据介绍,在过去的两年中,TensorFlow 不断更新,不断改善,逐渐成为社区内最为流行的深度学习框架。下图是从开源以来,TensorFlow 的重大更新,例如 TensorBoard、tfdata、tfkeras、Eager Execution 等。
而且据统计,两年内,TensorFlow 已经有一千一百万下载,超过三万的 commits,6900 以上的 pull requests,1400 多位 contributors。
今年,围绕 TensorFlow,谷歌同样做出了几项重大宣布:
1. 发布新的 TensorFlow 官方博客(http://blog.tensorflow.org/)与 TensorFlow YouTube 频道;
2. 面向 JavaScript 开发者的全新机器学习框架 TensorFlow.js;
3. 发布一系列新的库与工具:例如 TensorFlowHub、TensorFlow Probability API、Nucleus、DeepVariant 等。
在今天的几项重大宣布中,比较有趣的是面向 JavaScript 开发者的全新机器学习框架 TensorFlow.js。在下文中,机器之心对 TensorFlow.js 做了细致介绍:
在大会的 Keynote 中,TensorFlow 团队表示基于网页的 JavaScript 库 TensorFlow.js 现在已经能训练并部署机器学习模型。我们可以使用神经网络的层级 API 构建模型,并在浏览器中使用 WebGL 创建复杂的数据可视化应用。此外 Node.js 很快就会发布,它能为网站模型提供 GPU、TPU 等快速训练与推断的方法。
在 TensorFlow.js 中,我们可以使用最底层的 JavaScript 线性代数库或最高级的 API 在浏览器上开发模型,也能基于浏览器运行已训练的模型。因此,它可以充分利用浏览器和计算机的计算资源实现非常多机器学习应用。例如在网页端训练一个模型来识别图片或语音,训练一个模型以新颖的方式玩游戏或构建一个能创造钢琴音乐的神经网络等。这些新颖的模型作为案例在 TensorFlow.js 中都提供了实现代码,读者也可以跟随教程实现基于浏览器的模型。
TensorFlow.js 项目主页:https://js.tensorflow.org/
TensorFlow.js 的核心概念
TensorFlow.js 是一个开源的用于开发机器学习项目的 WebGL-accelerated JavaScript 库。TensorFlow.js 可以为你提供高性能的、易于使用的机器学习构建模块,允许你在浏览器上训练模型,或以推断模式运行预训练的模型。TensorFlow.js 不仅可以提供低级的机器学习构建模块,还可以提供高级的类似 Keras 的 API 来构建神经网络。
TensorFlow.js 的安装非常简单,我们可以直接使用 NMP 或脚本完成构建。它的使用也有非常多的文档与教程,我们只需要掌握一些基本的核心概念就能快速入手这一 JS 库。接下来,我们介绍这个库的一些核心概念。
Tensor
TensorFlow.js 中的中心数据单元是张量(tensor):一维或多维数组。一个 Tensor 实例的 shape 属性定义了其数组形状(即,数组的每个维度上有多少个值)。
Tensor 主要构造函数是 tf.tensor 函数:
// 2x3 Tensor const shape = [2, 3]; // 2 rows, 3 columns const a = tf.tensor([1.0, 2.0, 3.0, 10.0, 20.0, 30.0], shape); a.print(); // print Tensor values // Output: [[1 , 2 , 3 ], // [10, 20, 30]] // The shape can also be inferred: const b = tf.tensor([[1.0, 2.0, 3.0], [10.0, 20.0, 30.0]]); b.print(); // Output: [[1 , 2 , 3 ], // [10, 20, 30]]
Variable
Variable 使用一个张量值来初始化。然而,和 Tensor 不一样,它们的值是可变的。你可以用 assign 方法分配一个新的张量到一个已有的变量(variable):
const initialValues = tf.zeros([5]); const biases = tf.variable(initialValues); // initialize biases biases.print(); // output: [0, 0, 0, 0, 0] const updatedValues = tf.tensor1d([0, 1, 0, 1, 0]); biases.assign(updatedValues); // update values of biases biases.print(); // output: [0, 1, 0, 1, 0]
Variable 主要用于在模型训练过程中保存和更新值。
Operations (Ops)
Tensor 可以用于保存数据,而 Operation(Op)则可用于操作数据。TensorFlow.js 提供了多种适用于张量的线性代数和机器学习运算的 Op。由于 Tensor 是不可改变的,这些 Op 不会改变它们的值,而会返回新的 Tensor。这些运算不仅包含 add、sub 和 mul 等二元运算,同时还包括 square 等一元运算:
const e = tf.tensor2d([[1.0, 2.0], [3.0, 4.0]]); const f = tf.tensor2d([[5.0, 6.0], [7.0, 8.0]]); const e_plus_f = e.add(f); e_plus_f.print(); // Output: [[6 , 8 ], // [10, 12]] const d = tf.tensor2d([[1.0, 2.0], [3.0, 4.0]]); const d_squared = d.square(); d_squared.print(); // Output: [[1, 4 ], // [9, 16]]
模型和层
从概念上说,一个模型就是一个函数,给定输入之后生成所需要的输出。
在 Tensorflow.js 有两种创建模型的方式:直接使用 Op 表示模型的运算。或者使用高级 API tf.model 来构建以层定义的模型,这在深度学习中是很常用的抽象形式。其实除了以上的特征,Tensorflow.js 还有一些很重要的核心概念,例如内存管理、神经网络基本运算和训练过程等。但我们了解以上概念就能轻松在浏览器中构建出简单的机器学习模型,如下展示了简单线性回归的定义方法:
import * as tf from '@tensorflow/tfjs';
// Define a model for linear regression.
const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]}));
// Prepare the model for training: Specify the loss and the optimizer.
model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});
// 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 the model using the data.
model.fit(xs, ys).then(() => {
// Use the model to do inference on a data point the model hasn't seen before:
model.predict(tf.tensor2d([5], [1, 1])).print();
});
目前该项目还是非常新颖的应用,我们非常容易将机器学习模型部署在网页端并在用户的浏览器与硬件实现简单的推断。虽然我们还不清楚实现的效果,但这个 JS 库真正能训练并部署机器学习模型,因此机器之心也将持续关注并尝试构建有意思的应用。