TensorFlow技术解析与实战

978-7-115-45613-7
作者: 李嘉璇
译者:
编辑: 杨海玲

图书目录:

详情

TensorFlow是谷歌公司开发的深度学习框架,也是目前深度学习的主流框架之一。本书从深度学习的基础讲起,深入TensorFlow框架原理、安装、模型、源代码和统计分析等各个方面。全书分为基础篇、实战篇和提高篇三部分。最后附录中列出一些可供参考的公开数据集,并结合作者的项目经验介绍项目管理的一些建议。

图书摘要

版权信息

书名:TensorFlow技术解析与实战

ISBN:978-7-115-45613-7

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 著    李嘉璇

    责任编辑 杨海玲

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

     邮编 100164  电子邮件 315@ptpress.com.cn

     网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

    反盗版热线:(010)81055315


TensorFlow 是谷歌公司开发的深度学习框架,也是目前深度学习的主流框架之一。本书从深度学习的基础讲起,深入TensorFlow框架原理、模型构建、源代码分析和网络实现等各个方面。全书分为基础篇、实战篇和提高篇三部分。基础篇讲解人工智能的入门知识,深度学习的方法,TensorFlow的基础原理、系统架构、设计理念、编程模型、常用API、批标准化、模型的存储与加载、队列与线程,实现一个自定义操作,并进行TensorFlow源代码解析,介绍卷积神经网络(CNN)和循环神经网络(RNN)的演化发展及其TensorFlow实现、TensorFlow的高级框架等知识;实战篇讲解如何用TensorFlow写一个神经网络程序并介绍TensorFlow实现各种网络(CNN、RNN和自编码网络等),并对MINIST数据集进行训练,讲解TensorFlow在人脸识别、自然语言处理、图像和语音的结合、生成式对抗网络等方面的应用;提高篇讲解TensorFlow的分布式原理、架构、模式、API,还会介绍TensorFlow XLA、TensorFlow Debugger、TensorFlow和Kubernetes结合、TensorFlowOnSpark、TensorFlow移动端应用,以及TensorFlow Serving、TensorFlow Fold和TensorFlow计算加速等其他特性。最后,附录中列出一些可供参考的公开数据集,并结合作者的项目经验介绍项目管理的一些建议。

本书深入浅出,理论联系实际,实战案例新颖,基于最新的TensorFlow 1.1版本,涵盖TensorFlow的新特性,非常适合对深度学习和TensorFlow感兴趣的读者阅读。

恭喜你选择TensorFlow,它是最流行的深度学习框架,没有之一。 我相信这是一本能让你坚持看到最后一页的技术书。

谨以本书献给我的挚爱—文森特•梵高先生,他毕生用画作所代表的 对生活的美好追求,是我在无数个黑夜中的灵魂伴侣。

今天深度学习已经渗透到互联网技术和产品的方方面面,它从学术界的一个研究课题变成了被工业界最广泛应用的关键技术。对于每一个程序员,我认为都应该或多或少了解和掌握深度学习。对于初学者来说,从TensorFlow入手是很好的起点。TensorFlow有谷歌的强大支持,并且有广泛的社区。

本书的作者李嘉璇曾是百度的一名优秀工程师,一位非常勤奋的女生。她在工作之余致力于人工智能的研究,对深度学习框架的架构、应用及编程进行深入钻研,并利用深度学习做图像处理、情感分析、文本挖掘等项目。更为难得的是,她在繁忙的工作之外积极创建TensorFlow及深度学习交流社区,同时也活跃于国内各大技术社区。这本书更是她投入了很多个不眠之夜编写而成。

鉴于这样的背景,我认为这本书非常适合希望入门深度学习的程序员。他们可以将本书作为一本入门和实践的书阅读。读者可以从本书中了解基本的深度学习原理、典型的模型、大量的TensorFlow源代码以及成功的应用范例。从本书出发,读者可以循序渐进,逐步深入,在工作实践中加以运用,领略深度学习的美妙。

余凯

地平线机器人创始人,前百度深度学习实验室主任


2017年2月,TensorFlow的首届开发者峰会(2017 TensorFlow Dev Summit)在美国的加利福尼亚州举行。在会上,谷歌公司宣布正式发布TensorFlow 1.0版本。本书就是基于最新的1.1.0版本来介绍TensorFlow的技术解析和实战。

人工智能大潮来了。2016年,AlphaGo击败围棋大师李世石后,人工智能的应用仿佛一夜之间遍地开花。在科技潮流的大环境中,现在硅谷的用人单位越来越倾向于雇用既懂理论(思考者)又懂编程(执行者)的工程师。思考者的日常工作是阅读文献以求产生思路,而执行者则是编写代码来实现应用。但是要成为一名真正的工程师,学习机器学习是将思考者和执行者相结合的最快途径。

众所周知,人工智能是高级计算智能最宽泛的概念,机器学习是研究人工智能的一个工具,深度学习是机器学习的一个子集,是目前研究领域卓有成效的学习方法。深度学习的框架有很多,而TensorFlow将神经网络、算法这些平时停留在理论层面的知识,组织成一个平台框架,集合了神经网络的各个算法函数组成一个工具箱,让广大工程师可以专心建造自己的目标领域的“轮子”,而且TensorFlow是基于Python语言的,极易上手,这些优势迅速吸引了全世界的工程师。

我曾经也是一名前后端开发工程师,更专注于后端工程方向,而潜心研究深度学习和TensorFlow后,我被TensorFlow深深地迷住了。我发现它对各行各业将会有很深远的影响,并且会大大地解放劳动力。

与传统工程师的主要工作——实现产品需求或者设计高可用性架构不同,深度学习让人总结和抽象人类是怎样理解和看待问题的,并把这种方式教给机器。例如,在AlphaGo的研究中,人们需要先抽象出人类思考围棋的方式,然后将这种方式抽象成算法,并且配合人类大脑构造中神经网络的传输来实现这些算法。这时,工程师不会再写实现业务需求的逻辑代码,而是深度学习中将神经网络的“黑盒”和模型效果非常好却缺乏“可解释性”的特性相结合,在次次实验中尽量找出规律。记得美国前总统肯尼迪在宣布登月计划时曾说:“我们选择去月球,不是因为它简单,而是因为它困难。”今天,我相信,所有致力于人工智能方向的工程师之所以自豪地去研究,也不是因为它简单,而是因为它困难。我们研究它,是因为立足于现在这个点往前看,我们看不到已经建好的高楼大厦,看到的是一片等待我们去发掘的空旷的大地,而这个发掘过程需要的是十足的远见、决心、勇气和信心。

我在学习的过程中,由于深度学习的资料英文的居多,在理解上走了不少弯路。我把学到的知识和原理用心整理并用文字表述出来,写成这本书,希望能帮助没有接触过深度学习的广大程序员迅速上手,而不再被英文阅读理解挡在门外。说实话,TensorFlow的文档以及API接口是比较抽象的,再加上有一些从工程方向转入深度学习的人以前没有过深度学习的经验,所以如果带着工程类程序研发的思维去学习,甚至是实现业务逻辑需求的思维去学习,效果会很差。我希望这本书能为读者呈现一个通俗易懂、形象生动的TensorFlow,使读者迅速走入深度学习的世界。

