资源技术动态关于TensorFlow 2.0你需要了解的一切

关于TensorFlow 2.0你需要了解的一切

2020-01-10 | |  96 |   0

原标题:关于TensorFlow 2.0你需要了解的一切

来源:AI 研习社        链接:https://www.yanxishe.com/TextTranslation/1884


2019年6月26日,我将在圣保罗的PAPIs.io LATAM会议上举办TensorFlow(TF)2.0研讨会。除了代表Datai担任研讨会主持的幸运快,我同样非常乐意谈一谈TF 2.0。

1578655690362028.png

研讨会的目的是强调与先前的1.x版TF相比所发生的变化。在本文中,您可以跟随我们将要讨论的主要主题。当然,看看 Colab notebook  上的实用代码。


TensorFlow 2.0简介

TensorFlow是一个通用的高性能计算库,由谷歌于2015年开源。从一开始,它的主要关注点是为构建神经网络(NNS)提供高性能的APIs。然而,随着机器学习(ML)社区的时间和兴趣的进步,APIs库已经成长为一个完整的ML生态系统。

1578655728293213.png

  

目前,这个 库正经历着自诞生以来最大的一系列变化,目前处于beta测试阶段,与TF 1.x相比主要有以下变化。  


默认情况下的紧急执行

首先,紧急执行是运行TF代码的默认方式。


您可能还记得,要在TF 1.x中构建一个神经网络,我们需要定义一个称为图的抽象数据结构。另外(您可能已经尝试过了),如果我们尝试打印其中一个图节点,我们将看不到预期的值。相反,我们将看到对图形节点的引用。实际上,要运行图,我们需要使用一个称为会话的封装。使用Session.run()方法,我们可以将Python数据传递给图形,并实际训练我们的模型。

03.png

TF 1.x 代码案例


在急切的执行中,这种情况会改变。现在,TensorFlow代码可以像普通Python代码一样运行。急切地。这意味着操作是立即创建和评估的。

1578655787237128.png

TF 2.0代码案例


TensorFlow2.0代码看起来很像NumPy代码。实际上,TensorFlow和NumPy对象可以很容易地从一个对象切换到另一个对象。因此,您不必担心占位符、会话、提要等。


API 清理

许多 API 像 tf.gans, tf.app, tf.contrib, tf.flags 是已删除或者移动到单独的仓库。


然而, 最重要的清理之一是我们如何建立模型. 你可能还记得在 TF 1.x 中我们有超过1种或者 2 种的方式来建立/训练 ML 模型。


Tf.slim, tf.layers, tf.contrib.layers, tf.keras 是所有有可能使用来建立神经网络模型在 TF 1.x 中。TF 1.x 中不包含 Sequence to Sequence API 。 在大多数情况下,不清楚每种情况下选择哪种。


尽管这些 API 中有许多具有强大的功能,但它们似乎并未汇聚到通用的开发方式。而且,如果我们在其中一个 API 中训练了一个模型,那么直接使用其他API重用该代码并不是直接的。


在 TF 2.0, tf.keras 是被推荐的一个高级 API。


我们将看到,Keras API 尝试解决所有可能的用例。


初学者API

从TF 1.x到2.0,初学者API没有太大变化。但现在,Keras是默认的和推荐的高级API。总之,Keras是一组层,描述了如何使用一个清晰的标准来构建神经网络。基本上,当我们使用pip安装TensorFlow时,我们得到了完整的Keras API和一些附加功能。

05.png


初学者的API称为Sequential。它基本上将神经网络定义为一堆层。除了简单,它还有一些优点。注意,我们根据数据结构(一堆层)定义模型。因此,它可以最小化由于模型定义而产生错误的概率。


Keras-Tuner

Keras- Tuner是一个用于Keras模型超参数调整的专用库。在撰写本文时,lib处于pre-alpha状态,但在使用tf.keras和Tensorflow 2.0 beta的Colab上运行良好。


这是一个非常简单的概念。首先,需要定义一个返回编译的keras模型的模型构建函数。函数接受一个名为hp的参数作为输入。使用hp,我们可以定义一系列候选值,可以对超参数值进行采样。


