4

TensorFlow 2.x上手7: 函数式程序风格

 2 years ago
source link: https://yaoyaowd.medium.com/tensorflow-2-x%E4%B8%8A%E6%89%8B7-%E5%87%BD%E6%95%B0%E5%BC%8F%E7%A8%8B%E5%BA%8F%E9%A3%8E%E6%A0%BC-2238d55f8392
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

TensorFlow 2.x上手7: 函数式程序风格

去年年底在公司给了一个关于如何编写高效的TensorFlow模型的Talk,其中包括三个方面:如何组织代码,IO优化的方法,和分布式训练的优化,其中第一部分如何组织代码我很早就想写一篇文章.

这篇文章主要针对TF 2.x,但是其中的一些程序设计思路在TF 1.x也可以采用,让程序的可读性,理解性,和调试性变得更好.对比TF 2.x与TF 1.x,最大的不同就是不推荐从计算图的角度来思考问题,而是从functional programming的角度来思考.他从结构上强调了什么样的编程风格是一个好的编程风格.

Refactor Your Code into Smaller Functions

这是来自Efficient TensorFlow 2的第一个建议.熟悉TF 1.x的用户习惯在程序里将所有的操作列出来,构成计算图,然后通过session.run()进行评估,比如下面这段代码:

TF 2.x比较推崇Keras和Pytorch类似的设计,鼓励用户将代码重构为较小的函数,用户可以通过@tf.function来装饰复杂的计算函数,提升程序运行效率,比如来自Mask RCNN Keras实现的这一段代码:

这样编写代码有一个好处,函数的声明和函数的调用是可以分开的,一旦我们用一组参数定义了这个Layer Function,就可以重复测试,反复调试函数的实现,并且保证模型中用到的函数和测试时用到的函数产生的效果是一致的.与此同时,在定义模型的时候就可以把模型想象成数据流,对于模型每一个Layer的调用,我们只需要考虑输入和输出就行了.

Model Classes

与上面谈到的思想类似的就是用将模型也用class分装成函数.用class的好处是可以将模型的不同功能封装到不同的方法里面.比如,一个auto-encoder模型就可以提供encode()和decode()方法,比方下面这个例子:

我们可以增加其他的方法,比如loss function等等.

当然,如果只看简单的模型,将模型封装到class里没有什么优势,但是当模型变得复杂后,我们就可以从中获益,比如我们想训练一个object detection模型,这个模型有backbone, feature pyramid network(FPN), 和Region Proposal Network(RPN)多个部分,我们可以把每一个部分当做一个模型,封装到一个class中去,实验过程中对于每一个部分,我们都可以尝试不同的模型,调用的时候我们只需要关注数据是如何从一个模型转入另一个模型就好.

Accessing Parameters and Gradient Tape

最后就是关于模型的参数和tf.GradientTape().在我们运用上面的方法定义函数class时,可以继承tf.Module,然后就可以方便的通过variables和trainable_variables来调用函数的参数,进行很多自定义操作.

这段代码会输出 <tf.Variable'demo_module/Variable:0'shape=()dtype=float32,numpy=6.0>

这种模块化编程极大程度上增加了训练的可控性,并且通过tf.GraidientTape()对于任意模块进行训练.实际上tf.keras.models.Model和tf.keras.layers.Layer都继承tf.Module,利用该封装,我们可以使用TensorFlow各种低阶API,开发和跨平台测试模型.

结语

好久没写,最近抛砖引玉一篇,欢迎各位读者多多交流,提供新思路.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK