序二
我写这本书的初衷原本是为SciSharp Stack开源社区贡献一点自己的力量,为国内使用C#开发TensorFlow深度学习模型的小伙伴们提供一个快速入门的指南。写着写着,我发现很多语法和代码需要搭配理论知识才能更好地读懂,因而逐渐添加了很多机器学习和深度学习的理论知识,包括在TensorFlow 2.x之后出现的一些新特性的专题说明,如Eager Mode、AutoGraph和Keras等。同时考虑到本书的定位,尽量避开了复杂数学公式的推导,而以API文档说明和实践应用为主。作为市面上第一本,也是目前唯一的一本TensorFlow.NET开源库官方出品的专门面向.NET开发者的TensorFlow中文开发书籍,很多社区的小伙伴和.NET开发者在本书的编写过程中提供了宝贵的建议,在大家的热切推荐下,书中增加了大量的案例实践,包括图像分类、目标检测、自然语言、生成对抗等不同领域的应用。
2021年年底,这本入门手册终于接近完成。记得我是在2019年11月认识的陈海平先生,对于我个人来说,他是我进入开源社区这个新世界的领路人。当时我在实际项目开发过程中遇到了一个比较困难的抉择(后来发现几乎所有.NET开发者在实际项目中应用深度学习框架都会遇到这个痛点),就是现有深度学习框架以Python语言开发为主和实际工业项目以C#语言开发为主之间的矛盾。网络上有很多的解决方案。大约花了1个月的时间,我对常见的各种解决方案进行了现场项目测试和多维度的比较,综合考虑深度学习模型GPU训练的必要性和在实际项目中部署的便利性后,选择了TensorFlow.NET作为自己的项目开发框架。找准方向后,我深入学习和了解了这个框架,惊喜地发现这个框架的创立者陈海平先生是一名华人,并且几乎凭一己之力创建了TensorFlow.NET这个超级庞大而复杂的项目,陈海平先生的开发能力和开源精神令我敬佩不已,他在我心中成为大神级的存在,本书中的案例代码几乎都是他开发的。
从2019年加入SciSharp Stack开源社区起,在大约1年的时间里,我陆续发表了一些TensorFlow.NET相关的技术博客文章,并在一些大学校园和研究生院里给学校的老师和同学们宣导TensorFlow.NET在实际工业项目中的应用,也在微软年度的.NET大会上给大家做了TensorFlow.NET的专题报告。作为谷歌苏州TensorFlow User Group的创立者,我在每一次社区的技术公益活动中都会对TensorFlow.NET进行推广和入门应用讲解。期间,我也经常和海平聊起要给TensorFlow.NET出一个官方教程,并在GitHub上创建了库进行教程的更新,断断续续地出了一些入门视频教程和技术文章,但迟迟没有系统地开展出书的工作。转折点大约在2020年的12月,F#语言之父Don Syme大神加入了我们的SciSharp Stack开源社区,带来了F#语言爱好者的开发团体。至此,C#和F#这两大.NET核心开发语言的开发者们都加入了我们的社区。随着社区成员的壮大和热度的提升,出书的任务迫在眉睫,官方教程的需求愈加热烈,因此我们打算静下心来快速地把这个教程制作完成。
出书比想象中要难,在差不多1年半的时间里,这件事几乎占用了我所有的个人业余时间,写书过程中的点滴故事我至今记忆犹新。在每个夜深人静的晚上,查询资料、斟酌语词、编写测试代码,为了确保这类技术书籍的准确性,书中的每个案例和代码都需要仔细地编写完,并在机器上实际跑一遍,不断调试优化,确保读者在实践过程中没有错误。可以说,这是我目前做过的单个工程量最大的事情,但是回首看,也收获了很多,对于TensorFlow的整体框架有了更系统的认识,对机器学习和深度学习的发展历史和理论结构也有了更深入的了解。为了讲清楚F#的应用,我学习了一门新的语言,深深感受到了函数式编程的魅力所在。
IT技术更新飞快,深度学习领域的各种创新是层出不穷的,在本书的编写过程中,TensorFlow从1.x升级到了2.x,新增了很多功能和特性,.NET也推出了.NET 5.0,.NET 6.0的预览版也发布了,正式版不久也要面世。本书尽量做到与时俱进,书中的代码主要基于TensorFlow 2.x和.NET 5.0,读者可以根据时下最新的语言和框架版本进行升级应用。本书适用于有一些机器学习或深度学习基础,希望在实际生产项目中应用TensorFlow的.NET开发者和工程师。在编写此书的过程中,由于个人能力有限,书中肯定有很多的不足和缺陷,也有很多案例没有来得及开发完成,包括时序分析和时下比较热门的Transform模型等,希望广大读者能提供宝贵的意见和想法,我们期望有机会在下一版本或英文版中得到完善。
本书的出版得到了SciSharp Stack社区、微软技术俱乐部、TensorFlow User Group的多位小伙伴的帮助和支持,他们不但为本书的示例代码提供了建议和测试结果,而且提供了本书的方向和需求点,为本书的完成做出了重要贡献。
本书中的案例代码主要来自SciSharp Stack Examples,其中C#部分主要由陈海平提供,F#部分主要由Vianney P.提供。生成对抗网络的案例代码由社区成员彭波提供,卷积神经网络可视化的案例代码和张量查看器由社区成员久永提供,煤矿矿区的时间序列预测应用案例代码由社区成员孙翔宇提供。在此特别表示感谢。
本书的出版过程得到了微软技术俱乐部的潘淳校长、盛派网络科技的苏震巍主席、.NET圈子知名的微软MVP张善友队长和数据工程畅销书作者齐伟老师的共同指导和大力帮助。在此一并表示由衷的谢意。
衷心感谢电子工业出版社的符隆美编辑对本书的细致编校及出版流程跟进。
感谢我的太太在我写书过程中给予的关注和大力支持,因为写书占据了我太多的业余时间和精力,家里两个孩子全交给太太照顾了。依稀记得,2019年的大年夜晚上,在老家父母的家中,我刚刚完成了第2篇关于TensorFlow.NET的案例文章,并在笔记本电脑上使用GPU成功测试了代码,而窗外,我的太太正带着两个孩子在放烟花。也记得,不知多少个伏案疾书的夜晚,每当完成一个章节并提交到了GitHub,我都会在写书计划表上划去一项,并在心里暗自庆祝进度又推进一格,在此真诚地感谢太太给我创造的专注的写作环境。
最后,感谢所有支持并帮助我们社区的朋友。
SciSharp Stack开源社区核心组成员 仇华(Henry)