在本书的写作过程中,为了能充分挤出时间,深夜当我困倦时,我常常让自己以最不舒服的方式入睡,希望能尽量少睡,以此增加仔细钻研的时间。有时我还会打开电视,将音量设置为静音,感受房间中电视背景光闪烁的动感,以此提醒自己时间的流动。刚开始我会坐在工作台前写作,累了又会抱着笔记本坐在床上继续写作,有时会写着写着不知不觉地睡着,凌晨三四点钟又醒来,感受黑夜里的那片安宁,心情顿时平静,再次投入到钻研中。每每有灵感,都非常激动;每每再次深入一个概念,增删易稿,把原理逼近真相地讲透,都让我非常有成就感。

我素来不爱探究数学公式的推导原理,对符号也很茫然,只是在必须要用时才对这些公式进行详细的推导,但是我却对这些原理在应用层面如何使用出奇地感兴趣。本书的目标就是带读者进入造“应用轮子”的大门。我会以最少的数学公式讲清楚如何用TensorFlow实现CNN、RNN,如何在实战中使用TensorFlow进行图片分类、人脸识别和自然语言处理等,以及如何将想训练的数据、想实现的应用亲手做出来。

同时,Python语言是一门相当高级的语言,有“可执行的伪代码”的美誉,可以用极少的代码行去完成一个复杂的功能,同时Python还有极为丰富的第三方库,让全世界很多工程师的开发工作变得异常简单。TensorFlow是用Python语言实现的框架,对很多学生来说非常容易上手,当然,如果是有开发经验的工程师,就更容易学会。如果说设计神经网络模型像是盖一栋大楼,那么TensorFlow强大的API用起来会让人感觉就像搭积木一样容易。因此,懂点儿Python,即便不怎么懂数学和算法原理也没关系,尽管跟着我一起学便是。

在翻译学上有一个概念叫作“平行语料库”,这个概念来自制作于公元前196年的古埃及罗塞塔石碑,石碑上用希腊文字、古埃及文字和当时的通俗体文字刻了同样的内容。在本书进行某个概念的讲解时,虽然是用Python代码作示范,但TensorFlow前端开发同时也支持多种上层语言,本书讲解过程中也会兼顾到用C++、Java、Go语言做开发的读者。

我希望,本书成为不同领域的读者进入人工智能领域的“垫脚石”,也希望所有的读者在人生路上能利用TensorFlow这个工具大放异彩。

我有很重的强迫症,因此,在编写本书的过程中,阅读了国内外很多与TensorFlow相关的资料,对本书的目录结构和框架经过很多次反复琢磨和调整;在写完之后,我又从头到尾地读过好几遍,并且和了解TensorFlow不同方面的人反复交流,根据建议又反复修改。这一切就是希望它能通俗易懂,把读者快速领入深度学习的大门。

这扇门的背后是异彩纷呈的,身怀这门技艺的人是应该非常自豪的,但这扇门的背后也是非常辛苦的,有时数据需要自己去想办法解决,还需要每天看论文,知晓最新科研成果,给自己以启发,反复地做实验,研究算法和模型,寻求提升和解决方法,经常会遇到在很长一段时间没有思路的情况。但是,只要做的东西是开创的,令人称赞的,就会开心地享受这个过程。

我专为本书读者建立了一个QQ交流群(320420130),希望在群里与大家深入讨论和交流学习过程中遇到的问题,也希望与大家分享最新的研究成果。

非常感谢谷歌大脑的工程师Jeff Dean,在得知我目前正在写这本书的时候,他特地发了邮件鼓励我:“听说你写了一本关于TensorFlow的书,真是太好了。希望你很享受学习TensorFlow的这段经历,并享受运用TensorFlow完成各种任务的这种体验。我非常高兴你为中文社区写这本书。”[1]这让我更坚定了传播TensorFlow深度学习的决心。

感谢百度硅谷AI实验室资深科学家王益老师关于AI on Kubernetes的建议。

感谢在百度工作时的同事陈后江,在写作过程中,我们有时在周末的深夜还进行讨论,印象最深的一次是在大冬天晚上,我们恰好都在外面,相互通了20多分钟电话,手冻得像冰棒似的。还要感谢童牧晨玄,他也是深度学习领域的爱好者,对关键的概念理解得非常透彻,能十分精准地讲出原理。

非常感谢《Redis实战》一书的译者黄健宏,他对技术写作有很丰富的经验。和他聊书总是能聊到凌晨以后,讨论到畅快处,甚至聊到天亮,他对问题的思考就像是“演杂技”一样,精准又恰到好处;同时,他又是一个非常让人感到温暖和踏实的朋友。

非常感谢iOS资深开发者唐巧,他在国内社区乐于分享的精神造福了很多的技术从业者,也正是他的推荐让我和本书的编辑杨海玲老师结下了这段美好的情谊。

非常感谢人民邮电出版社的杨海玲编辑,她最开始想到这个写作方向,我们一起一点一点地讨论书的内容,确认书的写作框架。在写作过程中,她的细致、专业、独到的见解也为本书增色不少。她对内容严谨和认真的态度令人动容。

非常感谢中科院计算所刘昕博士对本书第6章神经网络的发展提出的建议;感谢曾经的百度同事毕骁鹏对第8章、第9章、第13章、第14章、第20章、第21章提出的极为细致的建议,尤其是他擅长GPU和FPGA的部分,对本书的硬件加速提供了很多建议;感谢中科院智能信息处理重点实验室常务副主任山世光对第10章人脸识别部分提出的建议;感谢刘元震对本书第11章提出的建议;感谢我的好朋友容器专家苗立尧对第17章提出的建议;感谢百度地图导航专家梁腾腾对第19章移动端开发给予的极为细致的建议;感谢阿里巴巴数据科学与技术研究院高级专家孙亮博士对整本书的结构和知识点提出的建议。

感谢我的好朋友吴丽明,曾经那么帮助过我;感谢我的好朋友饶志臻先生,一直诱惑我买苹果设备,有个硬件发烧友真的很幸福;感谢我的闺蜜谢禹曦,好久没有和你聚餐了,甚是思念。

最后,还得感谢一位流行歌手——“火星弟弟”华晨宇,他在舞台上那一次次创意和感染力的演出深深地吸引了我,他在台下那认真刻苦作曲改歌的样子也激励着我,每次想到他的事迹,都给我极大的鼓励。

非常感谢本书的每一位读者,本书的完成过程非常辛苦但也充满甜蜜。我在“知乎”(ID:李嘉璇)和网站(tf.greatgeekgrace.com)上也会回答关于“人工智能”的各类问题,希望通过内容的更新与读者不断交流。另外,由于水平有限,在内容上表述上难免也有遗漏和疏忽,也恳请读者多多指正。

李嘉璇

2017年4月于北京石景山

个人博客:blog.greatgeekgrace.com

TensorFlow交流社区:tf. greatgeekgrace.com

电子邮箱:qiyueli_2013@163.com

[1] Jeff Dean的邮件原文是:“It’s great that you've written a book about TensorFlow. I hope you enjoyed the experience in learning about TensorFlow and how to accomplish various tasks. I'm glad that you’re making your book available for the Chinese speaking community.”。


