当前位置: 首页 > 编程日记 > 正文

前端也能玩转机器学习?Google Brain 工程师来支招

640?wx_fmt=jpeg

演讲嘉宾 | 俞玶
编辑 | 伍杏玲
来源 | CSDN(ID:CSDNnews)

导语:9 月 7 日,在CSDN主办的「AI ProCon 2019」上,Google Brain 工程师,TensorFlow.js 项目负责人俞玶发表《TensorFlow.js 遇到小程序》的主题演讲,分享 TensorFlow.js 的技术实现和与微信小程序相结合的落地实践。本文为其演讲内容实录。

首先想问问大家有多少人了解或听过 Tensorflow.js 的?

不多。

再提问一个问题:这里有哪些同学希望把机器学习(Machine Learning, ML)落地到小程序或者前端?

也不多。没关系,希望以下的分享可以帮助大家了解它。

初识 Tensorflow.js


Tensorflow.js 的目的是为了帮助前端工程师,降低加强学习的门槛。另外,让大家充分地发挥自身创造性,把机器学习落地到前端各个应用里。

它本身是一个全方位平台,它不是调用服务端的简单平台,而是完全由 JavaScript 实现的平台,它可以让你已有的模型从 Python 转换过来,在浏览器里执行。也可以通过转移学习或者加强学习的方式对已有模型进行再训练。另外,它更能允许你创建模型,如果大家熟悉 Tensorflow.js,它有对应的 API,你可以创建模型,可以通过 JavaScript 来训练,一般是在 Node.js 比较合适,所以我们也支持 Node.js。

为什么大家对这个东西并不了解?可能大家并不了解它的应用场景是什么,大家普遍关注在大数据等比较宏大的问题上。个人认为,有很多小的问题也可以用它来解决,比如酷炫的交互方式完全可以用它来实现。

Tensorflow.js 应用场景

Tensorflow.js 的应用场景有:

1、增强现实AR

比如抖音这些功能都是在端的实现,用 JavaScript 同样也可以实现。

2、基于手势或肢体的交互

现在我们的交互方式在手机上用手指,网站用鼠标。通过它可以增加新的交互方式,比如用嘴型、眼神、手势。

3、语音识别

使用它后,可以把语音识别注入到网站里,还可以增加一些新的体验、新的交互方式,后面我会举一些例子。不管怎样,Web是一个以文字为主的环境,针对文字的模型在这个交互环境里是非常合适的,比如语义分析、智能会话,这些模型可以直接在 App 里执行。最后,可以通过分析,用设备本身的性能或者网络情况,来优化网页。

这些场景为什么用端上的机器学习来实现而不是用服务器呢?其优势是:

1、保护用户隐私

2、减少响应延迟,减少流量

它并不需要网络,如果网络不好或者本身流量有限制,可以帮助用户减少流量。

3、提高用户体验

有些功能无法做到实时的,可能 5G 将来有可能,但现在是做不到的。

4、降低服务器费用

通过把 ML 放到端上,减少了在服务端的依赖。如果开发者自己搭建服务的话,费用会很高,这可以减少服务器的费用。

Tensorflow.js 的目的就是为了简化这些问题,为前端工程师提供所有可以实现的这些功能,我们的目标是提供很多已有的模型给大家去用。而且这些模型是开源的,你可以随便用。

五大模型

Tensorflow.js 提供五类模型:图像分类、物体识别、姿态识别、语音命令识别、文字分类。直接用 NPM 安装,或者直接通过 JavaScript 也可以把它装上,放到网页里。

1、姿态识别

640?wx_fmt=jpeg
姿态识别模型在小程序里可以跑,它提供的是人的五官的坐标、四肢关节的坐标,它有多种不同的精度和速度优化版本,通过安装不同的版本可以在不同的设备上去跑。

2、人物分割

640?wx_fmt=jpeg

它可以帮你做背景虚化,或者是人的各个部分的分类,比如头部、躯干、四肢。还可以做很多有意思的事情,且针对不同的设备有不同的精度。

3、高分辨率的面部跟踪

640?wx_fmt=jpeg

这是我们即将推出的一种模型叫 FaceMesh,大概有 400 个关键点在人的脸上,并且提供的是一个三维的人脸模型。

4、语音命令识别