下面我们建立一个简单的模型并优化超过3个超参数。对于隐藏单位,我们在预定义范围之间采样整数值。对于退出和学习率,我们在一些指定值之间随机选择。

06.png


然后,我们创建一个调谐器对象。在这种情况下,它将实施随机搜索策略。最后,我们可以使用search()方法开始优化。它具有与fit()相同的签名。


最后,我们可以检查调谐器摘要结果并选择最佳模型。请注意,训练日志和模型检查点都保存在目录文件夹(my_logs)中。同样,自动推断出最小化或最大化目标(验证精度)的选择。


看看他们的Github页面以了解更多信息。


进阶API

当您看到这种类型的实现时,就会回到面向对象的编程。在这里,您的模型是扩展tf.keras.Model的Python类。模型子类化是受Chainer启发的想法,与PyTorch定义模型的方式非常相关。


使用模型子类化,我们在类构造函数中定义模型层。并且call()方法处理正向传递的定义和执行。

07.png


子类化有许多优点。进行模型检查比较容易。我们可以(使用断点调试)在给定的一行处停止并检查模型的激活或登录。


但是,极大的灵活性带来了更多的错误。

模型子类化需要程序员更多的关注和知识。

通常,您的代码对于错误(例如模型接线)更为突出。


定义训练循环

在TF 2.0中训练模型的最简单方法是使用fit()方法。fit()支持两种类型的模型,顺序模型和子类。如果使用模型子类化,则您需要做的唯一调整就是覆盖compute_output_shape()类方法,否则,您可以通过它。除此之外,您应该能够将fit()与tf.data.Dataset或标准NumPy nd数组一起用作输入。


但是,如果您想清楚地了解渐变或损耗的情况,可以使用渐变磁带。如果您正在做研究,那将特别有用。


使用渐变磁带,可以手动定义训练过程的每个步骤。训练神经网络的每个基本步骤,例如:


● 前向通过

● 损失函数评估

● 后向通过

● 梯度下降步骤

是单独指定的。


如果你想了解神经网络是如何训练的,这就更直观了。如果你想检查损失值w.r.t模型权重或梯度向量本身,你可以打印出来。


渐变磁带提供了更大的灵活性。但就像子类和序列的一样,更多的灵活性带来了额外的成本。与fit()方法相比,这里需要手动定义一个训练循环。作为一个自然的结果,它使代码对bug更加突出,并且更难调试。我相信这是一个很好的折衷方案,对于代码工程师(寻找标准化代码)来说是理想的选择,而研究人员通常对开发新的东西感兴趣。


另外,使用fit()我们可以很容易地设置TensorBoard,如下所示。


设置TensorBoard


您可以使用fit()方法轻松设置TensorBoard的实例。它也适用于Jupyter / Colab笔记本。


在这种情况下,您可以将TensorBoard添加为fit方法的回调。

只要您使用fit()方法,它就可以同时使用:顺序API和子类API。

08.png


如果选择使用模型子类化并自己编写训练循环(使用分级磁带),还需要手动定义TensorBoard。它涉及使用tf.summary.create_file_writer()创建摘要文件,并指定要显示的变量。


值得注意的是,您可以使用许多回调。一些更有用的是:


● EarlyStopping:顾名思义,它设置了一个规则,以在监视的数量停止改善时停止训练。

● ReduceLROnPlateau:当指标停止改善时,降低学习率。

● TerminateOnNaN:在遇到NaN丢失时终止训练的回调。

● LambdaCallback:用于即时创建简单的自定义回调的回调。


您可以在TensorFlow 2.0回调中查看完整列表。


优化急切执行代码的性能

如果你选择使用梯度下降训练你的模型,你会注意到性能的大幅下降。

急切地执行TF代码有利于理解,但在性能上失败了。为了避免这个问题,TF 2.0引入了TF.function。

基本上,如果您用tf.function装饰python函数,您将要求TensorFlow获取您的函数并将其转换为tf高性能抽象。

09.png


这意味着该函数将被标记为JIT编译,以便TensorFlow将其作为图形运行。因此,可以获得TF 1.x(图形)的性能优势,如节点修剪、内核融合等。


简而言之,TF 2.0的思想是可以将代码设计成更小的函数。然后,您可以使用tf.function注释您想要的那些,以获得这种额外的性能。最好是修饰表示最大计算瓶颈的函数。这些通常是训练循环或模型的前面步骤。


注意,当您用tf.function修饰函数时,会失去一些急切执行的好处。换句话说,您将无法在该段代码中设置断点或使用print()


保存和还原模型

TF 1.x中另一个严重缺乏标准化的地方是我们如何为生产保存/加载经过训练的模型。TF 2.0还试图通过定义单个API来解决这个问题。


TF 2.0没有很多保存模型的方法,而是标准化为一个称为SavedModel的抽象。


这里没什么好说的。如果使用tf.keras.model创建序列模型或扩展类,则类继承自tf.train.Checkpoints。因此,可以将模型序列化为SavedModel对象。

10.png

SavedModels与TensorFlow生态系统集成。换句话说,您将能够将它部署到许多不同的设备上。其中包括移动电话、边缘设备和服务器。

1578656088337371.png


转换为TF Lite

如果要将SavedModel部署到嵌入式设备(如Raspberry Pi, Edge TPUs或手机),请使用TF-Lite转换器。


注意在2.0中,TFLite转换器不支持冻结图形(通常在tf1.x中生成)如果要将冻结的图表转换为在TF 2.0中运行,可以使用TF.compat.v1.tflitecoverter。


在部署到嵌入式设备之前执行训练后量化是非常常见的。要使用tflitecoverter进行此操作,请将optimizations标志设置为“OPTIMIZE_FOR_SIZE”。这将使模型的权重从浮点量化到8位精度。它可以减小模型的大小,提高模型的延迟,而且模型精度不会降低。

12.png

请注意,这是一个实验标志,可能会发生更改。


转转换成TensorFlow.js 

最后,我们还可以获取相同的SavedModel对象并将其转换为TensorFlow.js格式。然后,我们可以使用Javascript加载它并在浏览器上运行您的模型。

13.png


首先,需要通过pip安装TensorFlow.js。然后,使用tensorflowjs_转换器脚本获取经过训练的模型并转换为与Javascript兼容的代码。最后,您可以加载它并在Javascript中执行推断。


您还可以在浏览器上使用Tesnorflow.js来训练模型。


结论:

最后,我想提到2.0的一些其他功能。首先,我们已经看到向序列模型或子类模型添加更多层是非常简单的。而且,尽管TF覆盖了大多数流行的层,如Conv2D、TransposeConv2D等;但是您总是会发现自己处于一种需要一些不可用的东西的情况下。如果你正在复制一些论文或做研究,这一点尤其正确。


好消息是我们可以开发自己的自定义层。遵循相同的Keras API,我们可以创建一个类并将其扩展到tf.Keras.Layer。事实上,我们可以按照非常相似的模式创建自定义激活函数、正则化层或度量。这是一个很好的资源。


此外,我们还可以将现有的TensorFlow 1.x 码转换为TF2.0。为此,TF团队创建了TF_upgrade_v2实用程序。

https://youtu.be/JmSNUeBG-PQ

此脚本不会将TF 1.x代码转换为2.0习惯用法。它基本上使用tf.compat.v1模块来实现更改了名称空间的函数。另外,如果遗留代码使用tf.contrib,脚本将无法转换它。您可能需要使用其他库或使用缺少的函数的新TF 2.0版本。

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:如何用TF-IDF自动生成文本摘要

下一篇:2020 五大技术趋势:无人驾驶发展、机器视觉崛起、区块链实用化、人类增强技术、超自动化

用户评价
全部评价

热门资源

  • 应用笔画宽度变换...

    应用背景:是盲人辅助系统,城市环境中的机器导航...

  • GAN之根据文本描述...

    一些比较好玩的任务也就应运而生,比如图像修复、...

  • 端到端语音识别时...

    从上世纪 50 年代诞生到 2012 年引入 DNN 后识别效...

  • 人体姿态估计的过...

    人体姿态估计是计算机视觉中一个很基础的问题。从...

  • 谷歌发布TyDi QA语...

    为了鼓励对多语言问答技术的研究,谷歌发布了 TyDi...