著名历史学家斯塔夫里阿诺斯在《全球通史》中,曾以15世纪的航海在“物理上”连通“各大洲”作为标志将人类历史划分为两个阶段。在我正在写作的《互联网通史》中,我把互联网这个“信息上”连通“人类个体”的物件作为划分人类历史的标志。而随着人工智能最近的崛起,我们又该思考重新划分了,因为人工智能将会在“信息上”连通“各个物体”。到那时各个物体都有“智能”,如智能汽车、智能电视、扫地机器人、智能音响等智能家居,想象极度的智能下,屋子里的电器和家居都可能和我们有简单的交互。

深度学习领域之所以异军突起,是因为传统的研发思维,如架构、组件化、大规模并发、存储与计算等,已经是技术红海了,而每位工程师都应该学习机器学习,是因为它带给工程师全新的开发思维,工程师可以用自己的代码让机器更加“聪明”。


有人说,人工智能在世界范围的流行,是因为那盘围棋。2016年3月,谷歌公司的AlphaGo向韩国棋院围棋九段大师李世石发起挑战,而这棋局走法的可能性有361!种,最终AlphaGo战胜了这场“棋局数比可见宇宙中的原子数还多”的智力游戏。2015年11月9日(在距这场比赛前4个月),谷歌公司开源了它的第二代深度学习系统TensorFlow,也就是AlphaGo的基础程序。

什么是人工智能(artificial intelligence,AI)?要了解这个问题,我们先来看看人工智能的几个应用。

1.微软小冰

相信很多朋友手机里都有关注“微软小冰”的公众号,这是微软(亚洲)互联网工程院的一款人工智能伴侣虚拟机器人,跟它聊天时你会发现,小冰有时回答得非常切中你的心意,而有时逻辑上表达却有点儿对不上上下文,所以你觉得它时而回答得不错像人,时而又一眼看穿它是个机器人。这种能否判断对方究竟是人还是机器人的思维实验,叫作“图灵测试”。

图灵测试是计算机科学之父英国人艾伦·图灵提出的,这是一种测试机器是否具备人类智能的方法。图灵设计了一种“模仿游戏”:远处的人在一段规定的时间内,根据两个实体——电脑和人类对他提出的各种问题来判断对方是人类还是电脑。[1]具体过程如图1-1所示。C向A和B提出问题,由C来判断对方是人类还是电脑。通过一系列这样的测试,从电脑被误判断为人的概率就可以测出电脑的智能程度,电脑越被误判成人,说明智能程度就越高。

图1-1

这种情感对话能力就是人工智能的一个方向。而现在微软小冰更是可以通过文本、图像、视频和语音与人类展开交流,逐渐具备能看、能听和能说的各种人工智能感官,并且能够和人类进行双向同步交互。

2.人脸识别

现在许多电脑开机密码、支付宝的刷脸支付、客流的闸机通行都有采用人脸识别技术。目前市面上也有许多人脸识别考勤机。很多公司已经采用了人脸闸机打卡签到技术,当有人刷脸打卡签到时,识别出这个人的面部特征,考勤机会将其与公司的员工信息进行比对,完成身份识别,确认后,便可开闸放行。

更进一步讲,人脸识别中还可以识别出人物的年龄、性别、是否佩戴眼镜、是否有笑容、情绪欢乐或悲伤,以及眼睛、鼻子、嘴等关键部位,这就是人脸关键点检测。图1-2就是人脸关键点检测的一个示例。

图1-2

国内有一些公司在人脸识别上已经达到了先进水平,如云从科技、旷视科技、商汤科技等。旷视科技的Face++有目前世界一流的人脸追踪、识别、分析等服务应用,面向开发者的云平台及API、SDK,已经可以直接调用。

以上是人工智能应用的两个例子。百度百科上给出的人工智能的解释是:“它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。”[2]

简而言之,人工智能就是研究用计算机来实现人类的智能,例如,去模仿人类的知觉、推理、学习能力等,从而让计算机能够像人一样思考和行动,有图像识别(机器识别出猫猫狗狗)、人机对话(机器感知到人类的语义和情感,并给出反馈)、围棋的人机对弈(AlphaGo、Master等让机器自己思考去下棋)等。

国际上的谷歌、苹果、亚马逊、微软等巨大公司都在“两条腿走路”,一方面在做研发项目,如“谷歌大脑”(Google Brain),另一方面同时发力智能家居,如“Google Home智能音箱”,希望把设备当成人来交流。国内的阿里、腾讯、百度、搜狗、地平线等公司以及很多不同领域的创业公司也都在积累的大量数据上,开始尝试训练出高效的模型,不断优化业务指数。

那么,机器是如何实现人类的智力的呢?其实,机器主要是通过大量的训练数据进行训练,程序不断地进行自我学习和修正来训练出一个模型,而模型的本质就是一堆参数,用上千万、上亿个参数来描述业务的特点,如“人脸”“房屋地段价格”“用户画像”的特点,从而接近人类智力。这个过程一般采用的是机器学习以及机器学习的子集——深度学习(deep learning),也就是结合深度神经网络的方法来训练。所以说,深度学习方法是能够迅速实现人工智能很有效的工具。

 

AlphaGo的原理 

20年前,IBM的“深蓝”计算机打败人类象棋高手的情景仿佛还历历在目。20年后,人工智能挑战最难的棋类——围棋棋局也成功了。那么AlphaGo是如何下棋的呢?我们知道,传统计算机的下棋方法,一般采取贪婪算法,用Alpha-Beta修剪法配合Min-Max算法。而AlphaGo采用了蒙特卡洛树搜索法(Monte Carlo tree search,MCTS)和深度卷积神经网络(deep convolutional neural network,DCNN)相结合。模型中涉及的主要网络及作用如下。

● 估值网络(value network,也称盘面评估函数):计算出盘面的分数。

● 策略网络(policy network):计算对于下每一个棋子的概率和胜率。它评估对手和自己可能下的位置,对可能的位置进行评估和搜寻。

训练模型的主要过程分为以下4步。

(1)采用分类的方法得到直接策略。

(2)直接策略对历史棋局资料库进行神经网络学习,得到习得策略。

(3)采用强化学习的方法进行自我对局来得到改良策略。

(4)用回归的方法整体统计后得到估值网络。

这里的神经网络部分都采用的是深度卷积神经网络,在自我对局的部分采用的是蒙特卡洛树状搜寻法(MCTS)。

更详细的论文见谷歌公司发表在《自然》(Nature)上的论文《Mastering the game of Go with deep neural networks and tree search》。

深度学习,顾名思义,需要从“深度”和“学习”两方面来谈。

1.深度

深度学习的前身是人工神经网络(artificial neural network,ANN),它的基本特点就是试图模仿人脑的神经元之间传递和处理信息的模式。神经网络这个词本身可以指生物神经网络和人工神经网络。在机器学习中,我们说的神经网络一般就是指人工神经网络。

图1-3给出的是一个最基本的人工神经网络的3层模型。

图1-3

人工神经网络由各个层组成,输入层(input layer)输入训练数据,在输出层(output layer)输出计算结果,中间有1个或多个隐藏层(hidden layer),使输入数据向前传播到输出层。“深度”一词没有具体的特指,一般就是要求隐藏层很多(一般指5层、10层、几百层甚至几千层)。

