30分钟为 Node.js 实现 Tensorflow API

avatar
阿里巴巴 前端委员会智能化小组 @阿里巴巴

文/ 阿里淘系 F(x) Team - 雷姆

三年前的库

一些人可能听说过一个三年前的库(github.com/yorkie/tens…),没错,这就是几年前被我半途而废的项目,而在今天,我重新在 NPM 上发布了2.0,并且我决定重新开始向这个项目贡献代码。

三年前我放弃 tensorflow-nodejs 时,是因为感受到 Python 在机器学习生态的成熟,要从零、或者说是 Tensorflow C API 开始,做到当时 Python 生态那样,中长期来说都是不可能的,所以当时我就放弃了,于是后来 tensorflow.js 就出来了,但其实从一开始 tensorflow.js 就是被用于浏览器环境而非 Node.js 环境。

几个月前,为了 Pipcook 项目,我们一起开发了 @pipcook/boa,它可以让开发者轻松地在 Node.js 环境中调用 Python 函数,我们在 Pipcook 中就是通过它来接入机器学习生态的。

直接使用 Boa,我想对于 Node.js 生态的其他开发者来说,仍然有不低的门槛,他们需要去阅读 Python 的文档,要去理解 Python 与 JavaScript 语法和运行时上的差异。

在 Node.js 中使用 tensorflow 的正确姿势

这就是为什么我想重新发布 tensorflow-nodejs 的原因,通过 boa 我可以减少大量之前迁移和移植 Tensorflow 的工作,同时我基于底层的 Python API,重新设计面向 Node.js 开发者的 Tensorflow API,这样对于毫无 Python 经验的开发者,也能轻松上手了,并且最大的好处是,tensorflow-nodejs 现在可以随时跟着 Python 版本去演进,而所付出的升级代价非常小。

为此,我花了30分钟左右,就写了一个简单的 Keras API 训练的例子:

const tf = require('tensorflow2');
// load mnist dataset.
const dataset = tf.keras.dataset.mnist();
// {
//   train: { x: [Getter], y: [Getter] },
//   test: { x: [Getter], y: [Getter] }
// }
// create model.
const model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten({
    input_shape: [28, 28]
  }),
  tf.keras.layers.Dense(128, {
    activation: 'relu'
  }),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10)
]);
model.summary();
// compile the model.
const loss_fn = tf.keras.losses.SparseCategoricalCrossentropy({ from_logits: true });
model.compile({
  optimizer: 'adam',
  loss: loss_fn,
  metrics: [ 'accuracy' ],
});
// train the model.
model.fit(dataset.train.x, dataset.train.y, { epochs: 5 });
// save the model
model.save('your-model.h5');

上面的代码可以在一分钟内完成,也十分简单易懂。

Yorkie 非常欢迎你一起来贡献更多的 Tensorflow API。这里是实现的代码:github.com/yorkie/tens…,实现过程也比较简单,只需要按照 设计的 API 调用对应 Python 的接口,然后在函数外层做一些参数转换即可。

最后,期待你的贡献,也许这才是 Node.js 中最正确的使用机器学习的姿势!