不久前,我初次涉猎了Node.js,而且使用它开发了毕业设计的WEB模块,而后经过在Node中调用系统命令执行Python文件方式实现了深度学习功能模块的对接,Python代码的介入,让JS代码显得很累赘,我说过我很爱ES6之后的JS而且很讨厌Python的代码风格,无奈,我在写毕设那会Google尚未正式发布基于JS的深度学习框架,好吧,其实我对这事已经抱怨了好久,可是个人“呼声”仿佛很快就被Google“认同了”(滑稽),就在我答辩结束不久,2018年4月官方的TensorFlow.js推出了,简称tfjs。html
当我今天早上才发现这个项目的存在时,github上的star数目已经高达7k+,而距离项目发起才短短的3个月的时间!不由感叹,这一天终于仍是到来了,JS最终没有放过deep learning哈哈哈。node
下面是项目的详情,地址是:https://github.com/tensorflow/tfjs
Google TensorFlow官方指南地址是:https://js.tensorflow.org/tutorials/git
注意到这个项目实际提交者叫“caisq”,有人会问他是谁呢?显然是个有来头的人。我在github上找到了他的真实姓名——“蔡善清”,看上去像是个华人,连忙上百度查到了他的我的博客,不看不知道,一看吓一尿,真滴是个大佬级别的人物,大概意思就是现任Google大脑的工程师,毕业于清华大学的工学学士学位,还拥有什么Harvard-MIT XXX学院的Ph.D学位,我也看不懂,就知道是什么哈佛-麻省(合体吗?)博士,厉害的一塌糊涂的样子,我佩服的五体投地,为咱们中国人感到骄傲!github
关于他的地址:http://scai.io/npm
在github的README页面和TensorFlow官网上都有“helloworld”的案例给出,讲述了核心思想和编程入门,这其中固然就有安装TensorFlow.js的方式,下面咱们来看看入门案例,我这里就直接照搬翻译官方的教程,同时作出一些易于理解的改进。编程
既然是JavaScript,既能够运行于浏览器,亦可在Node中运行,官方给出的也是这两种运行环境。有趣的是官方特别强调了WebGL接口和浏览器,这在官网的引言中能够看出来,等我后面体验了WebGL在作介绍。json
浏览器JS安装:浏览器
使用cdn安装直接在script标签下引入在线js地址:网络
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.11.1"> </script>
NodeJS npm安装:框架
我的建议项目开发直接新建package.json,而后npm install:
{ "name": "", "description": "", "version": "0.0.1", "dependencies": { "@tensorflow/tfjs": "latest" } }
注意,这里必须是“@tensorflow/tfjs”,引入的时候也必须是完整的。
官方给出的是全局安装:
yarn add @tensorflow/tfjs
npm install @tensorflow/tfjs
咱们从基本例子开始,官方首页给出的example是一个线性回归案例,这也是TensorFlow的经典入门案例,什么是线性回归,其实以前的博客也提到,就是一种相似“待定系数”求y=kx+b中的k和b的过程,这也是深度学习的核心思想。注意,如下案例所有基于Node.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(); });
这个案例开发了这样一个模型,一共有一层神经网络,一个神经元,每次输入一个数据,得出一个目标数据,给出4个训练数据和4个训练后参照的目标数据,分别是1,2,3,4(x)和1,3,5,7(y),求y=kx+b。最后四行代码向model中输入一个机器从未见过的数字x,让他根据规律得出一个目标值y。
这里有一些小毛病,咱们来讲一说:
首先是node.js至今都未正式支持import,export关键词(我也是醉了,我下载的是10.X版本了都),退一步说必须将案例代码中import改成require来引入tfjs。
而后是这个案例不明不白,不适合TensorFlow初学者理解,由于案例没有列出完整训练过程,致使运行后会出现不一样结果。也就是这个模型输入一个未知的数字x,最终是不能给出一个合理的结果y的。
我对代码进行了改进,加入了训练过程,使代码模拟求y=2x+1的线性函数。以下:
const tf = require("@tensorflow/tfjs"); const model = tf.sequential(); //定义网络结构,层数,单元数,输入 model.add(tf.layers.dense({units: 1, inputShape: [1]})); //定义优化器 model.compile({loss: 'meanSquaredError', optimizer: 'sgd'}); //目标:y=2x+1; const xs = tf.tensor2d([1,2,3,5], [4,1]); const ys = tf.tensor2d([3,5,7,11], [4,1]); //使用async是由于训练中有异步操做,须要用到await (async ()=>{ //训练1000次 for(let i=0;i<1000;i++){ await model.fit(xs,ys);//等待训练的异步操做 console.log(`第${i}次`); } model.predict(tf.tensor2d([100], [1, 1])).print(); })();
这样代码运行起来就显得很明白,结果是:
我对模型输入的是四组训练数据,共训练了1000次,训练结束后,像模型输入100,获得201,基本接近目标,成功!(记住,深度学习是一个趋于精确的过程,不像人类同样一次得到标准结果)。
接下来,我将继续深刻学习Node.js技术,并主攻其在深度学习领域的运用,经过博文分享个人成果!(毕竟我期待TensorFlow.js已经好久了!)