人工神经网络的构想源自对人类大脑的理解——神经元的彼此联系。二者也有不同之处,人类大脑的神经元是按照特定的物理距离连接的,而人工神经网络有独立的层和连接,还有数据传播方向。

例如,我们拿一张图片,对它做一些预处理,如图像居中、灰度调整、梯度锐化、去除噪声、倾斜度调整等,就可以输入到神经网络的第一层。然后,第一层会自己提取这个图像的特征,把有用的特征向下传递,直到最后一层,然后输出结果。这就是一次前向传播(forword propagation)。

最后一层的输出要给出一个结论,例如,在分类问题中,要告诉我们到底输入的图像是哪个类别,一般它会给出一个“概率向量”。如图1-4所示,列出了这只猫所属品种的前5个概率值。

图1-4

人工神经网络的每一层由大量的节点(神经元)组成,层与层之间有大量连接,但是层内部的神经元一般相互独立。深度学习的目的就是要利用已知的数据学习一套模型,使系统在遇见未知的数据时也能够做出预测。这个过程需要神经元具备以下两个特性。

(1)激活函数(activation function):这个函数一般是非线性函数,也就是每个神经元通过这个函数将原有的来自其他神经元的输入做一个非线性变化,输出给下一层神经元。激活函数实现的非线性能力是前向传播(forward propagation)很重要的一部分。

(2)成本函数(cost function):用来定量评估在特定输入值下,计算出来的输出结果距离这个输入值的真实值有多远,然后不断调整每一层的权重参数,使最后的损失值最小。这就是完成了一次反向传播(backward propagation)。损失值越小,结果就越可靠。

神经网络算法的核心就是计算、连接、评估、纠错和训练,而深度学习的深度就在于通过不断增加中间隐藏层数和神经元数量,让神经网络变得又深又宽,让系统运行大量数据,训练它。

2.学习

什么是“学习”?有一些成语可以概括:举一反三、闻一知十、触类旁通、问牛知马、融会贯通等。计算机的学习和人类的学习类似,我们平时大量做题(训练数据),不断地经过阶段性考试(验证数据)的检验,用这些知识和解题方法(模型)最终走向最终(测试数据)的考场。

最简单也最普遍的一类机器学习算法就是分类(classification)。对于分类,输入的训练数据有特征(feature),有标记(label),在学习中就是找出特征和标记间的映射关系(mapping),通过标记来不断纠正学习中的偏差,使学习的预测率不断提高。这种训练数据都有标记的学习,称为有监督学习(supervised learning)。

无监督学习(unsupervised learning)则看起来非常困难。无监督学习的目的是让计算机自己去学习怎样做一些事情。因此,所有数据只有特征而没有标记。

无监督学习一般有两种思路:一是在训练时不为其指定明确的分类,但是这些数据会呈现出聚群的结构,彼此相似的类型会聚集在一起。计算机通过把这些没有标记的数据分成一个个组合,就是聚类(clustering);二是在成功时采用某种形式的激励制度,即强化学习(reinforcement learning,RL)。对强化学习来说,它虽然没有标记,但有一个延迟奖赏与训练相关,通过学习过程中的激励函数获得某种从状态到行动的映射。强化学习一般用在游戏、下棋(如前面提到的AlphaGo)等需要连续决策的领域。(6.7.1节会讲解强化学习的应用。)

有人可能会想,难道就只有有监督学习和无监督学习这两种非黑即白的关系吗?二者的中间地带就是半监督学习(semi-supervised learning)。对于半监督学习,其训练数据一部分有标记,另一部分没有标记,而没标记数据的数量常常极大于有标记数据的数量(这也符合现实,大部分数据没有标记,标记数据的成本很大)。它的基本规律是:数据的分布必然不是完全随机的,通过结合有标记数据的局部特征,以及大量没标记数据的整体分布,可以得到比较好的分类结果。

因此,“学习”家族的整体构造如图1-5所示[3]

图1-5

关于有监督学习和无监督学习在实战中的应用,会在本书“实战篇”中介绍。

要想入门深度学习,需要两个工具,即算法知识和大量的数据,外加一台计算机,如果有GPU就更好了,但是因为许多入门初学者的条件有限,没有GPU也可以,本书的许多讲解都是基于Mac笔记本完成的。

我把深度学习的入门过程整理成图1-6所示的7个步骤。

图1-6

下面就来详细介绍一下这7个步骤。

1.学习或者回忆一些数学知识

因为计算机能做的就只是计算,所以人工智能更多地来说还是数学问题[4]。我们的目标是训练出一个模型,用这个模型去进行一系列的预测。于是,我们将训练过程涉及的过程抽象成数学函数:首先,需要定义一个网络结构,相当于定义一种线性非线性函数;接着,设定一个优化目标,也就是定义一种损失函数(loss function)。

而训练的过程,就是求解最优解及次优解的过程。在这个过程中,我们需要掌握基本的概率统计、高等数学、线性代数等知识,如果学过就最好,没学过也没关系,仅仅知道原理和过程即可,有兴趣的读者可以涉猎一些推导证明。

2.掌握经典机器学习理论与基本算法

这些基本算法包括支持向量机、逻辑回归、决策树、朴素贝叶斯分类器、随机森林、聚类算法、协同过滤、关联性分析、人工神经网络和BP算法、PCA、过拟合与正则化等。[5]

在本书“实战篇”的第8章到第13章的例子中也有贯穿这些算法知识,保证读者可以用它写出一个小的TensorFlow程序。

3.掌握一种编程工具(语言)

Python语言是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python是很多新入门的程序员的入门编程语言,也是很多老程序员后来必须掌握的编程语言。我们需要重点掌握使用线性代数库和矩阵的操作,尤其是Numpy、Pandas第三方库,也要多试试机器学习的库,如sklearn,做一些SVM及逻辑回归的练习。这对直接上手写TensorFlow程序大有裨益。

有些工业及学术领域的读者还可能擅长MATLAB或R,其实现算法的思想和Python也很类似。

同时考虑到许多读者是使用C++、Java、Go语言的,TensorFlow还提供了和Python“平行语料库”的接口。虽然本书是主要是基于Python讲解的,对于其他语言的原理和应用API也都非常类似,读者把基础掌握后,只需要花很短的时间就能使用自己擅长的语言开发。另外对于Java语言的同学,本书第18章会讲解TensorFlowOnSpark,第19章会讲到TensorFlow的移动端开发。

4.研读经典论文,关注最新动态和研究成果

一些经典论文是必读的。例如,要做手写数字识别,若采用LeNet,要先阅读一下LeNet的学术论文;要做物体目标检测的训练,若选定MSCNN框架,可以先读MSCNN相关的论文。那么,论文从哪里找呢?那么多论文应该读哪篇呢?

下面以GoogleNet的TensorFlow实现为例。在GitHub[6]上,一般在开头的描述中就会说明这个模型所依据的论文,如图1-7所示。

顺着这篇论文阅读,可以大致了解这个网络的实现原理,对迅速上手应用有很大的作用。同时,我在第6章也会对LeNet、AlexNet、ResNet这几个常见的网络进行讲解,帮助读者举一反三。

图1-7

