1
本节简述
对于开展深度学习开发的目标而言,我们需要掌握的除了必要的深度学习理论基础、必要的开发依赖库基础知识、基本的开发套路之外,我们还需要掌握它常见的外围小帮手都有哪些。这些小帮手就是深度学习依赖库中的其他并不是核心的模块,但却能有效帮助我们提升开发的效率,提升学习模型的质量等。因此,从这一节开始,我们将逐步开始分享一些TensorFlow库中的模块知识,期待着这些模块的基本知识分享结束之后,我们能够写出更高效的DL程序,提升我们的DL能力。常用到的模块除了前面我们提到过的tf.keras模块、tf.data模块、tensorflow_datasets库、tf.math等模块之外,我们还会比较多的用到以下这些模块:1、保存模型训练过程中的各种参数,主要是各个神经网络层中的神经元中的权重系数与偏置值等,这样做的好处是:当我们下一次需要用到这个模型时,就可以不必再训练一次,直接导出被保存好的模型训练参数值即可使得该模型被用于开展预测工作。注意,这里只是保存模型的训练参数,并不将整个模型进行保存。通常我们使用一个名叫:tf.train.checkpoint的模块来帮我们做到这一点;2、我们都知道TensorFlow库在帮我们训练学习模型时,期间的训练过程,我们不需要过多关心。因此也看不到它们内部究竟是怎么训练的,各个参数之间又是如何发生的变化。但人类总是充满好奇心,我们如果想要目睹训练过程中的各个参数的变化,那么我们就需要使用一个名叫:TensorBoard的库来帮我们实现训练参数变化的可视化展示,不过该库仅仅是一个外围工具,真正用于记录训练参数变化状态的还是一个叫:tf.summary的模块;3、在深度学习算法模型训练前,我们需要加载相关的数据集。这是我们开展训练的前提。因此,在这一步,我们也有一些优化文章可以做,比如把数据集变个样子,使得学习模型加载起来更高效一些。这就是在TensorFlow库中所提供的一个名叫tf.Example的模块;4、在TensorFlow2.0版本中,所有的代码都运行在即时执行模式下,这是很灵活,且调试也很方便的。但有时我们为了能更方便部署学习模型或者追求更高的模型性能,也需要把运行模式从即时执行模型切换到图模式下执行,此时就需要用到一个叫tf.function的模块,这我们在之前也见到过,后面将会就此展开更深入的探讨;5、深度学习之所以广受欢迎,是因为它几乎能将触角伸及日常生产生活的每个角落。比如我们需要处理一段时间内的流量广告相关的问题,由于涉及到时间因素,属于一种设计时间序列的问题,这时我们可能就需要用到一种能处理时间序列的数据结构,这在TensorFlow库中有一个专门的模块,叫tf.TensorArray,也称之为动态数组。它能够专门用于这种带有时间数据的问题;6、GPU的配置问题。前面的分享中我们也大致提过,当前的TensorFlow支持三种处理器下的运算:CPU、GPU以及TPU。TPU是专门的张量运算处理器,是谷歌搞的,目前最为高大上,我们这里暂且不说它。GPU我们大家不会太陌生:图形处理器。只要我们的电脑中有英伟达的处理器,那你在电脑上安装好的TensorFlow就可以基于GPU开展计算,这样可比纯粹地靠CPU来运行TensorFlow程序要高效快速得多。但是问题在于:1)、CPU、GPU共存时,TensorFlow默认会基于GPU开展运算,可如果我们非要在CPU下计算呢?有啥办法在代码中进行指定吗?2)、如果我们是个小土豪,电脑中配置好好几块的GPU,那么我们在TensorFlow程序中可不可以手动指定利用哪个GPU来开展运算?3)、GPU的内存是有限的,如果全部TensorFlow程序占有了,那未免有点利用率低下的不足,可不可以对此也做一些限制?以上的问题都可以交给一个叫:tf.Config的模块来帮我们搞定。7、有关tf.data模块中的Dataset模块,我们还有一些API尚未被提及,这里也要稍微聊一聊它们,毕竟它们的存在也有助于提升我们编写高效的TensorFlow程序出来,还有助于提升模型训练效率;8、模型的保存与加载。这里的模型保存就不再只是像使用tf.Checkpoing模块那样的保存一些训练过程的参数了,而是要把所有与模型相关的全部数据都保存起来,包括它的参数配置、运行模式、模型内部的网络结构等等。当我们下一次需要再用到该模型时,只需要简单地对其做一个加载,就可以直接用来做预测,不像tf.Checkpoint模块的加载,只是加载了一些参数,并不见得就能立即用来预测数据,往往还需要进行过一定时间的模型训练。以上八个方面所代表的一些常用模块基本上就构成了我们开发出一个高质量的TensorFlow程序的主要外围模块集。当然,这只是针对多数情况而言。其他场合下,我们可能还需要用到一些其他的模块,届时,我们在讲述具体的神经网络算法模型的具体实践案例时,可能还会碰到一些在这里并未提及过的模块与API,到那时,我们也会一一作出详解。2
小结
这一节的知识仅仅做一个框架性地叙述,大体梳理一下我们在围绕如何开发出高效的TensorFlow程序而展开的一些外围模块的概要介绍。接下来,我们将依次介绍这八个方面需要用到的相关模块及模块内常用的API,并尽可能举出一定的使用案例来加强我们对这些知识的理解。需要再次强调一点的是:不论是我们说Python的模块还是说爬虫的模块还是说TensorFlow等Python库的模块,其实这些模块最终的实现形式都是一个个的类。犹如一个大容器一样,里边包含了相关的属性(也称之为私有变量)以及如何操作这些属性的方法——称之为API。因此,如果在这里大家还对模块这个词汇有些不理解,不妨按照上面的解释来领会模块的意思。或者你还可以这么打个比方:模块就好比一个厨房,那么厨房里必然有一些私有的属性:比如、刀具、案板、灶具、碗筷等等基础的东西。同时,这个厨房还必须要为我们提供一些干活的方法:比如切菜就是一个方法,炒菜又是一个方法,端菜也是一个方法。只不过这些方法有些仅局限在厨房内部,称之为私有方法。对客厅啊、卧室之类的范围是不可见,也没必要见的。有些则是公有方法,是需要在厨房与其他空间之间开展联系用的,比如把菜从厨房端到餐厅这个方法就是一个公有方法;而切菜、炒菜则是一个私有方法。只不过在程序的世界里,对私有方法、私有变量、公有方法等都做了一些使用上的严格限制:私有的东西一律只能在类的内部被调用,不可被类的外部使用者操纵,否则就是犯法了。公有方法就是外部与类唯一的交流渠道。这一点就与我们现实中的要求有些不同。好了,以上就是这一节的简要知识介绍,谢谢大家。