我们曾经让一个渐冻症病人跟机器交互,用激光点按各个键,交互速度非常慢,渐冻症病人不能说话,但是他可以发出一些声音,他的声音是有不同意义的,我们通过这个模型对他们做了个性化的交互方式。让他们很容易地用不同的声音,比如说“我要有一个披萨”,它通过不停地训练来增加词汇量。

5、文字模型

在文字模型中,支持如语气分析、毒性语言检测、智能回复,我们希望给大家做一些好用的、能用的模型。

6、转移学习

640?wx_fmt=png

在示例里,我的同事做了 3 个不一样的动作,通过截取视频的图片开始实时训练这个模型,训练速度非常快,大概是几毫秒、几十毫秒,现在他以非常高的精确度来识别 3 个不同的动作,一是招手,第二个是摇头,第三个是把手放在嘴旁边。

7、支持多平台

Tensorflow.js 支持多平台:无线端(微信小程序、React Native)、服务器端(Node.js);台式机(Electron)、浏览器(谷歌浏览器、火狐浏览器、safari浏览器)。

下面给大家讲一个例子,在谷歌搜索引擎上,有一个它的Logo的图片,我们把这图片转成了一个游戏。这是为了纪念十八世纪的巴赫,他做出来的曲子非常有节奏。所以我们做了一个模型:玩家可以在一个声部编一个曲,最终通过机器模型形成了完整的四声部的协奏曲。

这个模型是 CoCoNet,玩家总在线时间 78 年,分享超过 5 千万创作,大概是最大用户生成的交响乐库了。它用到的技术是 Tensorflow.js 和谷歌的 TPU。

有些用户手机并不快,所以要到服务端,如果手机性能不错的话完全可以在手机上执行。还能节约 50% 服务器费用,因为充分运用用户的 GPU,可以想象,如果是一个很大的项目,可以节省的费用有多大。

Tensorflow.js 遇见微信小程序


最近微信做了一个大学生小程序大赛,这是得奖同学做的一个手语识别项目。它首先能够手势识别,对一个手势能认知,并且得到它的含义。

640?wx_fmt=png

下面是整体句子的识别,它在简单的 CNN 模型上实现了 RNN 的语义模型,这好像是花了一个星期做出来的。

还有小程序在美妆领域的应用,和 ModiFace 合作推出了阿曼尼的美妆小程序。这个小程序在端上做美妆的过程中遇到很多挑战:

1、不可能把用户的图片实时传到服务端进行实时跟踪,实时得到结果,必须在端上才能实现,至少要达到 10FPS 才能有连续的感觉。

2、微信对于插件的 JavaScript files 有 2MB 的限制,加载模型也有延时的问题。

3、模型是自主开发的,有他们特定的算子、特定的框架。另外,手机多样性也导致他们很难来满足这些需求。

他们在考虑模型框架和其他部分的结合方面做了很多选择和尝试,也看了不同的框架,最后选择 Tensorflow.js。

我们通过模型和框架的结合将以上问题得到解决:

640?wx_fmt=jpeg

优化结果:

1、ModiFace 虚拟试妆插件共 1.8MB,其中 JavaScript 文件是 983KB,Model Files 是 829KB。ModiFace 虚拟试妆插件运行速度为 25FPS。

模型运行时间是 30ms,渲染时间是 10ms。

其实并不是一定要在服务端才能实现这个 ML,现在通过这个平台,很多模型都可以在端上实行。

很多同学可能觉得这个不适合才上手 ML 的同学,但是我们把这些都简化出来了,大家可以想象,原来数据库也要有好多安装复杂的步骤,后来为什么都没了?因为工具给大家解决了大部分问题。

流程图

给大家举个例子,假设产品经理要求你这个星期做出墨镜试戴 AR 的网站,你很生气地想,这周末要加班了。

我现在给你一个流程图参考,看看能不能帮你少加几天班。

640?wx_fmt=png

流程图是这样的,一般情况下有一个输入,输入可以来自很多小程序具有的 API,然后对于一个 ML 的执行环境来说,它必须把输入格式转化成 Tensor,转化成模型可以消费的模式,选择一个正确的模型或者创建一个模型,通过这个模型执行得到一个推理结果。

推理结果后期处理有时也是非常复杂的,因为模型本身不是给前端开发者用的,ML 工程师并不是很在乎前端用户怎么用,所以你还要做很多工作把这个结果解释出来。