很多做模式识别的工作者之所以厉害,是因为他们有过很多、很深的论文积累,对模型的设计有很独到的见解,而他们可能甚至一行代码也不会写,而工程(写代码)能力在工作中很容易训练。许多工程方向的软件工程师,工作模式常常在实现业务逻辑和设计架构系统上,编码能力很强,但却缺少论文积累。同时具有这两种能力的人,正是硅谷一些企业目前青睐的人才。

读者平时还可以阅读一些博客、笔记,以及微信公众号、微博新媒体资讯等,往往一些很流行的新训练方法和模型会很快在这些媒体上发酵,其训练神经网络采用的一些方法可能有很大的启发性。

5.自己动手训练神经网络

接着,就是要选择一个开源的深度学习框架。选择框架时主要考虑哪种框架用的人多。人气旺后,遇到问题很容易找到答案;GitHub上关于这个框架的项目和演示会非常多;相关的论文也会层出不穷;在各个QQ群和微信群的活跃度会高;杂志、公众号、微博关注的人也会很多;行业交流和技术峰会讨论的话题也多;也能享受到国内外研究信息成果的同步。

目前这个阶段,TensorFlow因为背靠谷歌公司这座靠山,再加上拥有庞大的开发者群体,而且采用了称为“可执行的伪代码”的Python语言,更新和发版速度着实非常快。目前TensorFlow已经升级到1.1版,在性能方面也有大幅度提高,而且新出现的Debugger、Serving、XLA特性也是其他框架所不及的。此外,一些外围的第三方库(如Keras、TFLearn)也基于它实现了很多成果,并且Keras还得到TensorFlow官方的支持。TensorFlow支持的上层语言也在逐渐增多,对于不同工程背景的人转入的门槛正在降低。

在GitHub[7]上有一个关于各种框架的比较,从建模能力、接口、模型部署、性能、架构、生态系统、跨平台等7个方面进行比较,TensorFlow也很占综合优势。截至2017年1月,TensorFlow的star数已经超过了其他所有框架的总和,如图1-8所示。

因此,从目前来看,投身TensorFlow是一个非常好的选择,掌握TensorFlow在找工作时是一个非常大的加分项。

图1-8

接下来就是找一个深度神经网络,目前的研究方向主要集中在视觉和语音两个领域。初学者最好从计算机视觉入手,因为它不像语音等领域需要那么多的领域知识,结果也比较直观。例如,用各种网络模型来训练手写数字(MNIST)及图像分类(CIFAR)的数据集。

6.深入感兴趣或者工作相关领域

人工智能目前的应用领域很多,主要是计算机视觉和自然语言处理,以及各种预测等。对于计算机视觉,可以做图像分类、目标检测、视频中的目标检测等;对于自然语言处理,可以做语音识别、语音合成、对话系统、机器翻译、文章摘要、情感分析等,还可以结合图像、视频和语音,一起发挥价值。

更可以深入某一个行业领域。例如,深入医学行业领域,做医学影像的识别;深入淘宝的穿衣领域,做衣服搭配或衣服款型的识别;深入保险业、通信业的客服领域,做对话机器人的智能问答系统;深入智能家居领域,做人机的自然语言交互;等等。

7.在工作中遇到问题,重复4~6步

在训练中,准确率、坏案例(bad case)、识别速度等都是可能遇到的瓶颈。训练好的模型也不是一成不变的,需要不断优化,也需要结合具体行业领域和业务进行创新,这时候就要结合最新的科研成果,调整模型,更改模型参数,一步步更好地贴近业务需求。

想想,在机器学习流行之前,我们是如何做与语音和图像相关的识别的?大多数是基于规则的系统。例如,做自然语言处理,需要很多语言学的知识;再如,1997年的IBM的深蓝计算机对战国际象棋,也需要很多象棋的知识。

当以统计方法为核心的机器学习方法成为主流后,我们需要的领域知识就相对少了。重要的是做特征工程(feature engineering),然后调一些参数,根据一些领域的经验来不断提取特征,特征的好坏往往就直接决定了模型的好坏。这种方法的一大缺点是,对文字等抽象领域,特征还相对容易提取,而对语音这种一维时域信号和图像这种二维空域信号等领域,提取特征就相对困难。

深度学习的革命性在于,它不需要我们过多地提取特征,在神经网络的每一层中,计算机都可以自动学习出特征。为了实现深度学习中运用的神经网络,TensorFlow这样的深度学习开源工具就应运而生。我们可以使用它来搭建自己的神经网络。这就有点儿类似于PHP开发当中的CodeIgniter框架,Java开发当中的SSH三大框架,Python开发当中的Tornado、Django框架,C++当中的MFC、ACE框架。框架的主要目的就是提供一个工具箱,使开发时能够简化代码,呈现出来的模型尽可能简洁易懂。

首先,TensorFlow的一大亮点是支持异构设备分布式计算(heterogeneous distributed computing)。

何为异构?信息技术当中的异构是指包含不同的成分,有异构网络(如互联网,不同厂家的硬件软件产品组成统一网络且互相通信)、异构数据库(多个数据库系统的集合,可以实现数据的共享和透明访问[8])。这里的异构设备是指使用CPU、GPU等核心进行有效地协同合作;与只依靠CPU相比,性能更高,功耗更低。

那何为分布式?分布式架构目的在于帮助我们调度和分配计算资源(甚至容错,如某个计算节点宕机或者太慢),使得上千万、上亿数据量的模型能够有效地利用机器资源进行训练。

图1-9给出的是开源框架TensorFlow的标志。

图1-9

TensorFlow支持卷积神经网络(convolutional neural network,CNN)和循环神经网络(recurrent neural network,RNN),以及RNN的一个特例长短期记忆网络(long short-term memory,LSTM),这些都是目前在计算机视觉、语音识别、自然语言处理方面最流行的深度神经网络模型。

下面参考《The Unreasonable Effectiveness of Recurrent Neural Networks》[9]这篇文章梳理了一个有效框架应该具有的功能。

在我看来,在目前的深度学习的研究领域主要有以下3类人群。

我相信本书的读者也大都是第二类和第三类人群,且以第三类人群居多。

而在工业界,TensorFlow将会比其他框架更具优势。工业界的目标是把模型落实到产品上,而产品的应用领域一般有两个:一是基于服务端的大数据服务,让用户直接体验到服务端强大的计算能力(谷歌云平台及谷歌搜索功能);二是直接面向终端用户的移动端(Android系统)以及一些智能产品的嵌入式。

坐拥Android的市场份额和影响力的谷歌公司,在这两个方向都很强大。此外,谷歌力推的模型压缩和8位低精度数据存储(详见第 19 章)不仅对训练系统本身有优化作用,在某种程度上也能使算法在移动设备上的部署获益,这些优化举措将会使存储需求和内存带宽要求降低,并且使性能得到提升,对移动设备的性能和功耗非常有利。

如果一个框架的用户生态好,用的人就会很多,而用的人多会让用户生态更繁荣,用的人也就会更多。这庞大的用户数就是TensorFlow框架的生命力。

截至2017年1月,与Caffe、Theano、Torch、MXNet等框架相比,TensorFlow在GitHub上Fork数和Star数都是最多的,如图1-10所示。

图1-10

图1-11展示了截至2017年2月,近些年几大机器学习框架的流行程度。

