由于框架的持续改善与更新,目前是一个比较好的机会来通过Tensorflow入门深度学习。
那些年追过的编程语言和框架
犹记得十年前刚刚接触编程的时候,我还是一个懵懂的少年,在计算机的世界里跌跌撞撞。为了弥补和那些初高中就开始学编程的大神们之间的差距,我费尽全身力气,想抓住所有触手可及的知识的尾巴,于是C++,数据结构,算法,Java,J2EE,Delph,C#,ASP.Net,OpenGL,Android,计算机图形学,Html,JQuery,python,Django等等一个一个坚持着学下来。那时候,美队一刚刚上映,“I can do this all day”,偶尔我也对自己这样说。
but,当我熟悉了编程的世界后,发现它并没有那么神秘了,学好了C++,理论上各种语言如Java,python等都可以一鼓而下;平时的工作呢也就是写功能,解bug,用模块乃至于自己写框架。不错,我是觉得这些做起来很有意思,做出来东西也很有成就感。但是我总是觉得有一些迷茫,觉得自己不该止步于此,大家都说学编程都需要数学好,但是到这时为止呢,我仍然没有体会到数学的作用。
直到有一天,看到了吴军老师的《数学之美》,读完之后一种豁然开朗,见到桃花源的感觉。那个时候觉得机器学习中的算法才是”活“的,那些普通数据结构上用到的图遍历啊、快排啊都是“死”的。也就是从那时起,以极大的兴趣进入到了这个行业里。
从学习吴恩达老师的《机器学习》,再到李航老师的《统计学习方法》,然后再依据林智仁教授的libsvm学习SVM。一步一步的,逐步迈进了这个世界的大门。然后从12年开始,又逐渐接触到了卷积神经网络,循环神经网络,增强学习,AutoML等,使用的框架也变得五花八门,cuda-convnet,theano,keras到现在日常用的tensorflow。
以我那时对其他框架浅尝辄止的有限经验来看,Tensorflow给我的初印象就是它封装的尺度拿捏的刚刚好。cuda-convnet可以操作的空间不大;自从用theano把实验室电脑烧掉后就不敢再用;而tensorflow则像积木,可以很方便的做出自己的网络。当然,后来知道keras在这方面做的其实更好,不过那时候并没有精力去探索所有可能的框架。
而今年一月份,tensorflow2.0的alpha版问世了。更强大的功能,更易用的API,更多的代码库使得它相对于其他框架的优势尽显。而值得一提的就是,tensorflow和keras合流了,keras的作者被招进了Goolge主持这项工作。其实这也很感慨,tensorflow刚出来的时候,因为慢被大家调戏为“tensorslow”,那个时候很多框架都以跟tensorflow比速度为乐,而今,经过几番迭代,tensorflow速度提升了大几十倍乃至上百倍,功能也被全面的丰富了。而其他的大部分框架呢,则慢慢的消失了。这样的框架之争说到底是资源与人才的整合,谁的投入大,谁的框架才更有可能胜出,现在立于山巅的是Tensorflow和Pytorch,分别是GF两家提出的。
而tensorflow2.0这种框架易用性的变革,使得学习深度学习的门槛大大降低了,大家可以利用框架很方便的实现许多流行的算法来解决自己手上的问题。因而,这是一个令以前的我羡慕的时代,不用啃拗口的代码就可以做到很多之前需要很麻烦才能做到事情。
Tensorflow2.0
那么,Tensorflow2.0都有哪些特性呢?
TensorFlow 2.0 将专注于简洁性和易用性,主要升级方向包括:
使用 Keras 和 eager execution 轻松构建模型。
在任意平台上实现稳健的生产环境模型部署。
为研究提供强大的实验工具。
通过清理废弃的 API 和减少重复来简化 API。
下图是tensorflow2.0的架构图:
轻松构建模型
在tensorflow2.0中,模型从构建到上线一般是以下步骤:
用tf.data加载数据,使用 tf.feature_column描述特征特性,例如离散特征,密集特征乃至于交叉特征。支持从多种文件格式中读取数据。
使用tf.keras、预定义和自定义Estimators构建、训练和验证模型。Keras 与 TensorFlow的其余部分紧密集成,因此你可以随时访问 TensorFlow 的功能。如果不想从头开始训练一个模型,你很快就能通过TensorFlow Hub模块利用迁移学习来训练Keras或 Estimator模型。
用eager execution运行和调试,然后在计算图上使用 tf.function。TensorFlow 2.0默认用 eager execution 运行,相对于1.0来说使用更加轻松、调试更加顺利。此外,tf.function标注可以将普通Python程序转换成 TensorFlow图。这个过程保留了 TensorFlow1.x 基于计算图执行的所有优点:性能优化、远程执行,以及序列化、导出和部署的能力,同时增加了用简单Python表达程序的灵活性和易用性。
使用分布式策略进行分布式训练。对于大部分机器学习训练任务来说,分布式策略API使得在不同的硬件配置上分布和训练模型变得很容易,而无需改变模型定义。
导出至 SavedModel。TensorFlow 将在 SavedModel 上标准化,来作为 TentsorFlow Serving、TensorFlow Lite、TensorFlow.js、TentsorFlow Hub 等的交换格式。
在任意平台上实现稳健的生产环境模型部署
TensorFlow提供多平台的产品化路径。不论是在服务器、边缘设备还是网页上,也不论你使用的是什么语言或平台,TensorFlow总能让你轻易训练和部署模型。在 TensorFlow 2.0 中,支持:
TensorFlow Serving:允许通过 HTTP/REST 或 gRPC /协议缓冲区为模型提供服务的 TensorFlow 库。
TensorFlow Lite:TensorFlow 针对移动和嵌入式设备的轻量级解决方案提供了在 Android、iOS 和嵌入式系统(如 Raspberry Pi 和 Edge TPU)上部署模型的能力。
TensorFlow.js:支持在 JavaScript 环境中部署模型,例如通过 Node.js. TensorFlow.js 在 web 浏览器或服务器端部署模型,还支持在 JavaScript 中定义模型和在 web 浏览器中使用类似 Keras 的 API 直接训练模型。
TensorFlow 还支持其它语言(由更广泛的社区维护),包括:C、Java、Go、C#、Rust、Julia、R 等等。
为研究提供强大的实验工具
TensorFlow使得从概念到代码和从模型到出版物中获取新想法变得更加容易。TensorFlow 2.0 结合了很多功能,能够在不牺牲速度或性能的情况下定义和训练最先进的模型:
Keras功能API和Model子类API:允许创建复杂的拓扑,包括使用残差层、自定义多输入/输出模型以及强制编写的正向传递。
自定义训练逻辑:用 tf.GradientTape 和 tf.custom_gradient 对梯度计算进行细粒度控制。
为了获得更强的灵活性和控制,低级 TensorFlow API 始终可用,并与更高级别的抽象一起工作,以实现完全可定制的逻辑。
TensorFlow 2.0新添了一些附加功能,让研究人员和高级用户可以使用丰富的插件来进行实验,如Ragged Tensors、Tensor2Tensor等。
除了这些功能之外,TensorFlow还提供了易于制作原型和调试的eager execution,可以大规模训练的 Distribution Strategy API 和 AutoGraph,以及对 TPU 的支持,使 TensorFlow 2.0 成为一个易于使用、可定制和高度可扩展的平台,用于展开最先进的机器学习研究并将该研究转化为生产流水线。
课程
看完上面tensorflow2.0的特性之后,大家可能对上面提到的很多名词不熟悉,不过没关系,这是一个令以前的我羡慕的时代,那就是网络上的资料非常的丰富,Tensorflow的官网上也有相应的文档。
当然,与tensorflow的学习相对应的是理论知识的学习。对于初学者来说,我们无法在不学习理论知识的情况下只学习tensorflow框架的使用,框架和理论是相辅相成的。
而对我来说,关于出课程的动机,主要是以下三点:
懂知识和能把知识讲出来是对知识掌握的两层境界,通过讲解知识,我自己获得提升。
学习的路上最厌恶孤独,很多知识我都是自学,深知其中滋味,有的时候觉得很难坚持下去,而通过课程和不同的人交流学习可以缓解这种心态。另外,相对于自己发现资料去学习理解,学习整理好的资料和知识可以大大提升学习的效率,我的这两门课程在网上只要用心找,可能都能找到相关的知识点的资料,但是我相信,学习课程仍然是最省时间的方法,甚至大家按照标题去按图索骥的搜索资料也能节省不少时间,年轻的时候,时间可比金钱有价值的多。
挣点外快,不吹不黑,不遮不藏,实事求是。
以上,希望tensorflow2.0成为大家通往有意思的深度学习/机器学习的大门。