TensorFlow移动端机器学习实战(txt+pdf+epub+mobi电子书下载)

作者:王众磊,陈海波

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

TensorFlow移动端机器学习实战

TensorFlow移动端机器学习实战试读:

前言

2018年,我有很长一段时间在中国和美国两地跑,同时在国内工作和生活了比较长的一段时间,这是我近二十年来第一次和国内的开发者一起长时间工作。在享受各种美食之外,对国内的开发、产品和管理有了全新的了解和认识。

说起写书的起源,我本来的想法只是写一点可以作为国内工程师培训教材的东西。2018年初,TensorFlow作为一个技术热点,逐渐普及到机器学习应用开发的各个方面,但是对于TensorFlow在移动端的开发和应用还处于初始阶段。我当时也刚刚结束一个TensorFlow项目,想把这些经验和想法沉淀一下。于是我就把以前写的笔记和日志重新整理,添加一些内容并修改了文字,基本形成了一个原始版本。

后来,遇到博文视点的南海宝编辑,通过商谈,出版社欣然同意把这些资料整理出书。我的笔记和日志的内容很多和代码紧密相关,其中很多内容后来演变成了文档,我觉得这对初学者和有经验的开发者都是一个很好的参考,至少可以提供另外一个视角,让开发者多方面了解TensorFlow。所以,我就开始写作,前后花费了近两年的时间。

我是一边写作一边工作的,在这个过程中很快就遇到了两个很大的挑战。

第一是文字。我的笔记都是英文的,要把这些转换成中文,我借助了谷歌翻译,虽然翻译后的文字有很多需要修改,但至少省下了不少打字的时间。另外,就是专有术语的翻译,由于我对中文的专业术语不熟悉,所以即使简单的术语也要斟酌确定,这也花费了一些时间。如果读者在文字中发现一些奇怪的说法,还请见谅,我和编辑虽然尽了最大的努力,可能还是会有很多遗漏。

第二是重新认识和了解了国内开发的方方面面。我在美国和国内的开发者也有不少接触,我想在两边工作应该不会有什么差别,可实际工作起来还是有很多不同和挑战,感触颇深。首先是技术层面。开源的理念和软件在国内渗透到各个方面,几乎所有互联网公司都是从使用开源软件开始搭建自己的产品。由于谷歌在开源社区的贡献和影响力,国内普遍对谷歌的好感度很高,我也同享了这个荣耀。而且,很多公司和开发者也把对开源社区做出贡献看作责任和荣耀,这是一个很好的趋势,中国很快会发展出自己的开源生态和社区。

关于开发环境和工程师文化,我想提一下两边对新员工培训的区别。在国内对新员工的培训中,职业道德培训和公司文化的培训占了很大一部分。而在硅谷,至少像谷歌、脸书这些公司,培训中技术培训占了很大一部分,基本是一周的培训后,员工就要进行实际的工作,而国内很多公司的新员工第二周才开始技术工作。这里我能充分感受到中美公司之间的差别。

另外是开发管理方法,由于管理方法的不同,实际的工作中要做相应的改变。比如国内对开发和产品的进度的管理是非常严格的。但是,这种严格大都体现在层级的汇报关系上,而不是对技术细节的掌控和指导上。谷歌的工程师会经常以代码的提交作为一个工程开始和结束的标志,这在国内公司很少见到。

我希望把这些经验、想法和体会能或多或少体现在这本书里。比如,使用Markdown写文档,能使写文档变成一件不是很烦琐的事,可以让作者更专注于内容的写作,而不是花费太多时间在操作编辑器上。本书就是全部用Markdown写作完成,再转换成Word文档的。比如,使用Bazel编译,需要对代码的依赖有清晰的定义。可能很多工程师不会特别在意这点,但是通过它,工程师可以非常清楚地了解代码重用和引用的状况,避免随意的代码重用,并提高代码的质量。我希望通过这些在书中给读者传达一些不同的开发经验。

总之,我会把这本书作为2018年工作和生活的一个纪念。看到书中的各个章节,我就可以联想起写书时发生的许多事。但是,真的由于时间和我自己的能力非常有限,书中一定会有很多错误和瑕疵,还望读者能宽容和谅解。

