书籍作者:[美] 皮特·沃登 | ISBN:9787111664222 |
书籍语言:简体中文 | 连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 | 下载次数:5822 |
创建日期:2021-02-14 | 发布日期:2021-02-14 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
深度学习网络正在变得越来越小。Google Assistant团队可以使用大小只有14KB的模型检测单词——模型小到可以在微控制器上运行。在这本实用的书中,你将进入TinyML的世界。TinyML将深度学习和嵌入式系统相结合,使得微型设备可以做出令人惊叹的事情。
本书解释了如何训练足够小的模型以适合任何环境。对于希望在嵌入式系统中搭建机器学习项目的软件及硬件开发人员而言,本书是一个理想的指南,它将一步步地指导你搭建一系列TinyML项目。阅读本书不需要任何机器学习或者微控制器开发经验。
你将深入了解以下内容:
·如何创建语音识别程序、行人检测程序和响应手势的魔杖程序。
·如何使用Arduino和超低功耗微控制器。
·机器学习的基本知识以及如何训练自己的模型。
·如何训练模型以理解音频、图像和加速度传感器数据。
·如何使用TensorFlow Lite for Microcontrollers,这是Google用于TinyML的工具包。
·如何调试程序并提供隐私和安全保障。
·如何优化延迟、功耗、模型以及二进制文件大小。
Pete Warden
Google公司TensorFlow面向移动和嵌入式设备部分的技术主管,也是TensorFlow团队的创始成员之一。他曾是Jetpac的首席技术官(CTO)和创始人,该公司于2014年被Google收购。
Daniel Situnayake
Google领导TensorFlow Lite的开发宣传工作,并协助运营TinyML meetup小组。他是Tiny Farms的联合创始人,这是美国第一家利用自动化技术以工业规模生产昆虫蛋白的公司。
译者及审校者简介
魏兰
软件开发工程师,现就职于Google北京。机器视觉,Android性能优化爱好者。博客:blog.csdn.net/xiaowei_cqu。
卜杰
毕业于南京邮电大学,现于Google北京担任软件工程师。邮箱:[email protected]。
王铁震
现就职于Google北京,Tensorflow团队核心软件开发工程师。邮箱:[email protected]。
1)内容过硬。谷歌TensorFlow团队创始成员领衔撰写,谷歌工程师翻译并审校;
2)大咖推荐。Arduino联合创始人、Arm副总裁联袂推荐;
3)题材新颖。TinyML里程碑级著作,手把手教你在Arduino和微控制器上部署ML;
4)知识体系完善。适合各层次学生及从业人员,无需任何机器学习或者微控制器开发经验。
译者序一
刘慈欣在《三体》中有这样一段对四维世界的描述:“任何东西都不可能挡住它后面的东西,任何封闭体的内部也都是能看到的。这只是一个简单的规则,但如果世界真按这个规则呈现,在视觉上是极其震撼的。当所有的遮挡和封闭都不存在,一切都暴露在外时,目击者首先面对的是相当于三维世界中亿万倍的信息量,对于涌进视觉的海量信息,大脑一时无法把握。”在翻译本书第11章时,我看到作者用两张加速度传感器数据的图来说明机器学习可以理解对人类来说看起来毫无道理的数据,这使我很偶然地想起这段对四维世界的描述。这个有些跳跃的联想源于我们常常这样类比低维世界:想象生活在三维空间中的一个二维平面人,不管什么物体穿过二维世界,在他眼中都只是一些长短不一的线段而已,只有从平面中跳出来,他才能看到全貌。虽然低维空间只是高维空间的一个切面,但并不代表其信息量也只有高维空间一个切面的信息量,就像那些变化多端的线段,“变化”本身就是另一个维度的信息,只是对于生来就在感觉和思考二维空间的二维平面人来说难以理解和把握。
在某种意义上,机器学习(Machine Learning,ML)就没有这种维度和先验的负累,其学习和泛化的能力无可限量。机器学习的输入“张量”(tensor)是一种高维结构,其生来就被设计用于变换和投影复杂的高维数据。这个理解也许谬以千里,但是我发现它对于宽慰我面对机器学习的“失控感”很有帮助。作为一个喜欢逐行读代码的老派程序员,我刚刚接触机器学习时总有诸多不适—纵然能看懂每行代码,还是不知道精度为什么不够,模型为什么不能泛化—算法的精髓几乎不在代码中,而更多地隐藏于数以亿计对程序员而言几乎毫无意义的权重中。纵使真的可以通过数学公式推导出哪个权重导致了结果的不精确,其承载的海量信息细节也已然超出我们的处理能力,最终只能通过“与其说是科学,不如说是艺术”译注1的方法不断调参,反复训练并优化模型。以前总以为代码世界是对抗不确定性的最后一片净土,但这也许不过是二进制文明尚太过原始所带来的一种错觉。当然,无视“高维数据”的“歪理”,拥抱这种失控感也不是一件困难的事,因为我们能用代码创造更富生命力的应用,能用代码看到更广阔的世界,这
种成就感和喜悦感对每个程序员而言都难以抗拒。
不过本书的重点不完全是机器学习,而是面向微控制器的机器学习,也就是Pete所说的TinyML。我第一次接触微控制器是很多年前在学校和小伙伴一起参加Intel“创新杯”赛,用51单片机、角度传感器和蓝牙模块制作了一款智能魔方,可以在计算机中实时展示魔方的旋转情况。当时的开发环境极其简陋,只能参照芯片的官方开发文档编写非常简单的逻辑代码,每次要处理任何一点意外的抖动,都要加大量的if/else语句重新烧录。我们的程序最终堆砌了大量让人毫无头绪的“魔数”(magic number),却仍旧没有办法很好地适应真实情况,充其量只能“小心翼翼”地演示效果,完全无法作为真正的产品落地。这之后很多年,我对微控制器开发的认知始终都停留在这种近汇编式“控制流代码”的原始印象中。我在接触本书时才第一次了解到Arduino和TensorFlow Lite for Microcontrollers,我不仅惊讶于微控制器开发已经变得这么友好,更惊讶于机器学习这种我们以为的CPU密集操作,依靠如此有限的算力,竟然能做这么多的事情!
TinyML无疑大大拓展了机器学习和嵌入式应用的疆界。自此,机器学习不再囿于云端超级计算机,而是可以被隐藏于众多小到可以被忽视的电子零件中;嵌入式应用也不再局限于简单的信号处理,而是可以“看懂”“听懂”“感觉到”周围的世界。这意味着“智能”可以适应更恶劣的环境,提供更持久和稳定的服务,同时拥有更强的安全和隐私保障。我们甚至已经可以想象一个“所有的遮挡和封闭都不存在,一切都暴露在外,相当于三维世界中亿万倍的信息量”的新世界。
市面上有关机器学习的优秀资源有很多,但有关微控制器上的机器学习的书籍却寥寥可数。本书不仅填补了这方面的空白,而且无论在机器学习、微控制器应用开发还是工程设计等方面,都是非常优秀的书籍。我在翻译过程中学到了很多知识,不仅仅是“如何在微控制器上部署机器学习”,还了解到很多TensorFlow Lite for Microcontrollers框架的哲学,以及有关工程设计的考量。我已经迫不及待要把这本书推荐给你,相信你会和我一样享受阅读本书的过程,并且受益良多!
感谢Pete Warden和Daniel Situnayake撰写本书并在我们翻译的过程中提供了诸多帮助,感谢Google北京TensorFlow团队的王铁震、vivo AI研究院的况辉帮助做技术审校,感谢机械工业出版社华章公司的刘锋编辑筹备和组织本书的出版工作。
我和卜杰都非常荣幸能参与本书中文版的翻译工作,由于能力和时间有限,翻译难免存在纰漏,我们为可能存在的翻译错误和词不达意提前致歉。感谢你阅读本书,也感谢你的谅解与包容。
祝你学有所成,学有所用!
魏兰
2020年5月于北京
译者序二
我从小就对硬件智能充满了幻想。上小学的时候,有一天老师布置了一篇作文,让我们畅想未来世界的生活。我花了整个晚上思考未来我的家会是什么样子:会根据主人的需要自动调节水温的饮水机、自动打扫卫生的机器人、自动调节温度的空调等,以及一台安装在天花板上的中控计算机负责控制这些设备。在那个互联网甚至个人计算机都还没有普及的年代,这些幻想对普通人而言是那么遥远。然而二十多年后的今天再回首,我小时候的这些幻想早已变成普通人日常生活的一部分。每天晚上回到家,呼唤一声家里的语音助手帮自己开灯、调节一下空调的温度,抑或让扫地机器人打扫某个特定房间,一切都是那么自然。不过我当时没有想到的一点是,负责控制这些设备的“中控计算机”不在天花板上,而是在某个数据中心里,抑或是在云端。
如果要评选出过去十年间对计算机领域影响最大的十大技术革命,云计算和机器学习肯定都榜上有名。云计算彻底改变了人们分享与处理数据的方式,让信息的收集与流通更加便利。而机器学习则需要依赖大量的数据进行训练,以找出数据中共有的模式,并对新数据进行预测。云计算与机器学习的有机结合、优势互补,给很多行业带来了革命性的变化,比如电商平台根据用户的搜索和购买记录为用户更精准地推荐产品,很多内容平台(比如短视频应用)会根据用户的浏览记录推送用户更想看到的内容。同样,云计算+机器学习+物联网的组合,凭借云端强大的运算性能以及网络,通过对传感器收集到的各种数据进行分析并将分析结果分发到各个设备,让我小时候幻想的“未来生活”成为现实。这些变革极大地优化了信息流通的效率,使人们的生活更加便利,但也有很多潜在的风险。
首当其冲的就是用户隐私和信息安全。传统的机器学习推断需要用户将行为信息上传到云端统一处理,导致用户隐私在信息传输过程中被泄露的风险上升。并且,不恰当的服务端实现也会造成滥用用户隐私信息的情况,甚至会导致大规模的信息泄露事故。除此之外,还有一些弊端也是无法避免的,比如收集数据、上传数据、处理数据、返回结果的过程对网络条件有着严格的要求,可能会造成较大的延迟,让用户体验变得很糟糕。并且对于某些智能设备而言,还存在一旦断网就“变砖”的风险。
为了应对这些弊端和风险,业界有人提出了边缘计算(edge computing)的概念,这是一种分布式计算架构,将应用程序、数据资料与服务的运算由网络中心节点移至网络逻辑上的边缘节点来处理。这样做可以减少不必要的信息传输,从而降低信息在传递过程中被泄露的风险,并且减少对网络的依赖,降低延迟。而本书中提到的给嵌入式设备使用的微型机器学习(TinyML)技术则更进一步,将部分机器学习运算直接转移到节点设备上进行。一个常见的应用就是家中语音助手的唤醒词检测。该应用的原理是不断地监听环境中的声音,然后在本地持续地运行推断,这个过程是不会上传音频数据的。一旦检测到了所需的唤醒词,比如“小爱同学”“小度小度”,该应用便会唤醒后续的处理程序,将用户后续的音频上传到云端,以借用云端强大的计算能力进行更加精确的处理。想象一下,如果没有第一步在本地检测唤醒词,会有什么后果呢?用户的音频数据会被时刻上传到服务端进行分析,这会产生极其严重的隐私风险以及大量的网络流量消耗,从而使其实用价值大打折扣。
除了解决以上问题外,TinyML还有更多的应用价值。由于经过了特定优化,运行TinyML模型的硬件可能只有几毫瓦(mW)的功率,这使得我们甚至可以在用纽扣电池驱动的设备上运行机器学习模型。头脑风暴一下,比如在心脏起搏器上运行机器学习模型,根据用户的心跳数据预测即将发生的危险并报警,抑或在需要长期安装在野外的野生动物监测设备上运行图像识别模型,用以监测某种野生动物的数量等。也许,TinyML会出现一款“杀手级”应用,以意想不到的方式彻底颠覆我们的生活习惯。或者,更有可能的是,TinyML会逐步渗透到我们生活的方方面面,以一种无声的方式潜移默化地提升我们的生活品质。而这个过程需要广大工程师的共同努力,希望我们翻译的这本书能够给读者提供一个解决问题的新视角。希望二十年后再回首,我们现在的一些“幻想”能够成为未来的生活日常。
感谢作者Pete和Daniel为我们提供了知识盛宴并在我们翻译的过程中提供支持,感谢魏兰组织这次翻译并让我参与其中,感谢家人和朋友对我的支持与鼓励。
由于翻译水平与时间有限,翻译过程中难免存在错误和词不达意的情况,在这里先向广大读者致歉。如有任何问题,可以通过本书最后译者介绍中提到的联系方式与我们联系。感谢理解!
祝大家身体健康,学有所成!
卜杰
2020年5月于北京
前言
自我记事时起,各种电子产品就一直深深吸引着我,赋予我丰富的想象力。人类学会了从地上挖掘矿石,用神秘的方式提炼这些矿石,然后生产出一系列令人眼花缭乱的微型部件。通过各种神奇的规则,人类将这些微小的部件组合在一起,赋予它们无限的生命力。
在我八岁的时候,电池、开关和白炽灯泡对于还是孩子的我来说已经相当迷人,更不用说家用计算机中的处理器了。随着时间的流逝,我对电子和软件的工作原理有了一定的理解。将简单的元素组合成一个系统,就能创造出更加微妙而复杂的事物,这一点始终令我印象深刻,而深度学习无疑将这一点推向了新的高度。
本书包含的示例之一是深度学习网络,从某种意义上说,它是一种学习和理解如何去“看”的网络。深度学习网络由成千上万个虚拟的“神经元”组成,每个神经元都遵循一些简单的规则并输出一个数字。任何一个神经元本身的能力都非常有限,但是将成千上万个神经元组合在一起,利用人类的知识进行启发式训练,它们最终也可以理解我们这个复杂的世界。
这个想法有些神奇—在由沙子、金属和塑料制成的微型计算机上运行的简单算法可以体现人类的认知理解。这就是TinyML的本质。TinyML是Pete创造的一个术语,我们将在第1章中介绍它。在本书中,你会找到创建这些东西所需的工具。
衷心感谢你成为我们的读者。TinyML是一个复杂纷繁的主题,但是我们会努力解释所有你需要了解的概念,并尽可能地使它们通俗易懂。希望你会喜欢我们的文字,也非常期待看到你能有所创造!
— Daniel Situnayake
本书排版约定
本书采用以下排版约定:
楷体
表示新术语。
斜体(Italic)
表示URL、电子邮件地址、文件名和文件扩展名。
等宽字体(Constant width)
用于代码清单,以及在段落中引用的代码内容,例如变量或函数名、数据库、数据类型、环境变量、声明和关键字等。
等宽粗体(Constant width bold)
表示用户应直接输入的命令行或其他文本。
等宽斜体(Constant width italic)
表示应该被替换为用户提供的值或由上下文确定的值。
这个图案表示提示或建议。
这个图案表示注释。
这个图案表示警告或注意事项。
示例代码
可以从https://tinymlbook.com/supplemental下载补充材料(示例代码、练习等)。
前言1
第1章 简介5
1.1 嵌入式设备6
1.2 技术变迁7
第2章 入门8
2.1 本书目标读者8
2.2 需要的硬件8
2.3 需要的软件10
2.4 我们希望你学到的东西10
第3章 快速了解机器学习12
3.1 什么是机器学习13
3.2 深度学习的工作流程14
3.3 小结27
第4章 TinyML之“Hello World”:创建和训练模型28
4.1 我们要创建什么29
4.2 我们的机器学习工具链30
4.3 创建我们的模型32
4.4 训练我们的模型43
4.5 为TensorFlow Lite转换模型56
4.6 小结61
第5章 TinyML之“Hello World”:创建应用程序62
5.1 详解测试63
5.2 项目文件结构79
5.3 详解源文件80
5.4 小结87
第6章 TinyML之“Hello World”:部署到微控制器88
6.1 什么是微控制器88
6.2 Arduino89
6.3 SparkFun Edge98
6.4 ST Microelectronics STM32F746G Discovery套件109
6.5 小结115
第7章 唤醒词检测:创建应用程序116
7.1 我们要创建什么117
7.2 应用架构118
7.3 详解测试121
7.4 监听唤醒词139
7.5 部署到微控制器143
7.6 小结164
第8章 唤醒词检测:训练模型165
8.1 训练我们的新模型166
8.2 在我们的项目中使用模型179
8.3 模型的工作方式184
8.4 使用你自己的数据训练194
8.5 小结198
第9章 行人检测:创建应用程序199
9.1 我们在创建什么200
9.2 应用程序架构201
9.3 详解测试204
9.4 行人检测210
9.5 部署到微处理器213
9.6 小结232
第10章 行人检测:训练模型233
10.1 选择机器233
10.2 配置Google Cloud Platform实例233
10.3 训练框架选择240
10.4 构建数据集241
10.5 训练模型241
10.6 TensorBoard243
10.7 评估模型245
10.8 将模型导出到TensorFlow Lite245
10.9 训练其他类别247
10.10 理解架构248
10.11 小结248
第11章 魔杖:创建应用程序250
11.1 我们要创建什么252
11.2 应用程序架构254
11.3 详解测试255
11.4 检测手势264
11.5 部署到微处理器268
11.6 小结293
第12章 魔杖:训练模型294
12.1 训练模型295
12.2 模型是如何工作的303
12.3 训练你自己的数据311
12.4 小结315
第13章 TensorFlow Lite for Microcontrollers317
13.1 什么是TensorFlow Lite for Microcontrollers317
13.2 编译系统323
13.3 支持一个新的硬件平台331
13.4 支持一个新的IDE或新的编译系统336
13.5 在项目和代码库之间整合代码更改337
13.6 回馈开源338
13.7 支持新的硬件加速器339
13.8 理解文件格式340
13.9 将TensorFlow Lite移动平台算子移植到Micro347
13.10 小结350
第14章 设计你自己的TinyML应用程序351
14.1 设计过程351
14.2 你需要微控制器还是更大的设备351
14.3 了解可行性352
14.4 站在巨人的肩膀上353
14.5 找一些相似的模型训练353
14.6 查看数据354
14.7 绿野仙踪355
14.8 先可以在桌面系统中运行356
第15章 优化延迟357
15.1 首先确保你要优化的部分很重要357
15.2 更换硬件358
15.3 改进模型358
15.4 量化360
15.5 产品设计361
15.6 优化代码362
15.7 优化算子363
15.8 回馈开源368
15.9 小结368
第16章 优化功耗369
16.1 开发直觉369
16.2 测量实际功耗372
16.3 估算模型的功耗373
16.4 降低功耗373
16.5 小结375
第17章 优化模型和二进制文件大小376
17.1 了解系统限制376
17.2 估算内存使用率376
17.3 关于不同问题的模型准确率和规模的大致数字379
17.4 模型选择380
17.5 减小可执行文件的大小380
17.6 真正的微型模型386
17.7 小结386
第18章 调试387
18.1 训练与部署之间准确率的损失387
18.2 数值差异389
18.3 神秘的崩溃与挂起391
18.4 小结394
第19章 将模型从TensorFlow移植到TensorFlow Lite395
19.1 了解需要什么算子395
19.2 查看Tensorflow Lite中支持的算子396
19.3 将预处理和后处理移至应用程序代码396
19.4 按需自己实现算子397
19.5 优化算子397
19.6 小结398
第20章 隐私、安全和部署399
20.1 隐私399
20.2 安全401
20.3 部署403
20.4 小结404
第21章 了解更多405
21.1 TinyML基金会405
21.2 SIG Micro405
21.3 TensorFlow网站406
21.4 其他框架406
21.5 Twitter406
21.6 TinyML的朋友们406
21.7 小结407
附录A 使用和生成Arduino库ZIP文件409
附录B 在Arduino上捕获音频411
好,不错,值了。物美价廉,送货很快,包装也好,东西不错,下次继续关注,回头再买买买,一不小心就写了一堆字,支持jd少去**哇哈哈哈哈,希望日后活动多多,特价连连,没完没了了
2020-11-09 23:26:27
书的质量还不错,收到速度也快,总体还可以
2020-10-15 07:55:29
真正学习。
2020-11-14 08:02:58
推荐一下,非常不错啊。
2020-11-12 18:23:51
很好,给好评的
2020-10-10 01:41:21
八角尖尖,讲解非常详细。
2020-10-29 01:51:28
很不错啊很不错的书,好书,关注很久了,希望会有进步,加油^0^~
2020-10-18 12:20:41