因为 ML 只是一个模块,对于整个应用来说只是一部分,不能提供完整的解决方案,所以往往把输出结果给下一个模块去执行。

从这个流程图分析一下怎么解决做 AR 网站的问题:

1、预处理

抓取视频数据,然后把它们转化成模型可以用的结构。Tensorflow.js 提供数据API,支持 Camera、Audio、Image、CSV等。

2、模型选择

选择一个模型或者创造一个模型是很难的,因为需要实时识别人脸,实时的测人脸关键点,判断出人脸的朝向,知道他抬头/低头/朝左/朝右脸的朝向要有3D的判断。

于是我们推出 Facemesh,实时人脸关键点检测及跟踪模型,速度非常快,可以检测唇、眉毛、眼睛等,还可以做很多事情。

另外,后期处理也很复杂,即使给你一个三维的点,你也不知道摄像头在坐标系里在哪,如何把三维模型放到人脸的座标系里,这也不是那么简单,因为这跟摄像头的结构,是透视型摄像头还是平行摄像头有关系。最终还要渲染3D模型,这要求速度要够快。

Facemesh 的速度能做到 10ms 的推理速度,并且提供 3D 坐标转换的 API。

Three.js 超级高速 WebGL 渲染模型在小程序里也是可以跑的。

回到 AR 网站,现在是不是可以解决你的问题了?

通过数据 API 可以抓取数据,Tensorflow.js 平台运行速度非常快,Facemesh 3D 坐标转化API将带来非常简化的工作,最后把输出结果交给Three.js 去渲染。

代码举例:

这是一个加载模型,load 调用模型,输出的结果是非常易于理解的输出结果,而不是用 Tensor 给你显示的结果。

640?wx_fmt=png
这段是渲染的步骤,把模型输出的结果到 3D 模型上去渲染,最后结果是什么样?400 个点的渲染,它能够检查主要的位置,这是3维朝向的渲染,把三维眼镜放在人脸上,速度在 40 帧/秒左右,包括执行和渲染,这个例子不是小程序。
640?wx_fmt=png

Tensorflow.js 技术架构

最后给大家分享下 Tensorflow.js 为什么速度这么快?

1、这是用JavaScript做,但是和 Tensorflow 兼容,提供三个不同层次的 API:先是模型,可以直接在模型上调用,开发者不用了解创建模型和加速模型。如果希望自己创建模型就用 Layers API。还有 Core API,这跟Tensorflow 的 CAPI 是一致的。

2、后端分两种情况:

(1)在客户端直接支持 WebGL,可以无缝加速。

(2)在服务端主要提供 Node.js的支持,直接跑在 Tensorflow 的 CPU、GPU 上,还有 Headless GL。

性能分析

在服务端,Tensorflow.js 的速度基本和 Python 是一致的,这是高端的GPU,速度是八毫秒,我们在 CPU 甚至还稍微快一点。

由于在 JavaScript 这个层面,在端上基本没有别的系统跟 Tensorflow.js 进行比较,所以我们选择跟原生系统进行比较。

在iPhone上Tensorflow.js运行的速度是22.8毫秒,是一个标准的MobileNetV2 1.0-224 的模型执行时间。另外,在安卓上,Tensorflow.js 渲染稍微落后,安卓 CPU 大概是 50 毫秒,Tensorflow.js 是 100 毫秒,安卓的 GPU 是 12 毫秒,Tensorflow.js 也在尽量去拉近这个距离,这是我们接下来研发的主要方向,希望能提升速度,特别是在安卓方面。

Tensorflow.js 未来研发方向

Tensorflow.js 在未来的研发方向是:

1、我们将寻找好用的场景给大家提供完整的解决方案。

2、Tensorflow.js 将支持 AutoML,这是在谷歌云的一个服务,可以自动寻找最佳的结构,去解决已有的定制模型。

3、在 Node.js 上发力,目标是提供全栈在服务端加强学习训练、部署的平台。假如公司是用 Node.js,为什么还要用 Python?我们希望把这个门槛降低,让开发者训练模型,并且融入到已有的环境里,这也是针对中小型企业的,因为大企业可能已经有这些平台了。

4、用最新的技术提供更新的优化,例如 WASM、WebGPU 等。

5、支持更多的 JavaScript 运行平台,将和支付宝小程序、谷歌小程序合作。