图1-11

在TensorFlow官方网站[10]上,着重介绍了TensorFlow的6大优势特性。

图1-12

除了谷歌在自己的产品线上使用TensorFlow外,国内的京东、小米等公司,以及国外的Uber、eBay、Dropbox、Airbnb等公司,都在尝试使用TensorFlow。图1-13是摘自TensorFlow官方网站的日益壮大的公司墙。

图1-13

2016年4月,TensorFlow的0.8版本就支持了分布式、支持多GPU运算。2016年6月,TensorFlow的0.9版本改进了对移动设备的支持。2017年2月,TensorFlow的1.0正式版本中,增加了Java和Go的实验性API,以及专用编译器XLA和调试工具Debugger,还发布了tf.transform,专门用来数据预处理。并且还推出了“动态图计算”TensorFlow Fold,这是被评价为“第一次清晰地在设计理念上领先”[12]

用户还可以使用谷歌公司的PaaS TensorFlow产品Cloud Machine Learning来做分布式训练。现在也已经有了完整的TensorFlow Model Zoo。

另外,TensorFlow出色的版本管理和细致的官方文档手册,以及很容易找到解答的繁荣的社区,应该能让用户用起来相当顺手。

截至2017年3月,用TensorFlow作为生产平台和科研基础研发已经越来越坚实可靠。

说到机器学习,不得不提到每年的一些挑战赛。近年来取得好成绩的队伍,常常是使用深度学习的方法的。正是这些赛事激励着全世界科学家不断采用更优化的方法提高算法结果的准确率,也引领着年度的深度学习探索方向。

ILSVRC(ImageNet Large Scale Visual Recognition Challenge,大规模视觉识别挑战赛)是用来大规模评估对象检测和图像识别的算法的挑战赛。从2010年开始,至2016年已举办7届。ImageNet是目前世界上最大的图像识别数据库,拥有超过1500万张有标记的高分辨率图像的数据集,这些图像分属于大概22 000个类别。ILSVRC使用ImageNet的一个子集,分为1 000种类别,每种类别中都有大约1 000张图像。总之,大约有120万张训练图像,5万张验证图像和15万张测试图像。[13]图1-14所示为ImageNet的官方网站。

图1-14

ILSVRC每年邀请谷歌、微软、百度等IT企业使用ImageNet,测试他们图片分类系统运行情况。过去几年中,该系统的图像识别功能大大提高,出错率仅为约5%(比人眼还低,人眼的识别错误率大概在5.1%[14])。在2015年,ILSVRC的错误率已经降低到了3.57%[15],采用152层的ResNet获得了2015年分类任务的第一名。ILSVRC历年的Top-5错误率如图1-15所示。

在ImageNet上,习惯性地报告两个错误率:Top-1和Top-5。Top-1错误率是指,预测输出的概率最高的类别,是否和人工标记的类别一致,如果不一致,此时的概率。Top-5错误率是指,预测输出的概率最高的前5个类别当中,有没有和人工标记的类别一致,当5个都不一致时的概率。例如在图片分类任务下,对一张图片进行预测,输出这张图片分类概率最高的5个类别,只要有一个预测的类别和人工标注的类别标记一致,就是认为正确。当5个都不一致发生的概率就是Top-5错误率。

图1-15

值得自豪的是,在刚刚过去的ILSVRC 2016上,中国学术界和工业界科研团队包揽了多项冠军[16]

如果说ILSVRC企业参加的居多,那Kaggle这个平台则更多地面向个人开发者。图 1-16展示的是Kaggle的官方网站首页。

Kaggle成立于2010年,是一个进行数据发掘、数据分析和预测竞赛的在线平台。与Kaggle合作之后,一家公司可以提供一些数据,进而提出一个问题,Kaggle网站上的计算机科学家和数学家(也就是现在的数据科学家)将领取任务,提供潜在的解决方案。最终胜出的解决方案可以获得3万美元到25万美元的奖励。也就是说,Kaggle也是一个众包理念,利用全世界的人才来解决一个大问题。

图1-16

Kaggle这个比赛非常适合学生参加,因为一般在校学生可能拿不到很多数据。此外,Kaggle不仅对参赛者有算法能力上的要求,而且能锻炼参赛者对数据的“嗅觉”,使参赛者从数据本身问题出发来寻求解决方案。

“天池”是阿里搭建的一个大数据竞赛平台,图1-17展示的是它的官方网站页面。

图1-17

这个平台上一般会有一些穿衣搭配挑战、新浪微博互动预测、用户重复购买行为预测等赛事。平台提供的“赛题攻略”对新手入门有很大的引领作用。如果在一些项目上取得不错的成绩,还有丰厚的奖金,以及进入阿里巴巴的工作机会。

近年来,国内涌现出一批做人工智能的公司,很多原有的互联网公司也开始试水人工智能方向。虽然不可否认人工智能领域还是有一些泡沫存在,但是这个技术领域的井喷点确实来临了,确切地说是科研成果的井喷点。我们要做的就是加快科研成果向产品的转化速度。

国内的腾讯、阿里、百度三大公司在人工智能研究和商业化探索方面走得最早。腾讯优图是腾讯的人工智能开放平台;阿里云ET是阿里巴巴的智能机器人;百度主要在无人驾驶汽车和手机百度客户端的基于“自然语言的人机交互界面”的“度秘”上发力。这些都是人工智能在产业界应用的探索。此外,还有搜狗、云从科技、商汤科技、昆仑万维、格灵深瞳等公司,都在人工智能领域纷纷发力。

下面我们就来介绍国内几家比较有特色的做人工智能的公司。

(1)陌上花科技:衣+(dress+)。提供图像识别、图像搜索、物体追踪检测、图片自动化标记、图像视频智能分析、边看边买、人脸识别和分析等服务。其官方网站的首页如图1-18所示。

图1-18

(2)旷视科技:Face++。以人脸识别精度著称,并且提供人工智能开放平台。目前已经和美图秀秀、魔漫相机合作,实现美白、瘦脸、五官美化等美颜效果。此外,还和支付宝合作,未来有望推出“Smile to Pay”。其官方网站首页如图1-19所示。

图1-19

(3)科大讯飞。主要提供语音识别解决方案,以及语音合成、语言云(分词、词性标注、命名实体识别、依存句法分析、语义角色标注等)等语音扩展服务,有完善的SDK及多种语言实现的API。其官方网站首页如图1-20所示。

图1-20

(4)地平线。嵌入式人工智能的领导者,致力于提供高性能、低功耗、低成本、完整开放的嵌入式人工智能解决方案。其官方网站首页如图1-21所示。

图1-21

本章主要介绍了人工智能、机器学习、深度学习的关系,以及深度学习的学习步骤,分析了这个领域的相关人群,以及这个领域的重要赛事。然后,全面介绍了TensorFlow的作用、特性,并介绍了国内做人工智能的公司,讲述了目前在产业界进行的探索,和提供给开发者的一些基础平台。

[1] 参考百度百科 “图灵测试”。

[2] 参考百度百科 “人工智能”。

[3] 参考威斯康星大学麦迪逊分校一个ppt的第14页:http://pages.cs.wisc.edu/~jerryzhu/pub/sslicml07.pdf。