最后,要感谢我的家人能支持和陪伴我度过2018年,我和我的母亲一起度过了2018年春节,是近20年来在国内度过的第一个春节。还要感谢我的妻子,她非常支持我,并帮助我写完这本书。还有我的两个女儿,总是能给我带来无尽的快乐,还要感谢深兰科技的创始人陈海波先生和首席战略官王博士,两位帮助我完成这本书,并提出了很多意见。

另外,感谢博文视点给我这个机会出版这本书,希望通过这本书能结识更多的开发者。还要感谢南海宝编辑在本书写作和出版过程中给予的指导和鼓励。读者服务第1章 机器学习和TensorFlow简述1.1 机器学习和TensorFlow的历史及发展现状1.1.1 人工智能和机器学习

我们先来看一下人工智能(Artificial Intelligence)、机器学习(Machine Learning)、深度学习(Deep Learning)的定义。

人工智能(英文缩写为AI)也称机器智能,指由人制造出来的机器所表现出来的智能。

下面是机器学习的英文定义:

Machine learning is a core, transformative way by which we're rethinking how we're doing everything.

其中文含义是:机器学习是一种核心的、变革性的方式,它正在改变我们思考的方式。人工智能(AI)是使事物变得聪明的科学,机器学习是一种开发人工智能的技术。

深度学习(Deep Learning)是机器学习的分支,是一种以人工神经网络为架构,对数据进行表征学习的算法。人工智能的分类如图1-1所示。图1-1

人工智能按产业分类大致可以分为下面几类:机器学习、自然语言处理、机器人技术和视觉等。在机器学习里深度学习是最近兴起也是比较热门的研究方面。自然语言处理和视觉的技术发展近几年来越来越成熟,有的技术已被大规模应用。

深度学习带来机器学习的革命。我们看到“深度学习”这个词在搜索中的热度近年来在快速攀升。arXiv上的机器学习论文数量也在急剧增长。

深度学习(Deep Learning)是一种模仿人脑结构的机器学习。神经元是专注于某个特定方向的刺激(例如图像中对象的形状、颜色和透明度),通过将多个神经元分层组合在一起而完成模拟人脑的方法。分层可以模拟大脑运算,随着层数的增加,计算的功率和时间也会增加,进而提高计算的准确性。