Tensorflow.js 大概是一年前推出的开源项目,目前发展很快,大概 700K 的NPM 下载,5M CDN 的点击,11K GitHub Stars,贡献者超过 120 人。

俞玶简介:Google Brain 工程师,TensorFlow.js 项目负责人。他致力于将深度学习引入到 Web 和其他 JavaScript 开发平台。他曾担任谷 Google Attribution 平台的技术负责人。俞玶是清华大学理学学士,UMCP 理学硕士。

(*本文为AI科技大本营转载文章,转载联系作者)


精彩推荐




推荐阅读

  • 掌握这些步骤,机器学习模型问题药到病除

  • 我所理解的零次学习

  • 华为全球最快AI训练集群Atlas 900诞生

  • 还怕电脑被偷吗?我用Python偷偷写一个自动木马程序

  • 用Python进行金融市场文本数据的情感计算

  • 前端也能玩转机器学习?Google Brain 工程师来支招!

  • 6大思维模型, 揭秘硅谷高管如何做区块链应用决策

  • 走出腾讯和阿里,大厂员工转型记


640?wx_fmt=png

你点的每个“在看”,我都认真当成了喜欢

相关文章:

mongoDB设置用户名密码的一个要点

2019独角兽企业重金招聘Python工程师标准>>> 增加用户之前, 先选好库 use <库名> #选择admin库后可查看system.users里面的用户数据 db.system.users.find() db.createUser 这个函数填写用户名密码与权限就行了, 在这里设置库的名称没用. 一定要用用use选择好…

基于HTML5的电信网管3D机房监控应用

先上段视频&#xff0c;不是在玩游戏哦&#xff0c;是规规矩矩的电信网管企业应用&#xff0c;嗯&#xff0c;全键盘的漫游3D机房:随着PC端支持HTML5浏览器的普及&#xff0c;加上主流移动终端Android和iOS都已支持HTML5技术&#xff0c;新一代的电信网管应用几乎一致性的首选H…

从原理到实现,详解基于朴素ML思想的协同过滤推荐算法

作者丨gongyouliu编辑丨Zandy来源 | 大数据与人工智能&#xff08;ID: ai-big-data&#xff09;作者在《协同过滤推荐算法》、《矩阵分解推荐算法》这两篇文章中介绍了几种经典的协同过滤推荐算法。我们在本篇文章中会继续介绍三种思路非常简单朴素的协同过滤算法&#xff0c;这…

C++/C++11中引用的使用

引用(reference)是一种复合类型(compound type)。引用为对象起了另外一个名字&#xff0c;引用类型引用(refer to)另外一种类型。通过将声明符写成&d的形式来定义引用类型&#xff0c;其中d是声明的变量名。 一、一般引用&#xff1a;一般在初始化变量时&#xff0c;初始值…

node.js学习5--------------------- 返回html内容给浏览器

/*** http服务器的搭建,相当于php中的Apache或者java中的tomcat服务器*/ // 导包 const httprequire("http"); const fsrequire("fs"); //创建服务器 /*** 参数是一个回调函数,回调函数2个参数,1个是请求参数,一个是返回参数*/ let serverhttp.createServe…

内核分析阅读笔记

内核分析阅读笔记 include/Linux/stddef.h中macro offsetof define,list: #define offsetof(TYPE,MEMBER) ((size_t) &((TYPE *)0)->MEMBER) offsetof macro对于上述示例的展开剂分析:&((struct example_struct *)0)->list表示当结构example_struct正好在地址0上…

杨强教授力荐,快速部署落地深度学习应用的实践手册

香港科技大学计算机科学与工程学系讲座教授、国际人工智能联合会&#xff08;IJCAI&#xff09;理事会主席&#xff08;2017—2019&#xff09;、深圳前海微众银行首席AI 官 杨强为《深度学习模型及应用详解》一书撰序&#xff0c;他提到现在亟需一本介绍深度学习技术实践的图书…

OpenFace库(Tadas Baltrusaitis)中基于HOG进行正脸人脸检测的测试代码

Tadas Baltrusaitis的OpenFace是一个开源的面部行为分析工具&#xff0c;它的源码可以从https://github.com/TadasBaltrusaitis/OpenFace下载。OpenFace主要包括面部关键点检测(facial landmard detection)、头部姿势估计(head pose estimation)、面部动作单元识别(facial acti…

