由Irvan Smith在Unsplash发布越来越多的开发者在他们的机器学习工程中使用TensorFlow。今年3月,Google的TensorFlow团队发布等待多时的JavaScript框架,TensorFlow.js(之前也叫做DeepLearn.js)
现在开发者可以编译轻量级的模型并在浏览器中使用JavaScript运行它。
TensorFlow
TensorFlow在2011年开发于Google作为i他们的机器学习/深度学习app的API lib。这个API lib于2015年在Apache协议下开源。
TensorFlow由C++编写,使代码能够在底层运行。TensorFlow已同其他语言绑定在一起,如Python,R,Java。从而这些语言也能够作为TensorFlow的调用接口。
在JavaScript中,ML/DL通过使用API接口来调用。使用这些框架来生成一个API,并在服务器上部署模型。客户端使用JavaScript发送一个请求从服务器中获取回复。
客户端服务器架构
在2017年,一个叫做DeepLearning.js的工程诞生了,旨在没有API的反烦扰下在JavaScript中推动ML/DL的发展。
但是又出现了速度的问题。都知道JS代码不能运行在GPU上。为了解决这个问题,引进WebGL。这是一个OpenGL的浏览器接口。WebGl能够在GPU上执行JS代码。
在2018年3月,DeepLearn.js团队与TensorFlow团队合并,重命名为TensorFlow.js。
TensorFlow.js
TensorFlow.js提供两样东西:
CoreAPI,来处理底层代码,在CoreAPI之上编写的LayerAPI,通过增加层级的抽象性使coding更容易。
TensorFlow.js两种方法
1. 通过
Hello
2. 通过NPM
使用yarn或者NPM把TensorFlow.js添加到你的项目。
yarn add @tensorflow/tfjsnpm install @tensorflow/tfjs
在你的主js文件:
import * as tf from '@tensorflow/tfjs';
核心API
1. 张量(Tensors)
标量是单个数。例如,x = 1
矢量是一组数字。例如,x =[1,2]
矩阵是一个二维数组 ([[1, 2], [3, 4], [5, 6]]) 张量是一个n维数组,n>2
TensorFlow.js具有用于标量、一维、二维、三维和四维张量等常见情况的实用函数,以及一些用于初始化张量的函数,这些函数对机器学习非常有用。
2.变量 & 运算
张量是一种不能被改变的数据结构。这意味着一旦设置好它们的值就无法更改。
但是,TensorFlow.js中引入了
tf.variable()
。它的真正用例是当我们需要频繁更改数据时,例如在机器学习中调整模型权重时。
运算
在TensorFlow.js中有各种各样的运算。为了对张量进行数学计算,我们使用运算。张量是不可变的,而且运算总是会返回新的张量,得到的好处是不用修改输入的张量。在这我们可以使用
tf.variable()
来节省内存。
让我们来看看一些运算:
tf.add()
——按元素添加两个tf张量
const a = tf.tensor1d([1, 2, 3, 4]);
const b = tf.tensor1d([10, 20, 30, 40]);
a.add(b).print(); // or tf.add(a, b)
在TensorFlow.js中还有很多其他运算。你可以查看文档来了解它们。我将在这里演示另一个操作:
tf.matmul()
tf.matmul()
——计算矩阵A * B的点积。
const a = tf.tensor2d([1, 2], [1, 2]);
const b = tf.tensor2d([1, 2, 3, 4], [2, 2]); a.matMul(b).print(); // or tf.matMul(a, b)
3. 内存管理
内存管理是机器学习/深度学习任务的关键,因为它们通常需要消耗大量计算资源。
TensorFlow.js提供了两种主要的内存管理方法:
tf.dispose()
tf.tidy()
它们用不同的方式做着差不多同样的事情。
tf.tidy()
它执行所提供的函数fn,在执行函数fn之后,清除fn分配的所有中间张量(fn返回的张量除外)。
tf.tidy()
有助于避免内存泄漏。通常,
tf.tidy()
中包装了对运算的调用,以实现自动内存清理。
代码示例:
const y = tf.tidy(() => {
// aa, b, and two will be cleaned up when the tidy ends.
const two= tf.scalar(2);
const aa = tf.scalar(2);
const b = aa.square();
console.log('numTensors (in tidy): ' + tf.memory().numTensors);
// The value returned inside the tidy function will return
// through the tidy, in this case to the variable y.
return b.add(two);
});
console.log('numTensors (outside tidy): ' + tf.memory().numTensors);
y.print();
tf.dispose()
处理在对象中找到的任何tf.Tensors张量。
代码示例:
const two= tf.scalar(2);two.dispose()
LayersAPI
层是构建ML/DL模型时的主要成分。每个层通常会执行一些计算,将输入转换为输出。每一层都使用Tensorflow.js的CoreAPI。
层将自动创建和初始化它们需要的各种内部变量/权重。因此它基本上通过增加抽象级别来使生活变得更容易。
对于那些熟悉JavaScript并试图在ML/DL世界中一展拳脚的程序员来说这是极好的!
它帮助那些没有ML/DL背景却试图进入这一领域的人把事情变得更简单了。这样的例子很多,我个人认为这正是当前我们所需要的。
领取专属 10元无门槛券
私享最新 技术干货