[4] 这里,一些人担心人工智能超越人类还会产生哲学和伦理问题。我认为做这种讨论还为时尚早,严谨的数据基础是要突破的主要方向。

[5] 推荐读者阅读李航老师的《统计学习方法》,很快就能入门。

[6] https://github.com/tensorflow/models/tree/master/inception

[7]https://github.com/zer0n/deepframeworks

[8] 参考百度百科 “异构数据库”。

[9] http://karpathy.github.io/2015/05/21/rnn-effectiveness/

[10] https://www.tensorflow.org/

[11] http://ipython.org/notebook.html

[12] 参考论文《Deep Leaning with Dynamic Computation Graphs》:https://openreview.net/pdf?id=ryrGawqex。

[13] 参考论文《ImageNet Classification with Deep Convolutional Neural Networks》:http://www.cs.toronto.edu/~fritz/absps/ imagenet.pdf。

[14] 数据出自论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》:https://arxiv.org/abs/1502.01852。

[15] 数据出自论文《Deep Residual Learning for Image Recognition》:https://arxiv.org/abs/1512.03385。


本章的主要任务就是准备TensorFlow环境。与安装其他软件(如Caffe)相比,TensorFlow极容易安装,环境部署极为轻松。

接下来我们先介绍下载TensorFlow代码仓库,然后介绍基于pip的安装方式、基于Java的安装方式以及使用Bazel的源代码编译安装方式。

2017年5月,TensorFlow已经开放到1.1.0-rc2版本,支持多种操作系统。接下来我们就用 1.1.0 版本来介绍TensorFlow的环境准备过程。

我们从GitHub代码仓库中将1.1.0版本的TensorFlow源代码下载下来,在Tags中选择1.1.0版本将跳转到1.1.0版本的代码仓库[1],如图2-1所示。

图2-1

根据图2-2下载解压之后即得到源代码,我们将其保存在本地目录tensorflow-1.1.0中。

图2-2

pip是Python的包管理工具,主要用于PyPI[2](Python Packet Index)上的包。命令简洁方便,包种类丰富,社区完善,并且拥有轻松升级/降级包的能力。

Mac OS是本书所讲内容依赖的环境,机器配置如图2-3所示。

图2-3

首先需要依赖Python环境,以及pip命令。这在Mac和Linux系统中一般都有。这里使用的Python版本是2.7.12。TensorFlow 1.1.0版本兼容Python 2和Python 3,读者可以用适合自己的Python环境。

1.安装virtualenv

virtualenv是Python的沙箱工具,用于创建独立的Python环境。我们毕竟是在自己机器上做实验,为了不来回修改各种环境变量,这里用virtualenv为TensorFlow创建一套“隔离”的Python运行环境。

首先,用pip安装virtualenv:

$ pip install virtualenv --upgrade

安装好后创建一个工作目录,这里直接在home下创建了一个tensorflow文件夹:

$ virtualenv --system-site-packages ~/tensorflow

然后进入该目录,激活沙箱:

$ cd ~/tensorflow
$ source bin/activate 
(tensorflow) $

2.在virtualenv里安装TensorFlow

进入沙箱后,执行下面的命令来安装TensorFlow:

(tensorflow) $ pip install tensorflow==1.1.0

默认安装所需的依赖,直至安装成功。

3.运行TensorFlow

照着官方文档录入一个简单例子:

(tensorflow) $ python
Python 2.7.12 (default, Oct 11 2016, 05:16:02)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import tensorflow as tf
>>> hello = tf.constant('Hello,TensorFlow!')
>>> sess = tf.Session()
>>> print sess.run(hello)
Hello, TensorFlow!

恭喜,TensorFlow环境已经安装成功了。

注意,每次需要运行TensorFlow程序时,都需要进入tensorflow目录,然后执行source bin/activate命令来激活沙箱。

使用Ubuntu/Linux的读者可以照着Mac OS的环境准备,先安装virtualenv的沙盒环境,再用pip安装TensorFlow软件包。

TensorFlow的Ubuntu/Linux安装分为CPU版本和GPU版本,下面来分别介绍。

(1)安装仅支持CPU的版本,直接安装如下:

$ pip install tensorflow==1.1.0

(2)安装支持GPU的版本的前提是已经安装了CUDA SDK,直接使用下面的命令:

$ pip install tensorflow-gpu==1.1.0

TensorFlow 1.1.0版本支持Windows 7、Windows 10和Server 2016。因为使用Windows PowerShell代替CMD,所以下面的命令均在PowerShell下执行。这里使用的是Windows 10系统,使用微软小娜呼唤出PowerShell,如图2-4所示。

图2-4

1.安装Python

TensorFlow在Windows上只支持64位Python 3.5.x,可以通过Python Releases for Windows[3]或Python 3.5 from Anaconda下载并安装Python 3.5.2(注意选择正确的操作系统)。下载后,安装界面如图2-5所示,注意勾选“Add Python 3.5 to PATH”。

图2-5

选择Customize installation(自定义安装),进入下一步。如图2-6所示,可以看出Python包自带pip命令。

图2-6

然后,等待安装完成,再到PowerShell中输入python,看到进入终端的命令提示则代表python安装成功。在“开始”->“所有程序”下也可以找到Python终端。安装成功后的界面如图2-7所示。

图2-7

TensorFlow的Windows安装也分为CPU版本和GPU版本,下面来分别介绍。

(1)CPU版本安装。在PowerShell中执行如下命令,默认安装TensorFlow 1.1.0版本及相关依赖。

C:\> pip install tensorflow==1.1.0

安装完成后如图2-8所示。

图2-8

(2)GPU版本安装。如果读者的机器支持安装GPU版本,请先安装如下两个驱动:CUDA[4]和CuDNN[5](后者需要注册NVIDIA用户,并加入CuDNN开发组,然后填若干问卷,才可以下载)。选择下载版本时要注意与CUDA版本匹配。解压后保存至CUDA的安装目录下。然后,安装GPU版本,安装命令如下:

C:\> pip install tensorflow-gpu==1.1.0

2.运行TensorFlow

在微软小娜中,搜索“python”,直接模糊匹配,调出命令窗口,输入测试代码:

>>>import tensorflow as tf  
>>>sess = tf.Session()  
>>>a = tf.constant(10)  
>>>b = tf.constant(22)  
>>>print(sess.run(a + b))  
32

正确输出结果32,安装完毕。

基于Java的方式安装,可以参照TensorFlow官方GitHub的安装方法[6]

我们需要下载JAR(Java ARchive)libtensorflow-1.1.0-rc2.jar和运行TensorFlow需要的本地库。这些都可以直接从官方GitHub上下载,如图2-9所示。

图2-9

这里仍然用Mac OS X系统,下载后的文件如下:

libtensorflow-1.1.0-rc2.jar
libtensorflow_jni-cpu-darwin-x86_64-1.1.0-rc2.tar.gz

对libtensorflow_jni-cpu-darwin-x86_64-1.1.0-rc2.tar.gz进行解压,解压到当前目录jni。

tar zxvf libtensorflow_jni-cpu-darwin-x86_64-1.1.0-rc2.tar.gz -C ./jni

这样就完成了TensorFlow的Java安装。下面我们写一个例子来测试一下,看能否正确输出TensorFlow的版本。将下面代码写入文件,命名为MyClass.java。