nginx conf 文件配置

打印输出: location / { default_type text/plain; return 502 "$uri"; } $remode_addr 获取访问者的ID$request_method 判断提交方式 GET POST$http_user_agent 获取浏览器软件 if (条件) {} #if之后要有空格 条件3种写法: 1: 来判断相等,用于字符串比较 …

js中 字符串与Unicode 字符值序列的相互转换

一. 字符串转Unicode 字符值序列 var str "abcdef"; var codeArr []; for(var i0;i<str.length;i){codeArr.push(str.charCodeAt(i)); } console.log(codeArr);-->[97, 98, 99, 100, 101, 102] 二.Unicode 字符值序列转字符串 var str String.fromCharCode…

OpenFace库(Tadas Baltrusaitis)中基于Haar Cascade Classifiers进行人脸检测的测试代码

Tadas Baltrusaitis的OpenFace是一个开源的面部行为分析工具&#xff0c;它的源码可以从 https://github.com/TadasBaltrusaitis/OpenFace 下载。OpenFace主要包括面部关键点检测(facial landmard detection)、头部姿势估计(head pose estimation)、面部动作单元识别(facial a…

Uber提出损失变化分配方法LCA,揭秘神经网络“黑盒”

作者 | Janice Lan,Rosanne Liu等译者 | 清儿爸责编 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】神经网络&#xff08;Neural networks&#xff0c;NN&#xff09;在过去十年来硕果累累&#xff0c;推动了整个行业的机器学习进程。然而&#xff0…

范登读书解读《亲密关系》(婚姻、爱情) 笔记

来源&#xff1a;邀请你看《樊登解读《亲密关系》&#xff08;已婚人士必看&#xff09;》&#xff0c;https://url.cn/5HJvLk5?sfuri 人们在童年的时候始终追寻着两种东西&#xff0c;第一种叫做归属感&#xff0c;第二叫做确认自己的重要性、价值感。 如果再童年的时候缺失这…

myeclipse莫名其妙的问题

2019独角兽企业重金招聘Python工程师标准>>> 怎么刷新&#xff0c;clean项目都不管用&#xff0c;结果删除相应工作空间下的那个项目就行。类似路径如D:\workspace\.metadata\.plugins\org.eclipse.core.resources\.projects 转载于:https://my.oschina.net/u/14488…

数据科学家需要知道的5种图算法

作者&#xff1a;Rahul Agarwal编译&#xff1a;ronghuaiyang来源 | AI公园&#xff08;ID:AI_Paradise&#xff09;【导读】因为图分析是数据科学家的未来。作为数据科学家&#xff0c;我们对pandas、SQL或任何其他关系数据库非常熟悉。我们习惯于将用户的属性以列的形式显示在…

在Windows7/10上快速搭建深度学习框架Caffe开发环境

之前在 http://blog.csdn.net/fengbingchun/article/details/50987353 中介绍过在Windows7上搭建Caffe开发环境的操作步骤&#xff0c;那时caffe的项目是和其它依赖项目分开的&#xff0c;每次换新的PC机时再次重新配置搭建还是很不方便&#xff0c;而且caffe的版本较老&#x…

扫码下单支持同桌单人点餐FAQ

一、使用场景 满足较多商户希望同一桌台&#xff0c;各自点各自的菜品的业态场景&#xff08;例如杭味面馆&#xff0c;黄焖鸡米饭店&#xff0c;面馆等大多数轻快餐店&#xff09; 二、配置步骤及注意事项 管理员后台配置--配置管理--店铺配置--扫码点餐tab页 1、开启扫码下单…

使用photoshop 10.0制作符合社保要求的照片

2019独角兽企业重金招聘Python工程师标准>>> 北京市社保新参统人员照片修制方法 修改目标&#xff1a;照片规格:358像素&#xff08;宽&#xff09;&times;441像素&#xff08;高&#xff09;&#xff0c;分辨率350dpi。 颜色模式:24位RGB真彩色。 储存格式&am…

C++11中std::addressof的使用

C11中的std::addressof获得一个对象的实际地址&#xff0c;即使 operator& 操作符已被重载。它常用于原本要使用 operator& 的地方&#xff0c;它接受一个参数&#xff0c;该参数为要获得地址的那个对象的引用。一般&#xff0c;若operator &()也被重载且不一致的话…

