序一
几年前一次偶然的机会接触到机器学习领域,对于我这样习惯了十几年强规则型机器编码的“老码农”来说,就像发现了一块新大陆。我充满了好奇,于是迫不及待地开启了机器学习探索之旅。在经历了满世界找文档、看论文和研究算法后,我渐渐地发现了自己力所能及并可能有所贡献的机会。在互联网上能找到的有关机器学习方面的示例中,几乎99%的示例都是用Python写的,剩下的是用C/C++写的,可以说是Python“独霸天下”的局面,让人误以为做机器学习项目就必须用Python。这个情况让我萌生了移植一些常用的机器学习库到.NET生态的想法,最初的想法是通过迁移这些库来加深对机器学习的掌握程度,揭开“时髦”词汇人工智能(AI)和机器学习(ML)背后的秘密。
目前机器学习流行的基础库NumPy是首先要进行移植的,于是产生了NumSharp这个张量计算库,移植过程并不是很顺利,因为张量计算对于我来说是一个全新的概念。要实现一个和现有NumPy库可以相互替换的.NET库比想象中更难,最具有挑战性的是它对函数性能的要求很高。最后的效果是只移植了表面上的接口和一小部分API,满足了少部分模型的计算要求,但性能较差,.NET天生在这方面不能和C/C++相提并论,虽然有SIMD的加持,但是实现起来仍然非常不方便。
随着对机器学习的不断深入了解,我逐步接触了神经网络和深度学习知识。神经网络带我进入了一个魔幻的世界,里面充满未知。当时谷歌的TensorFlow开源深度学习框架正火遍全球,同时期的PyTorch崭露头角,所以第一个进入目标移植深度学习库的就是TensorFlow了,我称之为TensorFlow.NET。
移植工作从“Hello World!”开始,API逐步增多,复杂性随之增加,从静态图到动态图,再到上层的Keras,基本上都实现了。在代码编写的过程中,因为项目从一开始就是在GitHub上开源的,所以我不断收到各种各样的使用反馈。正因为有这样的反馈互动,我才有了不断完善这个项目的动力。在此过程中,我结识了仇华——在图像识别领域深耕多年的朋友,并产生了应该编写一本关于如何使用TensorFlow.NET的书籍的想法,把现有的示例代码通过图文讲解的方式呈现给读者,于是有了这本《TensorFlow.NET实战》。书中详细介绍了从张量计算到神经网络模型的搭建,从理论编码到工业场景重现的剖析,示例涵盖线性回归、逻辑回归、全连接神经网络、文本分类、图像分类和迁移学习等,是帮助.NET开发者进入机器学习世界的宝贵资料。
最后要感谢在项目编码和宣传上给予过我帮助的人,特别是家人对我在开源项目方面的支持,因为做开源项目几乎占用了我所有的业余时间和精力,照顾3个孩子的重任都由我太太承担了。
SciSharp Stack开源社区创办者 陈海平