import org.tensorflow.TensorFlow;

public class MyClass {
  public static void main(String[] args) {
    System.out.println("I'm using TensorFlow version: " +  TensorFlow.version());
  }
}

然后进行编译:

javac -cp libtensorflow-1.1.0-rc2.jar MyClass.java

最后执行,成功输出所采用的TensorFlow版本,如图2-10所示。

图2-10

从源代码编译安装,需要使用Bazel编译工具。我们先安装Bazel工具。在需要依赖的JDK 8配好之后,在Mac笔记本上直接执行下面命令,安装版本是0.4.4:

brew install bazel

其他操作系统(如Ubuntu)的计算机对Bazel的安装,可以采用apt-get等方式。

先进入tensorflow-1.1.0的源代码目录,运行./configure脚本会出现所采用的Python路径、是否用HDFS、是否用Google Cloud Platform等选项,读者可以根据自己的需要进行配置,或者直接按“回车”采用默认配置。

下面我们演示使用CPU版本的编译。具体如下:

➜  tensorflow-1.1.0 ./configure
Please specify the location of python.[Default is /usr/local/bin/python]:
Please specify optimization flags to use during compilation [Default is -march=native]:
Do you wish to use jemalloc as the malloc implementation? (Linux only) [Y/n]
jemalloc enabled on Linux
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N]
No Google Cloud Platform support will be enabled for TensorFlow
Do you wish to build TensorFlow with Hadoop File System support? [y/N]
No Hadoop File System support will be enabled for TensorFlow
Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N]
No XLA support will be enabled for TensorFlow
Found possible Python library paths:
  /usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages
  /Library/Python/2.7/site-packages
Please input the desired Python library path to use. Default is [/usr/local/Cellar/ python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages]

Using python library path: /usr/local/Cellar/python/2.7.12_2/Frameworks/Python. framework/Versions/2.7/lib/python2.7/site-packages
Do you wish to build TensorFlow with OpenCL support? [y/N]
No OpenCL support will be enabled for TensorFlow
Do you wish to build TensorFlow with CUDA support? [y/N]
No CUDA support will be enabled for TensorFlow
Configuration finished

随后,我们执行bazel编译命令,因为编译时需要耗费大量的内存,加入--local_resources 2048,4,1.0来限制内存大小。具体如下:

bazel build --local_resources 2048,4,1.0 -c opt //tensorflow/tools/pip_package:build_ pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

然后进入/tmp/tensorflow_pkg,可以看到生成的文件tensorflow-1.1.0-cp27-cp27m-macosx_10_12_intel.whl,直接安装如下:

pip install /tmp/tensorflow_pkg/tensorflow-1.1.0-cp27-cp27m-macosx_10_12_intel.whl

使用GPU版本的编译需要配置中选择使用CUDA,然后填写对应的CUDA SDK版本等,其他步骤均相同。

TensorFlow在运行中需要做一些矩阵运算,时常会用到一些第三方模块,此外,在处理音频、自然语言时需要也要用到一些模块,建议一并安装好。本书“实战篇”中会大量用到这些扩展。

下面我们就来简单介绍TensorFlow依赖的一些模块。

numpy是用来存储和处理大型矩阵的科学计算包,比Python自身的嵌套列表结构(nested list structure)要高效的多。它包括:

numpy模块的安装方法如下:

pip install numpy --upgrade

matplotlib是Python最著名的绘图库,它提供了一整套和MATLAB相似的命令API,十分适合交互式地进行制图。用它可以画出美丽的线图、散点图、等高线图、条形图、柱状图、3D图等,而且还可以方便地将它作为绘图控件,嵌入GUI应用程序中。在后面的实例中,需要可视化地展现训练结果或者中间的特征映射,就很方便。

matplotlib模块的安装方法如下:

pip install matplotlib --upgrade

jupyter notebook是Ipython的升级版,能够在浏览器中创建和共享代码、方程、说明文档。界面相当友好,功能也很强大。其实,jupyter实际就是一个基于Tornado框架的Web应用,使用MQ进行消息管理。

jupyter模块的安装方法如下:

pip install jupyter --upgrade

打开jupyter notebook:

jupyter notebook

出现如下显示:

[W 06:02:13.434 NotebookApp] Widgets are unavailable.Please install widgetsnbextension or ipywidgets 4.0
[I 06:02:13.454 NotebookApp] Serving notebooks from local directory: /Users/baidu/ Downloads/tensorflow-0.12/tensorflow
[I 06:02:13.454 NotebookApp] 0 active kernels
[I 06:02:13.454 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/
[I 06:02:13.454 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

浏览器自动打开,启动成功,界面如图 2-11 所示。其中,在 tensorflow-1.1.0/tensorflow/ examples/udacity下有许多扩展名为.ipynb的示例文件,读者可以自行在浏览器中打开和学习。

图2-11

scikit-image[7]有一组图像处理的算法,可以使过滤一张图片变得很简单,非常适合用于对图像的预处理。

scikit-image模块的安装方法如下:

pip install scikit-image --upgrade

librosa是用Python进行音频特征提取的第三方库,有很多方式可以提取音频特征。

librosa模块的安装如下:

pip install librosa --upgrade

nltk[8]模块中包含着大量的语料库,可以很方便地完成很多自然语言处理的任务,包括分词、词性标注、命名实体识别(NER)及句法分析。

nltk的安装方法:

pip install nltk --upgrade

安装完成后,需要导入nltk工具包,下载nltk数据源,如下:

>>> import nltk  
>>> nltk.download()

Keras是第一个被添加到TensorFlow核心中的高级别框架,成为Tensorflow的默认API。第7章中会详细讲解Keras的使用。

keras模块的安装方法如下:

pip install keras --upgrade

TFLearn是另一个支持TensorFlow的第三方框架,第7章中会详细讲解TFLearn的使用。

tflearn模块的安装方法如下:

pip install git+https://github.com/tflearn/tflearn.git

本章介绍了TensorFlow环境的准备,分别讲解了使用pip命令、Java JAR文件、用Bazel工具对源代码进行编译这3种安装方式,以及在pip安装方式下,在Mac、Ubuntu/Linux、Windows系统上如何安装CPU版本和GPU版本的TensorFlow。

最后,讲了一些常用扩展的作用和安装,这些扩展在本书的“实战篇”中会用到。

[1] https://github.com/tensorflow/tensorflow/tree/v1.1.0

[2] https://pypi.python.org/pypi

[3] https://www.python.org/downloads/windows/

[4] https://developer.nvidia.com/cuda-downloads

[5] https://developer.nvidia.com/cudnn

[6] https://github.com/tensorflow/tensorflow/tree/master/tensorflow/java

[7] http://scikit-image.org/

[8] http://www.nltk.org/


相关图书

ChatGPT原理与应用开发
ChatGPT原理与应用开发
深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
深度学习:从基础到实践(上、下册)
深度学习:从基础到实践(上、下册)
动手学深度学习(PyTorch版)
动手学深度学习(PyTorch版)
深度学习与医学图像处理
深度学习与医学图像处理
深度强化学习实战:用OpenAI Gym构建智能体
深度强化学习实战:用OpenAI Gym构建智能体

相关文章

相关课程