下面来看一个图片分类的例子:给出一张图片,让机器识别这张图是一只猫还是一条狗。这个机器由多层的神经网络结构组成,该结构中有很多参数,经过大量训练之后,机器能识别出这张图是一只猫。如图1-2(图片来源https://becominghuman.ai/building-an-image-classifierusing-deep-learning-in-python-totally-from-a-beginners-perspective-be8dbaf22dd8)所示展示了这个深度学习的过程。

深度学习并不是全新的事物,但为什么在最近几年有了巨大突破?其中一个重要的原因是,人类发明了一个基于深度神经网络的解决方案。

在20世纪五六十年代,神经网络的研究就已经出现了,在马文·明斯基和西摩·帕尔特(1969)发表了一项关于机器学习的研究以后,神经网络的研究就停滞不前了。图1-2

他们发现了神经网络的两个关键问题点。一个问题是,基本感知机无法处理异或回路;另一个问题是,计算机没有足够的能力来处理大型神经网络所需要的计算时间。在计算机具有更强的计算能力之前,神经网络的研究进展缓慢。但是随着计算能力的增加,深度学习解决问题的精度已经超过其他机器学习方法。

以图片识别为例,2011年,机器识别的错误率是26%,而人工识别的错误率只有5%,所以这个时候的机器识别离实用有非常大的距离。到2016年,机器识别的错误率已经减少到3%左右,深度学习在该领域呈现出非常惊人的能力,这也是深度学习在图像识别领域吸引产业界大量关注的原因。

组成机器学习的三大要素是:数据、计算力和算法(Data、Computation and Algorithm)。1.1.2 TensorFlow

接下来看一下最近非常流行的,也是本书主要讲解的机器学习框架TensorFlow。

1.TensorFlow的起源和发展历史

TensorFlow是一个开源软件库,用于完成各种感知和语言理解任务的机器学习。TensorFlow被50个团队用于研究和开发许多谷歌商业产品,如语音识别、Gmail、谷歌相册和搜索,其中许多产品曾使用过其前任软件DistBelief。TensorFlow最初由谷歌大脑团队开发,用于谷歌的研究和产品开发,于2015年11月9日在Apache 2.0开源许可下发布。

2010年,谷歌大脑创建DistBelief作为第一代专有机器学习系统。谷歌的50个团队在谷歌和其他Alphabet公司的商业产品中部署了DistBelief的深度学习神经网络,包括谷歌搜索、谷歌语音搜索、广告、谷歌相册、谷歌地图、谷歌街景、谷歌翻译和YouTube。

谷歌安排计算机科学家如Geoffrey Hinton和Jeff Dean,简化和重构了DistBelief的代码库,使其变成一个更快、更健壮的应用级代码库,形成了TensorFlow。

2009年,Hinton领导的研究小组通过在广义反向传播方面的科学突破,极大地提高了神经网络的准确性,使得神经网络的生成成为可能。值得注意的是,这个科学突破使得谷歌语音识别软件中的错误数减少了至少25%。如图1-3(横坐标为年份,纵坐标为谷歌搜索的人工智能和机器学习关键字数量)所示,2013年以后,人工智能和机器学习的关键词搜索数量有了极大增长。图1-3

TensorFlow是谷歌大脑的第二代机器学习系统。从0.8.0版本(发布于2016年4月)开始支持本地的分布式运行。从0.9.0版本(发布于2016年6月)开始支持iOS。从0.12.0版本(发布于2016年12月)开始支持Windows系统。该移植代码主要是由微软贡献的。

TensorFlow 1.0.0发布于2017年2月11日。虽然推理的实现运行在单台设备上,但TensorFlow也可以运行在多个CPU和GPU(包括可选的CUDA扩展和图形处理器通用计算的SYCL扩展)上。TensorFlow可用于64位的Linux、macOS、Windows,以及移动计算平台(Android和iOS)。

TensorFlow的计算使用有状态的数据流图来表示。TensorFlow的名字来源于这类神经网络对多维数组执行的操作。这些多维数组被称为“张量”。2016年6月,Jeff Dean称:“在GitHub上有1500个库提到了TensorFlow,其中只有5个来自谷歌。”

1.12.0版本发布于2018年10月,TensorFlow 2.0的预览版在2019年3月的TensorFlow开发者大会上发布。

2.TensorFlow 的主要特性

TensorFlow开源以来已有500多个Contributor及11000多个Commit。利用TensorFlow平台在产品开发环境下进行深度学习的公司有ARM、谷歌、UBER、DeepMind、京东等。谷歌把TensorFlow应用到很多内部项目,如谷歌语音识别、Gmail邮箱、谷歌图片搜索等。

TensorFlow有以下几个主要特性。

· 使用灵活:TensorFlow是一个灵活的神经网络平台,采用图计算模型,支持High-Level的API,支持Python、C++、Go、Java接口。

· 跨平台:TensorFlow支持CPU和GPU的运算,支持台式机、服务器、移动平台的计算。并从0.12版本开始支持Windows平台。

· 产品化:TensorFlow支持从研究团队发布模型到产品开发团队验证模型的全过程,构建起模型研究到产品开发实践的桥梁。

· 高性能:在TensorFlow中采用了多线程、队列技术及分布式训练模型,可在多CPU、多GPU的环境下对模型进行分布式训练。1.1.3 TensorFlow Mobile

其实TensorFlow Mobile并不是一个正式的名称,它只是TensorFlow对移动端设备和IoT设备的支持的总称,它可以直接移植到Android、iOS和树莓派等系统上。1.1.4 TensorFlow Lite

2017年5月谷歌宣布从Android Oreo(API level 26)开始,提供一个专用于Android开发的软件栈TensorFlow Lite。按照官方的定义,TensorFlow Lite是为移动设备和嵌入式设备设计的机器学习软件框架,也是在移动和嵌入式设备上运行机器学习模型的官方解决方案。它支持在Android、iOS和其他操作系统上的低延迟和在较小二进制文件设备上的机器学习推理。

TensorFlow Lite在2017年10月发布了第一个Preview版本,在官方网页https://developers.googleblog.com/2017/11/announcing-tensorflow-lite.html上有如下说明:

Lightweight Enables inference of on-device machine learning models with a small binary size and fast initialization/startup.

Cross-platform A runtime designed to run on many different platforms, starting with Android and iOS.

Fast Optimized for mobile devices, including dramatically improved model loading times, and supporting hardware acceleration.

通过该段说明,我们可以将TensorFlow Lite的特性总结为如下三点:(1)轻量级:使用小的二进制文件和快速初始化(启动),可以在设备端训练机器学习模型。(2)跨平台:可以在Android和iOS的许多不同平台上运行。(3)快速:针对移动设备进行优化,包括显著改进的模型加载时间和支持硬件加速。

如图1-4(图片来源https://techcrunch.com/2017/05/17/googles-tensorflow-lite-brings-machinelearning-to-android-devices)所示是TensorFlow Lite在谷歌 I/O发布时的情景。图1-41.2 在移动设备上运行机器学习的应用

为什么要在移动端和IoT设备上进行机器学习?我们先来讨论下面几个问题:

· 为什么要在移动端上进行机器学习?

· 移动端上的机器学习要解决什么问题?

· 移动端机器学习面临的挑战是什么?1.2.1 生态和现状

为什么要在移动设备和嵌入式设备上进行机器学习呢?在我国互联网的发展过程中,PC互联网已经日趋饱和,移动互联网却呈现井喷式发展。中国互联网络信息中心发布的2018年互联网发展报告数据显示,截至2018年6月,中国手机网民超过8.2亿,占网民总数的98.35%。随着移动终端价格的下降及WiFi的广泛使用,移动网民的数量呈现爆发趋势。

被称为“互联网女皇”的玛丽·米克尔在《2018年互联网趋势报告》里说,中国的移动互联网行业在2018年迎来新的增长,中国网民人数已经超过7.53亿,占总人口的一半以上。移动数据流量消费同比上涨了162%。

在智能手机市场,Android和iOS是占比最大的两种操作系统,在全球已经激活的31亿智能手机中的占比超过95%,而Android在两者之中又占据了绝对优势,截至2017年11月,Android的市场份额为75.9%,智能手机总计23亿部。中国和印度是全球最大的两个Android智能手机市场,占比接近一半。而根据Newzoo发布的《全球手机市场报告》,2018年将再有3亿部新手机被激活,Android手机的优势将进一步扩大。

Android作为操作系统,它的生态包括各种类型的设备和仪器,从汽车、穿戴设备、VR/AR设备到IoT设备,构成了一个庞大的系统,如图1-5(图片来源https://www.itproportal.com/features/iot-what-businesses-need-to-know/)所示。

在世界物联网博览会发布的《2017—2018年中国物联网发展年度报告》中显示,2017年全球物联网设备数量强劲增长,达到84亿台,首次超过人口数量。全球物联网市场有望在十年内实现大规模普及,到2025年市场规模或将增长至3.9万亿~11.1万亿美元。

物联网发展呈现一些新的特点和趋势:一是全球物联网设备数量爆发式增长,物联网解决方案逐渐成熟;二是我国物联网市场规模突破万亿元,物联网云平台成为竞争核心领域;三是物联网细分领域热度出现分化,技术演进驱动应用产品向智能、便捷、低功耗方向发展。在IoT上运行的操作系统和应用,都要适用于物联网的特性。图1-51.2.2 从移动优先到人工智能优先

2017年,谷歌决定将公司战略从移动优先转变为人工智能优先。虽然谷歌近十年来主要以移动优先,但很明显调整意味着公司看到了人工智能和机器学习技术的巨大潜力。2019年,谷歌花了很大力气进行这种改变,并取得了显著的成果。

这里要说一下谷歌的CEO Sundar Pichai,这位可算作硅谷最成功的印度裔的高管,一开始加入谷歌的Chrome团队,担任Chrome的产品经理。Chrome是一款非常成功的产品,现在占据了浏览器市场超过65%的份额,也是很多用户包括笔者自己的默认浏览器。

当然,ChromeOS并不能算世界级的产品。虽然Chrome在谷歌内和其他世界级的产品相比并不是特别成功,但是它在教育领域及面向政府和企业的项目中或许会有令人瞩目的进展。有意思的是,很多一开始从事ChromeOS开发的工程师,后来开始谷歌IoT的研究,现在又在做新的操作系统的研究。

另外,谷歌在经历了几年移动优先之后,在2017年,Sundar Pichai正式在谷歌I/O上提出了“从移动优先到人工智能优先”的战略。这是在继ChormeOS与Android整合后的一个非常重要的决定。我们可以看到,这几年人工智能已经成为一个非常热门的投资领域。1.2.3 人工智能的发展

Jeff Dean在人工智能发展刚刚取得突破性进展的时候就意识到,谷歌可能无法提供足够的计算力来支持人工智能的发展。后来,谷歌启动了TPU项目,通过硬件加速为人工智能提供强有力的计算基础。这体现在云计算和数据中心的TPU POD集群的部署中,也体现在对Edge TPU的研发和对移动端及IoT设备的进一步支持上。谷歌很重视基础技术和基础项目的研究,并愿意长时间地进行研发。后面,我们会介绍硬件加速的进展。如图1-6(图片来源https://www.datacenterknowledge.com/machine-learning/you-can-now-rent-entire-ai-supercomputer-google-cloud)所示是谷歌配备TPU的数据中心的照片。图1-61.2.4 在移动设备上进行机器学习的难点和挑战

在移动设备上进行机器学习是非常困难和具有挑战性的,主要表现在以下几个方面:

· 移动设备的CPU功率和电池电量非常有限。

· 设备和云之间的连接非常有限。

· 避免设备和云之间的大数据交换。

· 解决设备和云之间的遗留问题。

· 保护用户的隐私数据。

随着移动设备变得越来越强大,我们将看到更多运行在移动设备上的机器学习应用程序。

边缘计算是一个新技术。谷歌在2016年发布TPU(张量处理单元),并在其数据中心大量使用TPU。谷歌将TPU在数据中心的使用范围扩展到不同的域,将来我们或许可以运行完全支持AI的移动设备。1.2.5 TPU

机器学习的发展一方面依赖软件和算法的提高,另一方面也离不开硬件的进步。2016年5月,谷歌发布TPU,一个专为机器学习和TensorFlow定制的ASIC。TPU是一个可编程的AI加速器,提供高吞吐量的低精度计算(如8位),用于使用或运行模型而不是训练模型。谷歌在数据中心运行TPU长达一年多,发现TPU对机器学习提供一个数量级更优的每瓦特性能。

2017年5月,谷歌发布第二代TPU,此款TPU在谷歌的Compute Engine中是可用的。第二代TPU提供最高180 teraflops的性能,在组装成64个TPU的集群时提供最高11.5 petaflops的性能。如图1-7(图片来源https://blog.hackster.io/announcing-the-new-aiy-edge-tpu-boards-98f510231591)和图1-8(图片来源http://hi.sevahi.com/google-unveils-tiny-new-ai-chips-for-ondevice-machine-learning/)所示分别是谷歌对外公布的TPU和Edge TPU的图片。图1-7图1-81.3 机器学习框架

本节将介绍TensorFlow Mobile、TensorFlow Lite等工业界现有的机器学习框架,以及其他业界广泛使用的机器学习框架。另外,本节还将介绍对应移动设备和IoT设备的开发现状。

TensorFlow具有不同的构建方式,并从一开始就支持不同的平台,例如Android、iOS和树莓派。值得一提的是,谷歌的物联网团队早期就是在树莓派上构建及运行TensorFlow的。

在本书中,我们主要讨论和描述如何在安卓设备上构建TensorFlow。

TensorFlow支持TensorFlow Mobile和TensorFlow Lite两个平台。本节将详细讨论两者的使用方法和区别,以及未来的发展趋势。

TensorFlow Mobile有更好的支持全张量流的函数,我们可以在移动设备上运行张量流,但是TensorFlow Mobile并没有针对移动设备进行高度优化。

TensorFlow Lite针对移动设备进行了高度优化,但作为一个新框架,它只具有有限的支持张量流功能。1.3.1 CAFFE2

CAFFE(Convolutional Architecture for Fast Feature Embedding)是一个开源的深度学习框架,最初是在加州大学伯克利分校开发的。CAFFE是用C++编写的,支持Python接口。

贾清扬博士在加州大学伯克利分校攻读博士学位期间创建了CAFFE项目。现在该项目有很多贡献者,并在GitHub上进行托管。贾清扬博士现在是Facebook的人工智能工程总监,CAFFE的服务框架也因此多多少少带上了Facebook的印记。

2017年4月,Facebook宣布了CAFFE2,其中包括Recurrent Neural Networks等新功能。2018年3月底,CAFFE2被合并到PyTorch。

CAFFE2有不短的历史,对移动和嵌入式设备的支持也比较好。所以,很多在移动端进行机器学习开发的人会首选CAFFE2。1.3.2 Android NNAPI

Android NNAPI(Neural Networks API)是一个Android C API,专门为在移动设备上对机器学习进行密集型运算而设计。NNAPI旨在为构建和训练神经网络的更高级机器学习框架(例如TensorFlow Lite、CAFFE2 或其他)提供一个基础的功能层。API适用于运行Android 8.1(API级别为27)或更高版本的所有设备。1.3.3 CoreML

在苹果发布的iOS11中,有一个新的软件框架叫作CoreML。使用CoreML,可以将经过训练的机器学习模型集成到应用中。CoreML是自然语言处理专业领域的框架和功能的基础。CoreML支持用于图像分析的Vision、用于自然语言处理的Foundation,以及用于评估学习决策树的GameplayKit。

CoreML本身建立在低级原语之上,如Accelerate、BNNS及Metal Performance Shaders。CoreML针对器件内的性能进行了优化,可最大限度地减少内存占用和功耗。在设备上运行可确保用户数据的隐私性,并确保在网络连接不可用时,应用程序仍可正常运行并做出响应。想要了解更多的信息可以在苹果的开发者网页上进行查看。

以上苹果的这些描述是非常有意思的,这里提到了机器学习的特定技术,比如视觉、自然语音等,但是没有特别提到机器学习或人工智能,是一段比较严谨的描述。

随着人工智能和机器学习的发展,现在可选择的机器学习框架越来越多。比如由亚马逊、微软和英特尔共同开发现已成为Apache开源项目的MXNet,由NVIDIA开发的可以实现硬件加速的TensorRT,由阿里巴巴开源的深度学习框架X-Deep Learning和机器学习平台PAI,以及由百度开源的深度学习框架PaddlePaddle。这还不包括一些有着更长历史的机器学习框架,以及一些原生的计算框架。

作为普通开发者,在选择上会有一些难度。但是,由于机器学习和人工智能的复杂性,我们也看到了一些融合的趋势。比如,新的学习框架和老的学习框架的无缝融合和集成,学习框架对于GPU、硬件和高计算的支持。开发者在选择框架的时候要考虑哪个框架适合自己,同时也要考虑这个框架的未来发展性。在Wiki里,有一个关于各种框架的比较分析,如图1-9所示。图1-9 机器学习框架的比较注:该图比较大,读者可到https://en.wikipedia.org/wiki/Comparison_of_deep_learning_software上查阅。1.3.4 树莓派(Raspberry Pi)

依据树莓派网站https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus的介绍,它们的最新产品是Raspberry Pi 3 Model B+。它配置有一个4核64bit的Cortex-A53处理器,主频1.4GHz。同时也支持无线网、蓝牙等。秉承一贯的风格,树莓派的开发板小巧同时又能提供相当的计算能力。树莓派被用作很多IoT或嵌入式开发的参照板。机器学习需要在这种计算能力、储存能力等都有限的平台上表现出优越的性能,才能在更广阔的范围内得到推广和应用。第2章 构建开发环境

这一章,我们将学习怎样构建TensorFlow的开发环境。在介绍构建TensorFlow特有的开发环境之前,我们还要介绍一些同类软件开发环境的构建方法。2.1 开发主机和设备的选择

许多开发人员使用Windows作为开发平台,但Android不支持Windows作为开发平台。多数谷歌工程师使用定制的Linux作为主要平台,因为使用相同的平台可以避免任何可能由平台引起的角落案例问题。建议开发者安装Ubuntu 16或使用macOS。熟悉Linux对于Android开发非常有帮助,因为Linux上的许多概念和命令工具都可以在Android上使用。

Android开发人员可以在AOSP(Android Open-Source Project,安卓开放源代码项目)中开发应用程序,但这种开发方式非常复杂。因此,大多数开发人员选择Android Studio作为开发平台。

在此,笔者鼓励开发人员使用基于AOSP开发标准的独立应用程序。很多OEM和ODM都是从AOSP开始开发定制的Android的,但是,随着开发规模和代码规模的不断增长,开发人员应该考虑将平台开发和应用程序开发分开。通过这种方式,应用程序开发将只依赖于平台SDK而非源代码,并且应用程序可以做更快的开发迭代、测试和部署。2.2 在网络代理环境下开发

在网络代理或防火墙后面进行开发,都是非常困难的。因为在国内,很多公司仍然使用Windows作为主要的开发平台,而且很多公司的IT部门对开源社区没有很好的支持。我们要逐一解决这些问题。对于代理人背后的开发者,开发人员必须正确设置GitHub.com等网站。

在网络代理环境下开发,会有很多事情需要处理。首先,需要正确设置代理、用户和密码,这种设置可能会分散到多个文件中,因此请尝试记下更改的内容及执行此操作的最佳方法。

接下来解决认证问题,即许多网站的识别用户功能。简单的方法可能是配置设置跳过或忽略身份验证,但大多数工具都有自己的设置,所以必须将它们分开配置。有些工具在内部会调用其他工具,在配置过程中需要确定哪个工具会出现问题。在开发过程中最坏的情况是:需要编写代码,重新构建工具或在工具中添加代理支持。为通过代理从Maven下载,笔者通过重建Git来支持OpenSSL和Hack Bazel。

在Ubuntu 16.04上,笔者对以下工具参数进行了设置:

· .bashrc

· apt

· CNTLM

· git

· curl

· wget

· Bazel

具体设置参数和内容如表2-1所示。表2-1 具体设置参数和内容2.3 集成开发环境IDE2.3.1 Android Studio

Android Studio是谷歌支持的官方IDE。

下载并安装Android Studio。Android Studio支持Gradle,但在2018年6月以前,3.1.2版本不支持Bazel 0.13。希望谷歌 Android Studio 团队和Blaze团队能够更好地同步并提供无缝支持,否则Android社区很难采用Bazel。2.3.2 Visual Studio Code

Visual Studio Code是由微软发布的开发集成环境。其官方网站上写道:Visual Studio Code是一个轻量级但功能强大的源代码编辑器,可在桌面上运行,可用于Windows、macOS和Linux。它支持JavaScript、TypeScript和Node.js等脚本,并且具有丰富的语言(如C ++、C#、Java、Python、PHP、Go)和运行时(如.NET和Unity)扩展生态系统。

Visual Studio Code的安装步骤非常简单。安装完毕后,根据需要继续安装Bazel扩展和其他语言的扩展。如图2-1所示为Bazel的扩展页面。图2-1 Bazel的扩展页面

开发人员也可以安装一些Android插件,图2-2展示了安装Bazel插件的相关信息。图2-2 安装Bazel插件

安装完相关插件后,Visual Studio Code应该正常工作,包括C++/Java/Python等语言支持功能和自动完成功能,图2-3为Visual Studio Code的编辑界面。图2-3 Visual Studio Code的编辑界面

不得不说,微软在支持开源社区方面做得确实很好,这引起了很多开发者的关注。至少,笔者在写这本书的时候,使用的IDE就是Visual Studio Code。2.3.3 其他IDE

除Visual Studio Code外,还有IntelliJ、Eclipse等多种工具供开发者选择使用, 开发者可根据个人习惯选择不同的工具。在过去很长一段时间内,Eclipse、Emacs和Vi占据了IDE的主流市场,随后过渡到IntelliJ,目前以Android Studio为主。还有另一个强大的基于云的IDE在谷歌中越来越受欢迎。2.4 构建工具Bazel

大多数开发人员使用Android Studio + Gradle + Maven作为他们的日常工具,这种配置已经足够了。不过,笔者强烈建议使用Bazel,它是谷歌内部工具的开源版本。Bazel具有很多重要的功能,最新版本是Bazel 0.22,与1.0正式发布版本非常接近。很多离开谷歌的工程师,仍会继续使用Bazel。由Facebook开发的Buck与Bazel的功能非常相似。许多初创公司使用的也是Bazel工具。

Bazel的构建方法很简单,在Linux上执行下面的命令就可以安装Bazel:

Android Studio也支持Bazel。在Android Studio上安装Bazel插件即可使用,安装Bazel插件的步骤如图2-4所示。图2-4 在Android Studio上安装Bazel插件

TensorFlow中支持Gradle、Make和iOS的构建,谷歌内部不支持Gradle,只是在开源的时候会对其进行测试。2.4.1 Bazel生成调试

生成调试命令为:2.4.2 Bazel Query命令

如果读者想找出tensorflow/python/saved_model和tensorflow/core/kernels:slice_op算子之间的关系,可以执行bazel query "somepath(tensorflow/python/saved_model, tensorflow/core/kernels:slice_op)",执行结果如下:

如果读者想找出//tensorflow/contrib/lite/java/demo/app/src/main:TfLiteCameraDemo和//tensorflow/contrib/lite/kernels:builtin_ops算子之间的依赖关系,可以执行bazel query"somepath(//tensorflow/contrib/lite/java/demo/app/src/main:TfLiteCameraDemo,//tensorflow/c ontrib/lite/kernels:builtin_ops)",执行结果如下:

除Android特有的设定外,我们还要做TensorFlow的标准设定,具体的步骤请参考网页https://docs.bazel.build/versions/master/user-manual.html。2.5 装载TensorFlow

TensorFlow的安装比较简单,官网上提供了详细的说明,具体内容请参阅TensorFlow的网上链接。

需要提醒的是,建议使用Virtualenv来安装TensorFlow,安装完TensorFlow和GPU(图形加速器)支持后,需要验证。

由于某些用户在安装TensorFlow GPU支持时会遇到问题,因此接下来将介绍如何安装GPU支持。

首先,开发者要在Developer Nvidia Website上注册。

然后,按照此链接安装GPU。

接着,还需要安装CUDA Toolkit 9.0,tensorflow.org中的链接始终指向最新的CUDA版本,现在是9.2版本。但是不要使用9.2版本,除非TensorFlow支持它。请使用上面链接的CUDA 9.0版本。

同样,请下载并安装cuDNN v7.1.4 for CUDA 9.0,tensorflow.org中的链接指向的最新版cuDNN是CUDA 9.2的v7.1.4版本。安装并运行如下命令:

接着,运行命令“$ nvidia-smi”,得到如下结果:

此外,还要在CUDA示例代码中运行deviceQuery,以确保GPU正常工作。

执行结果如下:

如果你看到类似的结果,说明你的显卡可以支持TensorFlow。

然后,我们执行下面的命令:

执行结果会显示显卡的版本号和各种性能数据:

最后,还要安装TensorFlow GPU:

安装成功之后,可以用下面的命令确认:

上面的代码明确地显示,开发者正在使用GPU!如果看不到这段代码,说明开发者并没有成功安装GPU,而是在使用CPU。2.6 文档

在本章的最后,笔者想分享一下文档的重要性。很多工程师不够重视文档,只有在软件发布时才会仓促写一些文档,如果公司的管理层不重视,文档就会流于空谈。文档的作用是为了交流,便于团队间的沟通学习,用于未来的你和现在的你交流,所以文档要清楚、简洁。

这里笔者推荐一下Markdown文件格式,比较权威的定义是,Markdown是一种轻量级标记语言,创始人为约翰·格鲁伯(John Gruber)。它允许人们“使用易读易写的纯文本格式编写文档”。它非常轻,普通的文本编辑器就可以使用,可随时随地写作,不用额外购买其他软件。另外,它的语法非常简单,常用的语法用15分钟就可以记住。

Markdown的表现形式也非常丰富,成文后的效果和Word、PDF没有太大的区别。这个工具非常好用,具有丰富的表现形式,而且可使用通用管理工具进行管理,比如通过git就可以实现多人同时共享工作的目的。本书就是用Markdown写成的,可转成Word或PDF文档,从第一次执行git check in命令,大概经历了200多次入仓,才算基本成书。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?