一份职位信息的精准推荐之旅,从AI底层架构说起

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】也许&#xff0c;每天早上你的邮箱中又多了一封职位推荐信息&#xff0c;点开一看&#xff0c;你可能发现这些推荐正合你意&#xff0c;于是按照这些信息&#xff0c;你顺利找到一份符合自己期待的…

Vue.js 生命周期

2019独角兽企业重金招聘Python工程师标准>>> 每个 Vue 实例在被创建之前都要经过一系列的初始化过程 vue在生命周期中有这些状态&#xff0c; beforeCreate,created,beforeMount,mounted,beforeUpdate,updated,beforeDestroy,destroyed。Vue在实例化的过程中&#x…

AX2009取销售订单的税额

直接用以下方法即可&#xff1a; Tax::calcTaxAmount(salesLine.TaxGroup, salesLine.TaxItemGroup, systemDateGet(), salesLine.CurrencyCode, salesParmLine.LineAmount, salesTable.taxModuleType()); salesParmLine.LineAmount&#xff1a;这个直接取的是装箱单或者发票…

Dubbo源码解析之服务路由策略

1. 简介 服务目录在刷新 Invoker 列表的过程中&#xff0c;会通过 Router 进行服务路由&#xff0c;筛选出符合路由规则的服务提供者。在详细分析服务路由的源码之前&#xff0c;先来介绍一下服务路由是什么。服务路由包含一条路由规则&#xff0c;路由规则决定了服务消费者的调…

C++中std::reverse和std::reverse_copy的使用

std::reverse&#xff1a;反转排序容器内指定范围中的元素。std::reverse_copy与std::reverse唯一的区别是&#xff1a;reverse_copy会将结果拷贝到另外一个容器中&#xff0c;而不影响原容器的内容。std::reverse: defined in header <algorithm>, reverses the order …

真相!30K拿到互联网大厂offer,网友:我服了!

最近笔者在知乎刷到一个帖子&#xff0c;其中&#xff0c;这条回答让人印象深刻&#xff1a;其实&#xff0c;最近几年人工智能大火&#xff0c;其中深度学习岗位的薪酬爆增&#xff0c;BAT大厂高薪招聘AI人才&#xff0c;收到的简历却寥寥无几&#xff1f;究竟是大厂岗位要求高…

OracleDesigner学习笔记1――安装篇

OracleDesigner学习笔记1――安装篇 QQ&#xff1a;King MSN&#xff1a;qiutianwhmsn.com Email&#xff1a;qqkinggmail.com 一&#xff0e; 前言 Oracle是当今最流行的关系型数据库之一&#xff0c;和很多朋友一样&#xff0c;我也是一个Oracle的爱好者&#xff0c;从…

C++/C++11中std::queue的使用

std::queue: 模板类queue定义在<queue>头文件中。队列(Queue)是一个容器适配器(Container adaptor)类型&#xff0c;被特别设计用来运行于FIFO(First-in first-out)场景&#xff0c;在该场景中&#xff0c;只能从容器一端添加(Insert)元素&#xff0c;而在另一端提取(Ext…

常见的http状态码(Http Status Code)

常见的http状态码&#xff1a;&#xff08;收藏学习&#xff09; 2**开头 &#xff08;请求成功&#xff09;表示成功处理了请求的状态代码。 200 &#xff08;成功&#xff09; 服务器已成功处理了请求。 通常&#xff0c;这表示服务器提供了请求的网页。201 &#xff08;已创…

“不给钱就删库”的勒索病毒, 程序员该如何防护?

作者 | 阿木&#xff0c;王洪鹏&#xff0c;运营有个人公众号新新生活志。目前任职网易云计算技术部高级工程师&#xff0c;近3年云计算从业经验&#xff0c;爱读书、爱写作、爱技术。责编 | 郭芮来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;近期一家名为ProPub…

ruby实时查看日志

(文章是从我的个人主页上粘贴过来的&#xff0c; 大家也可以访问我的主页 www.iwangzheng.com) 在调试代码的时候&#xff0c;把日志文件打开&#xff0c;边操作边调试能很快帮助我们发现系统中存在的问题。 $tail rails_2014_03_03.log -f转载于:https://www.cnblogs.com/iw…