JS做深度学习1——偶然发现与入门
JS做深度学习1——偶然发现与入门
不久前,我初次涉猎了Node.js,并且使用它开发了毕业设计的WEB模块,然后通过在Node中调用系统命令执行Python文件方式实现了深度学习功能模块的对接,Python代码的介入,让JS代码显得很累赘,我说过我很爱ES6以后的JS并且很讨厌Python的代码风格,无奈,我在写毕设那会Google还没有正式发布基于JS的深度学习框架,好吧,其实我对这事已经抱怨了很久,但是我的“呼声”仿佛很快就被Google“认同了”(滑稽),就在我答辩结束不久,2018年4月官方的TensorFlow.js推出了,简称tfjs。
项目简介
当我今天早上才发现这个项目的存在时,github上的star数目已经高达7k+,而距离项目发起才短短的3个月的时间!不禁感叹,这一天终于还是到来了,JS最终没有放过deep learning哈哈哈。
下面是项目的详情,地址是:https://github.com/tensorflow/tfjs
Google TensorFlow官方指南地址是:https://js.tensorflow.org/tutorials/
注意到这个项目实际提交者叫“caisq”,有人会问他是谁呢?显然是个有来头的人。我在github上找到了他的真实姓名——“蔡善清”,看上去像是个华人,连忙上百度查到了他的个人博客,不看不知道,一看吓一尿,真滴是个大佬级别的人物,大概意思就是现任Google大脑的工程师,毕业于清华大学的工学学士学位,还拥有什么Harvard-MIT XXX学院的Ph.D学位,我也看不懂,就知道是什么哈佛-麻省(合体吗?)博士,厉害的一塌糊涂的样子,我佩服的五体投地,为我们中国人感到骄傲!
关于他的地址:http://scai.io/
安装与入门
在github的README页面和TensorFlow官网上都有“helloworld”的案例给出,讲述了核心思想和编程入门,这其中当然就有安装TensorFlow.js的方式,下面我们来看看入门案例,我这里就直接照搬翻译官方的教程,同时做出一些易于理解的改进。
第一步安装
既然是JavaScript,既可以运行于浏览器,亦可在Node中运行,官方给出的也是这两种运行环境。有趣的是官方特别强调了WebGL接口和浏览器,这在官网的引言中可以看出来,等我后面体验了WebGL在做介绍。
浏览器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
第二步:“HelloWorld!”
我们从基本例子开始,官方首页给出的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已经很久了!)
JS做深度学习1——偶然发现与入门的更多相关文章
- JS做深度学习2——导入训练模型
JS做深度学习2--导入训练模型 改进项目 前段时间,我做了个RNN预测金融数据的毕业设计(华尔街),当时TensorFlow.js还没有发布,我不得已使用了keras对数据进行了训练,并且拟合好了不 ...
- JS做深度学习3——数据结构
最近在上海上班了,很久没有写博客了,闲下来继续关注和研究Tensorflow.js 关于深度学习的文章我也已经写了不少,部分早期作品可能包含了不少错误的认识,在后面的博文中会改进或重新审视. 今天聊聊 ...
- 腾讯QQ会员技术团队:人人都可以做深度学习应用:入门篇(下)
四.经典入门demo:识别手写数字(MNIST) 常规的编程入门有"Hello world"程序,而深度学习的入门程序则是MNIST,一个识别28*28像素的图片中的手写数字的程序 ...
- 【腾讯Bugly干货分享】人人都可以做深度学习应用:入门篇
导语 2016年,继虚拟现实(VR)之后,人工智能(AI)的概念全面进入大众的视野.谷歌,微软,IBM等科技巨头纷纷重点布局,AI 貌似将成为互联网的下一个风口. 很多开发同学,对人工智能非常感兴趣, ...
- 使用亚马逊云服务器EC2做深度学习(四)配置好的系统镜像
这是<使用亚马逊云服务器EC2做深度学习>系列的第四篇文章. (一)申请竞价实例 (二)配置Jupyter Notebook服务器 (三)配置TensorFlow (四)配置好的系统 ...
- 使用亚马逊云服务器EC2做深度学习(三)配置TensorFlow
这是<使用亚马逊云服务器EC2做深度学习>系列的第三篇文章. (一)申请竞价实例 (二)配置Jupyter Notebook服务器 (三)配置TensorFlow (四)配置好的系统 ...
- 使用亚马逊云服务器EC2做深度学习(二)配置Jupyter Notebook服务器
这是<使用亚马逊云服务器EC2做深度学习>系列的第二篇文章. (一)申请竞价实例 (二)配置Jupyter Notebook服务器 (三)配置TensorFlow (四)配置好的系统 ...
- 使用亚马逊云服务器EC2做深度学习(一)申请竞价实例
这是<使用亚马逊云服务器EC2做深度学习>系列的第一篇文章. (一)申请竞价实例 (二)配置Jupyter Notebook服务器 (三)配置TensorFlow (四)配置好的系统 ...
- (zhuan) 126 篇殿堂级深度学习论文分类整理 从入门到应用
126 篇殿堂级深度学习论文分类整理 从入门到应用 | 干货 雷锋网 作者: 三川 2017-03-02 18:40:00 查看源网址 阅读数:66 如果你有非常大的决心从事深度学习,又不想在这一行打 ...
随机推荐
- git配置报错fatal: Authentication failed for ''问题解决
如果在git配置中报错fatal: Authentication failed for '',其实就是凭证失败的意思 接着输入一下命令行没有出现要求输入用户名或密码,并报错 $ git config ...
- 在MyEclipse的Maven环境下,使用mybatis-generator插件自动生成映射文件(接口)及实体类
在数据表比较多的情况下,手动编写sql映射文件和实体类,实在太多过繁琐,而mybatis-generator能自动生成这此东西,减少了重复性的工作量.mybatis-generator的配置容易出现问 ...
- windows之anaconda导入torch失败和pip install命令执行read time out
昨天用jupyter导入torch还好好的呢,今天用就不行了,先是ImportError: DLL load failed: 找不到指定的模块.再是No such comm target regist ...
- CF 1096D Easy Problem [动态规划]
题目链接:http://codeforces.com/problemset/problem/1096/D 题意: 有一长度为n的字符串,每一字符都有一个权值,要求现在从中取出若干个字符,使得字符串中没 ...
- 大集合List分为多个子集合
批量插入时如果一次插入的对象过多会导致超过mysql限定sql长度,通过命令查看 show VARIABLES like 'max_allowed_packet' ,如果数据太多,就将大集合List分 ...
- C# 查找其他应用程序并打开、显示、隐藏、关闭的API
软件开发中,有时迫不得已要用到第三方的软件,这时就涉及到在C#应用程序需要对第三方软件打开.显示.隐藏以及关闭. 下面列举了几个常用的方式 打开应用程序,下面是2种简单用法: 第一种: public ...
- TPO5-1 Minerals and plants
Only recently have investigators considered using these plants to clean up soil and waste sites that ...
- 在win10下安装ubuntu双系统总结
在打算装双系统前两天,我事先在网上买了一个16G大小的U盘,用来坐启动盘.后来发现其实有4G大小就远远足够的,16G的太浪费了,忘后来人吸取教训.呜呜呜.....下面给大家讲讲我的安装步骤: 参考文章 ...
- CF1137E Train Car Selection(单调栈维护凸函数)
首先本题的关键是一次性加0操作只有第一个0是有用的.然后对于1 k操作,其实就是把之前的所有数删除.对于其他的情况,维护一次函数的和,将(i,a[i])看成平面上的一个点,用单调栈维护一下. #inc ...
- CF1137C Museums Tour(tarjan+DP)
由于d很小,所以可以把每个点拆成d个点,然后对于边(x,y),连边时连接((x,i),(y,i+1))及((x,d),(y,1)).然后可以对这样连的边跑一遍tarjan缩点.然后直接暴力DP即可.不 ...