当前位置: 首页 > news >正文

怎么建设免费小说网站专门做qq小工具的网站

怎么建设免费小说网站,专门做qq小工具的网站,wordpress支付下载插件,网页排版软件原文#xff1a;What’s New in TensorFlow 2.0 协议#xff1a;CC BY-NC-SA 4.0 译者#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】#xff0c;采用译后编辑#xff08;MTPE#xff09;流程来尽可能提升效率。 不要担心自己的形象#xff0c;只关心如何实现目… 原文What’s New in TensorFlow 2.0 协议CC BY-NC-SA 4.0 译者飞龙 本文来自【ApacheCN 深度学习 译文集】采用译后编辑MTPE流程来尽可能提升效率。 不要担心自己的形象只关心如何实现目标。——《原则》生活原则 2.3.c 第 3 部分TensorFlow 2.0 - 模型推断和部署以及 AIY 如果您使用过 TensorFlow 1.x则本部分将重点介绍迁移到 TensorFlow 2.0 所需的总体概念更改。 它还将教您使用 TensorFlow 可以进行的各种 AIY 项目。 最后本节向您展示如何将 TensorFlow Lite 与跨多个平台的低功耗设备一起使用。 本节包含以下章节 第 5 章“模型推理管道 – 多平台部署”第 6 章“AIY 项目和 TensorFlow Lite” 五、模型推理管道 - 多平台部署 训练完模型后您会怎么做 用它 如果答案是肯定的那么您将如何使用它 您正在寻找的答案是推理。 简而言之推理过程是确保机器学习模型可用于满足实际用户需求的基础。 正式地说推理是有效地计算经过训练的机器学习模型以满足用户需求的过程。 可以在各种硬件类型上进行推断包括服务器以及最终用户设备例如电话和 Web 浏览器。 根据用户要求它也可以在不同的操作系统上执行。 前几章重点介绍了如何… 技术要求 为了运行本章中给出的代码摘录您将需要以下硬件和软件 TensorFlow 2.0TF 2.0或更高版本CPU 或 GPU 版本都足够Python 3.4当前TensorFlow 支持的最高 Python 版本是 3.6NumPy如果不是由 TensorFlow 自动安装Docker请参阅第 1 章和 “TensorFlow 2.0 入门”有关如何安装 Docker 的详细信息curl具有命令行界面的 Linux 计算机 本章中的每个 Python 代码段均假定已安装 TF 2.0并且已将其导入到名称空间中。 这意味着在执行任何代码块之前请先输入以下行 import tensorflow as tf可在这个页面中获得本章的代码文件。 机器学习工作流程 - 推理阶段 机器学习应用的最常见子集之一遵循构建一次并多次使用范式。 这种类型的应用涉及所谓的推理阶段。 在推断阶段开发人员必须专注于运行模型以满足用户需求。 满足用户需求可能涉及从用户那里接受输入并对其进行处理以返回适当的输出。 下图描述了典型的高级机器学习应用工作流程 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvP0nnKr-1681704017943)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/whats-new-tf2/img/4dba2f20-e39c-4cce-98ba-9f2d018a4f3e.png)] 从上图我们可以看到推理过程如何适应整体情况。 在随后的应用中… 从推理的角度理解模型 实现基于机器学习的应用的开发人员可以依靠的一件事是使生活变得轻松无论所服务模型中的实际计算如何向用户提供模型的过程或多或少都是相同的。 这意味着如果实现正确工程师可能不必在每次数据科学家更新模型时都重新构建部署管道。 这可以通过利用抽象的力量来实现。 这里的一个关键抽象是模型存储和加载的格式。 通过引入标准化格式TF 2.0 使得在一个环境中训练模型然后在各个平台上使用它变得容易。 在 TF 2.0 中执行此操作的标准方法是通过SavedModel格式。 这种标准化格式类似于软件开发管道中的构建工件。 读者可以将模型工件视为快照可用于重新创建模型而无需访问创建模型的实际代码。 实际上在推理时模型被简化为一个黑盒子它具有一组预定义的输入和输出以及一个与底层模型进行交互的统一接口。 开发人员现在要做的就是建立在给定环境中实现和执行黑匣子所需的基础结构。 在以下各节中我们将学习如何构建管道以服务于各种流行的软件和硬件环境中的模型。 模型工件 – SavedModel 格式 SavedModel格式是 TensorFlow 使用的默认模型序列化和反序列化格式。 用外行的术语来说这可以理解为一个容器它容纳了在不访问创建模型的原始代码的情况下从头开始重现模型的所有内容。 我们可以使用SavedModel将训练后的模型从训练阶段转移到推理阶段甚至在训练过程的不同部分之间转移状态。 简而言之可以说SavedModel包含完整的 TensorFlow 程序以及模型权重和所描述的各种计算操作的描述。 使用 TF 2.0 的 Python API 时现在可以导出某些本机… 了解核心数据流模型 在我们研究SavedModel格式的细微差别之前重要的是要首先了解 TensorFlow 模型的真正含义。 对于初学者TensorFlow 实现数据流编程范例。 在这种范式下程序被建模为在不同计算操作之间流动的数据的有向图。 这意味着每个节点代表一个操作或计算边代表数据。 输入边缘将代表该节点的输入而输出边缘将对应于计算节点产生的输出。 为了说明这个想法让我们看一下tf.add()操作的粗略数据流表示形式。 如下图所示输入边对应于 x 和 y 的输入。 输出边缘z(x y)对应于节点的输出在这种特定情况下该输出恰好是输入的总和 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C9eLDsaC-1681704017944)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/whats-new-tf2/img/2e09fd48-ab43-4546-8eab-1df5c1dae380.png)] 使用数据流范例可以使 TensorFlow 在执行用户代码时利用某些好处 并行性将模型表示为有向图可以使 TensorFlow 识别哪些操作相互依赖哪些不依赖。 这样可以并行执行独立的操作从而加快基础计算图的执行速度。分布式执行并行性的一个相关好处是并行执行可以在同一台物理计算机上执行也可以在另一台物理计算机上完成。 TensorFlow 还负责这些节点之间的通信。编译TensorFlow 的 XLA 编译器旨在利用数据流图中的信息通过一系列优化来生成更快的代码。可移植性数据流图是模型中代码的语言无关表示形式。 这使得可以在 Python 中构建数据流图并以较低级别的语言例如 C 或 Java将其还原以进行低延迟推理。 我们已经看到了如何使用数据流范例来表示一个简单的操作。 实际的 TensorFlow 程序或模型将由许多这样的简单操作组成。 这意味着此类程序的数据流表示形式将由许多此类简单表示形式组成每个操作通常具有一个或多个节点。 SavedModel格式可以理解为该基础数据流图的序列化。 这里有趣地提到了诸如 Keras 和 Estimators 之类的高级 API 的角色。 实际上他们从用户那里抽象出了该数据流图的细节以至于用户甚至不必考虑它。 它们为用户提供了一组高级操作以供实现然后将其转换为 TensorFlow 可以执行的数据流图。 这意味着最终在 TensorFlow 中创建的任何模型无论其创建方式如何都将转换为统一的计算图。 这样就可以使用一个统一的格式保存和加载所有模型。 tf.function API 正如我们在第 1 章中看到的那样第 2 章“TensorFlow 2.0 入门” “Keras 默认集成和急切执行”默认情况下启用急切执行是 TF 2.0 中引入的主要更改之一。 第 1 章和 “TensorFlow 2.0 入门”还简要提到了 TF 2.0 与 Python 编程语言更紧密地结合在一起。 此更改的核心是低级tf.function API。 实际上这是通过使用户能够从 Python 函数创建 TensorFlow 图而将 TensorFlow 1.x 的功能与急切执行的优点相结合。 它既可以用作可调用函数也可以用作装饰器。 在本节中我们将简要介绍一下如何在每个人中使用它。 tf.autograph函数 到目前为止我们已经看到了如何从 Python 函数创建 TensorFlow 图的代码。 TF 2.0 将 Python-TensorFlow 耦合提升到了一个全新的水平。 新引入的 AutoGraphtf.autograph函数使用户可以使用本机 Python 语法编写图的代码。 当前此功能仅支持 Python 语法的有限子集。 这个页面中提供了当前支持的语法元素的详细列表。 这样做的主要优点是它使开发人员可以编写直观的 Python 代码来完成特定任务然后自动将其转换为高性能的 TensorFlow 图代码。 这意味着开发人员可以以直观的 Python 形式描述基本的编程语言结构例如循环和条件而不是 TensorFlow 等效形式并且具有可比的性能。 在 TF 2.0 中调用tf.function时会自动调用 AutoGraph。 用户不需要单独调用它。 tf.autograph模块包含低级模块。 初学者或中级用户几乎不必直接使用它们现在可以安全地忽略详细信息。 让我们看看执行此操作的示例。 考虑一个计算给定张量中所有值之和的函数。 让我们完全使用 Pythonic 语法实现它然后使用tf.function将其转换为本地 TensorFlow 计算图代码 tf.function def sum_of_cubes(numbers):_sum 0for number in numbers:_sum number ** 3return _sum为了测试到目前为止已经编写的代码让我们创建一个介于 1 到 5 之间包括两端的整数张量。 然后将它们传递给我们的函数 input_values tf.constant([1, 2, 3, 4, 5]) result sum_of_cubes(input_values) print(type(result)) print(result)这将导致以下输出 class tensorflow.python.framework.ops.EagerTensor tf.Tensor(225, shape(), dtypeint32)正如我们在提取的输出中看到的那样我们已经编写的纯 Python 函数现在被转换为 TensorFlow 图。 函数现在返回张量而不是单个数字的事实证明了这一点。 输出值与预期值相同。 有效地我们已经证明了特定于 Python 的语法结构例如for循环和幂运算符已成功转换为 TensorFlow 图的代码。 这是tf.function和 AutoGraph 的真正功能。 由于我们现在已经有效地将本机 Python 代码转换为 TensorFlow 计算图因此可以使用SavedModel格式在环境之间共享此图。 导出自己的 SavedModel 模型 如前所述SavedModel格式用于生成当前计算图数据流图的可再现表示。 此表示独立于用于创建计算图的特定代码。 它也独立于用于构造该图的特定过程。 例如SavedModel格式没有积极地区分使用本机 TensorFlow 操作Keras 甚至tf.function创建的计算图。 尽管我们可以互换地将此计算图称为模型但从技术上讲它也可以被认为是训练有素的数学模型和围绕它编写的一些其他代码的组合以执行支持… 使用tf.function API 如前所述tf.function API 使我们能够使用简单的 Python 编写 TensorFlow 图和模型。 让我们从构建一个简单模型开始该模型接受一个数字或一个数字列表并返回列表中值的平方。 然后我们将由此创建的模型导出为SavedModel格式。 这是本章以下大部分内容的重要步骤。 我们将几乎在所有地方都使用SavedModel工件。 首先让我们首先编写一个简单的 Python 函数来计算平方。 然后我们可以从那里向后退 def compute_square(number):return number ** 2 如我们所见前面的 Python 方法接受一个数字作为输入并返回其平方。 我们的最终目标是构建用于执行此计算的 TensorFlow 图。 利用我们从前面的部分中学到的知识我们知道一种实现方法是使用tf.function。 我们选择使用tf.function的装饰器形式。 如果仔细观察我们刚刚编写的代码段您将意识到我们假设传递给number变量的值是一个数值。 在现实世界中情况未必一定如此。 为了解决这个问题我们可以在装饰器中指定此方法可以接受的值的类型。 这是通过在装饰器中固定输入签名来完成的。 我们将其固定为包含 32 位浮点数的一维张量。 任何不符合此标准的输入将被自动丢弃。 我们修改后的代码片段带有实现错误检查的功能现在看起来像这样 tf.function(input_signature[tf.TensorSpec(shapeNone, dtypetf.float32)]) def compute_square(number):return number ** 2 到目前为止我们已经成功实现了一个 TensorFlow 计算图该图可以计算给定一维张量的平方。 现在唯一要做的就是以SavedModel格式将此图导出到磁盘。 您可能还记得tf.saved_model模块中提供了用于SavedModel的 API。 在阅读该模块的文档时我们发现save方法可能会对我们有所帮助。 一个粗糙的边缘是tf.saved_model.save方法仅适用于Trackable类型的对象而我们所拥有的是tf.function()对象属于Trackable类型或其子类。 为了克服这个问题我们只需将代码包装在实现Trackable接口的类中 class Square(tf.Module):tf.function(input_signature[tf.TensorSpec(shapeNone, dtypetf.float32)])def compute_square(self, number):return number ** 2​现在我们将逻辑封装在[H​​TG0]方法支持的表示形式中。 最后我们创建一个Square类的对象继承自Trackable并将其传递给save方法 sos Square() tf.saved_model.save(sos, ./square/1)现在您将看到模型已成功导出到./square/1目录。 可以通过列出前面目录的内容来验证。 打开终端并输入以下内容 cd directory-containing-your-code ls -ax ./square/1您将看到如下内容 . .. assets saved_model.pb variables 在接下来的分析SavedModel工件的部分中我们将研究这些文件中的每个文件所包含的内容以及它们在保存模型的过程中所起的作用。 分析 SavedModel 工件 在本小节中我们将详细研究SavedModel如何序列化和反序列化 TensorFlow 图。 我们还将看看SavedModel命令行界面这是一个功能强大的工具可以分析磁盘上SavedModel的内容甚至可以在本地运行SavedModel SavedModel格式本质上描述了一种在磁盘上存储 TensorFlow 图的方法。 在较低的级别上其工作的一部分是编纂一种用于在文件中表示该图的格式。 按照这种格式每个图都使用组成的底层函数及其状态的组合表示。 用 TensorFlow 的话来说这些组成函数用名称标识并称为签名或命名签名。 这些… SavedModel 命令行界面 SavedModel 命令行界面CLI是非常方便的工具可用于分析各种SavedModel实例并运行它们。 它在调试磁盘上的模型时非常有用并且可以在不读取编写或修改任何代码的情况下使用。 在本节中我们将简要介绍如何安装此工具使用它分析图的不同组件并运行计算图。 该工具与 TensorFlow 二进制文件捆绑在一起。 如果您通过从源代码构建 TensorFlow 来安装它则必须单独安装它。 有关安装说明请参见这里。 这里值得简要讨论的两个命令是show和run。 前者可用于列出 MetaGraph 信息而后者可用于通过命令行在一组输入上执行图。 通过使用-h参数运行工具可以在每个步骤中获取详细说明 saved_model_cli -h可以通过在命令名称后调用-h参数来获取特定命令的说明。 例如如果您想要有关run命令的详细说明请键入以下内容 saved_model_cli run -h为了亲身体验此工具让我们回到在tf.function API 的较早部分中构建和训练的模型。 您可能还记得模型接受任何维数的张量并返回包含原始元素平方的相同形状的张量。 首先让我们看一下模型中存在的元图数量。 为此请在“终端”窗口中键入以下内容 saved_model_cli show --dir path-to-model-dir对于我们计算平方的模型您应该看到以下内容 The given SavedModel contains the following tag-sets: serve如前所述使用标记集来标识元图。 在这里我们可以看到只有一个名为serve的标签集。 我们可能还想看一下构成该元图的组成函数。 要查看构成此标签集的SignatureDefs有关详细信息请参阅 这里您可以键入以下命令 saved_model_cli show \--dir path-to-model-dir \--tag_set serve对于我们计算平方的模型您应该看到以下内容 The given SavedModel MetaGraphDef contains SignatureDefs with the following keys: SignatureDef key: __saved_model_init_op SignatureDef key: serving_default现在让我们看看如何使用run函数与直接使用命令行通过SavedModel保存的 TensorFlow 计算图进行交互而无需编写任何代码。 从上一阶段的输出中可以看到有两个组件函数。 其中我们选择使用serving_default SignatureDef。 现在我们可以通过提供所需的输入并获得所需的结果通过命令行运行它。 为此我们需要将路径传递给模型标签集输入值以及要运行的组件的名称。 为了该测试的目的我们要计算的张量由[1, 2 , 3]给出。 确切的命令如下 saved_model_cli run \--dir path-to-model \--tag_set serve \--input_exprs number[1, 2, 3] \--signature_def serving_default以下是输出 Result for output key output_0: [1\. 4\. 9.]从上一阶段的输出中我们可以观察到以下内容 输出张量与输入张量具有相同的形状输出张量中的值对应于我们输入张量中的值的平方 这些观察结果都确认SavedModel工作正常。 在随后的部分中我们将探讨在各种硬件和软件环境中服务于此模型的方法。 后端服务器上的推理 在当今世界分布式系统无处不在。 从我们浏览的网站到我们在手机上使用的应用范围当我们不使用分布式系统时几乎没有一天。 鉴于这种无所不在的性质将这种范例用于构建机器学习系统显然是一个选择。 构建分布式系统的典型模式是在后端服务器上执行资源密集型和数据敏感型计算同时将较轻且相对独立的计算任务推向用户设备。 机器学习应用的很大一部分属于资源密集型类别。 此外机器学习模型是使用数据构建的。 在现实世界中的很大一部分… TensorFlow 服务 TensorFlow 服务是 TensorFlow 扩展TFX平台的组成部分。 顾名思义它旨在用于服务于机器学习模型。 简而言之它是专为生产环境设计的高性能服务系统。 TensorFlow 服务的一个重要特征是它向下游用户公开了一致的 API而与所服务模型的实际内容无关。 这使得快速进行实验和重新部署变得容易而无需对其余软件栈进行任何其他更改。 它附带对 TensorFlow 模型的内置支持并且可以扩展为服务于其他类型的模型。 在本节中我们将详细介绍 TensorFlow 服务。 从基本的安装和设置开始以下小节通过一系列动手示例描述如何设置服务器来为SavedModel服务。 我们还将简要介绍 TensorFlow 服务提供的一些关键 API。 设置 TensorFlow 服务 与 TensorFlow 平台的大多数其他组件一样TensorFlow 服务也可以通过多种方式安装。 这里推荐通过 Docker 镜像使用它因为它相对简单。 如果容器镜像对您不起作用请在这个页面上获取其他安装 TensorFlow 服务方法的摘要。 使用 Docker 设置 TensorFlow 服务涉及一个简单的步骤。 但是此步骤需要将 Docker 安装在主机上。 有关设置 Docker 的说明请参阅第 1 章 “TensorFlow 2.0 入门”或本章的“技术要求”部分。 您需要做的就是拉相关的 Docker 镜像以… 设置并运行推理服务器 现在我们已经设置了 TensorFlow 服务让我们使用它来执行一些实际任务。 我们可以看看如何设置后端服务器以服务于前面几节中构建的SavedModel格式。 我们可以使用上一节中下载的 Docker 镜像来运行SavedModel格式。 为此我们需要做两件事 将本地主机上包含模型的位置绑定到容器内的目录/models/your-model_name绑定网络端口 TensorFlow 服务正在监听主机上的网络端口 该命令的一般形式如下 docker run -t --rm \-p port-on-host:8501 \-v path-to-model-on-host:/models/model_name \-e MODEL_NAMEmodel_name \tensorflow/serving现在模型服务器应该在您的主机上port-on-host中指定的端口上运行。 现在让我们通过发送一些推断数据来测试我们的模型。 我们可以通过 RESTful API 与模型进行交互。 我们应该将带有输入值的 HTTP POST请求发送到服务器。 为此请在“终端”窗口中键入以下命令 curl -X POST \http://localhost:port-on-host/v1/models/square:predict \-H Content-Type: application/json \-d {instances: [1.0, 2.0, 3.0, 4.0]}您应该看到以下输出 {predictions: [1.0, 4.0, 9.0, 16.0] }现在我们已经看到了如何使用 TensorFlow 服务在后端服务器上提供SavedModel。 可通过 gRPC 和 RESTful API 访问此模型。 有关这些的详细信息请参见以下链接 https://www.tensorflow.org/tfx/serving/api_resthttps://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/prediction_service.proto 请记住每次调用docker run时主机上都会启动一个新的 Docker 容器。 即使您已停止与该容器进行交互甚至关闭了“终端”窗口该容器也可能会在后台继续刷新并运行。 这会导致大量的隐藏内存消耗。 需要有意识地停止容器。 为此请执行以下步骤 找出刚启动的容器的名称或 ID。 在“终端”窗口中键入以下内容 docker ps如您在前面的命令的输出中看到的每个容器都有一个名称和 ID。 这些中的任何一个都可以用来唯一地标识容器。 我们需要使用它来停止我们启动的容器。 可以按照以下步骤进行 docker stop container-name您还可以使用以下内容 docker stop container-id现在您可以放心容器已停止并且没有占用计算机的任何内存。 当 TensorFlow.js 与 Node.js 相遇时 TensorFlow.js 的引入使在 JavaScript 环境中运行 TensorFlow 模型成为可能。 您可能已经知道Node.js 是一个跨平台的运行时环境可以在浏览器外部执行 JavaScript 代码。 这样就可以使用 JavaScript 代码编写后端服务。 将 Node.js 与 TensorFlow.js 集成在一起就可以从 JavaScript 环境在后端服务器上提供机器学习服务。 请参阅这个页面上有关如何执行此操作的文档。 浏览器中的推断 您可能还记得在前面的部分中我们简要讨论了分布式系统。 在那里我们讨论了主要在主机服务器上执行基于机器学习的计算的场景。 在这里我们将研究在浏览器中在用户端执行这些计算的场景。 这样做的两个重要优点如下 计算被推送到用户端。 主机不必担心为执行计算而管理服务器。将模型推送到用户端意味着不必将用户数据发送到主机。 对于使用敏感或私有用户数据的应用来说这是一个巨大的优势。 因此浏览器中的推理成为对隐私至关重要的机器学习应用的绝佳选择 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rhsf8SIv-1681704017944)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/whats-new-tf2/img/ed83cc9d-b1bb-4e26-b251-f69247244b1b.png)] 上图中描述的工作流说明了从头构建模型然后允许最终用户在其 Web 浏览器中运行它的端到端管道。 我们看到该过程分为两个主要阶段训练和推理。 在训练阶段数据科学家和其他机器学习从业者聚在一起建立和训练模型。 现在该模型以SavedModel格式导出。 但是TensorFlow.js 尚不直接支持SavedModel格式。 因此有必要将模型转换为 TensorFlow.js 支持的格式。 有关如何执行转换的详细信息请参见这里。 现在通过任何其他 JavaScript 代码都可以通过 Web 服务器将转换后的模型提供给用户。 用户为模型提供必要的输入。 TensorFlow.js 模型在用户浏览器中处理这些输入并返回适当的输出。 Detailed resources for getting started with TensorFlow.js are available at the following links: https://www.tensorflow.org/js/guidehttps://www.tensorflow.org/js/tutorialshttps://www.tensorflow.org/js/demos 移动和物联网设备上的推理 在过去几年中智能手机的使用呈指数增长并且以不减缓的方式持续增长。 其他物联网设备在我们的日常生活中也变得越来越普遍。 使用率的这些上升趋势对机器学习系统产生了有趣的影响。 与普通主机相比这些平台通常资源有限。 结果需要其他优化来在此类设备上进行推理。 TensorFlow 平台支持构建机器学习和基于深度学习的应用这些应用可以在不同类型的边缘设备例如手机和其他 IoT 设备上运行。 实现此目的的主要工具是… 总结 在本章中我们详细介绍了推理阶段。 首先通过对端到端机器学习工作流的外观有了基本了解我们了解了每个阶段涉及的主要步骤。 我们还了解了将模型从训练阶段转移到推理阶段时所起作用的不同抽象。 详细了解SavedModel格式和基础数据流模型我们了解了可用于构建和导出模型的不同选项。 我们还了解了tf.function和tf.autograph等出色功能使我们能够使用本地 Python 代码构建 TensorFlow 图。 在本章的后半部分我们学习了如何构建推理管道以便在后端服务器Web 浏览器甚至边缘设备等不同环境中运行 TensorFlow 模型。 在下一章中我们将了解有关 AIY 项目和 TensorFlow Lite 的更多信息。 六、AIY 项目和 TensorFlow Lite 本章详细介绍如何在低功耗嵌入式系统例如边缘设备移动系统例如 AndroidiOS 和 Raspberry PiEdge TPU 和 NVIDIA Jetson Nano 上部署经过训练的 TensorFlow 2.0TF2.0模型。 本章还介绍了自己动手工具包的训练和部署模型例如 Google 自己做人工智能AIY工具包。 本章涵盖的其他主题是如何将经过训练的 TensorFlowTF模型转换为 TensorFlow LiteTFLite模型他们之间的主要区别以及两者的优势。 本章与前几章略有不同从某种意义上说它只是对 TF2.0 的更广泛关注的介绍。 也就是说硬件领域… TFLite 简介 TFLite 是一组工具可帮助开发人员在二进制大小较小且延迟较低的设备上运行 TF 模型。 TFLite 由两个主要组件组成TFLite 解释器tf.lite.Interpreter和 TFLite 转换器tf.lite.TFLiteConverter。 TFLite 解释器实际上是在低功耗设备例如手机嵌入式 Linux 设备和微控制器上运行 TFLite 模型的。 另一方面TFLite 转换器在可用于训练 TF 模型的强大设备上运行并将训练后的 TF 模型转换为解释器的有效形式。 TFLite 旨在简化在设备上执行机器学习的过程而无需通过网络连接发送任何数据。 这样可以改善延迟时间因为没有通过网络传输数据提高了隐私性因为没有数据会离开设备和脱机功能因为不需要互联网连接就可以在任何地方发送数据。 TFLite 的一些关键功能包括针对设备的经过优化的优化解释器它支持在二进制大小较小的设备上优化的一组核心操作针对多种语言例如 SwiftCCJava 和 Python 的 API预训练的模型和教程新手可以在低功耗设备上轻松部署机器学习模型。 TFLite 旨在通过硬件加速以及预融合的激活和偏差进行高效和优化。 TFLite 的基本开发工作流程是选择模型转换模型将其部署到所需的设备并优化模型。 该模型可以是任何东西从tf.keras自定义训练模型到从 TF 本身获取的预训练模型。 TFLite 入门 使用 TFLite 的第一步是选择要转换和使用的模型。 这包括使用预训练的模型定制训练的模型或微调的模型。 TFLite 团队提供了一组预训练和预转换的模型可以解决各种机器学习问题。 这些包括图像分类对象检测智能回复姿势估计和分割。 使用经过微调的模型或经过定制训练的模型需要另一步骤将它们转换为 TFLite 格式。 TFLite 旨在在设备上高效地执行模型而这种效率的某些内在原因来自用于存储模型的特殊格式。 TF 模型必须先转换为这种格式然后才能使用… 在移动设备上运行 TFLite 在本节中我们将介绍如何在两种主要的移动操作系统Android 和 iOS上运行 TFLite。 Android 上的 TFLite 在 Android 上使用 TFLite 就像在 Android Studio 的build.gradle文件中的dependencies字段中添加 TFLite 并将其导入 Android Studio 一样容易 dependencies { implementation org.tensorflow:tensorflow-lite:0.0.0-nightly}import org.tensorflow.lite.Interpreter;一旦完成下一步就是创建解释器的实例并加载模型。 可以使用 GitHub 上 TFLite 示例中的getModelPath函数getModelPath和loadModelFile加载转换后的 TFLite 文件来实现。 现在要运行模型只需使用解释器类的.run方法并为其提供所需的输入数据如本例所示 tflite.run(inp,out);inp参数是输入数据它将… iOS 上的 TFLite 在 iOS 上使用 TFLite 的过程与此类似其中包括安装 TFLite 解释器加载模型并运行它。 再次按照“TFLite 入门”部分中的步骤操作以创建和转换机器学习模型以在智能手机上使用。 我们将使用以下步骤在 iOS 上实现 TFLite 通过将 TFLite 添加到项目的root目录中的pod文件中来安装它 use_frameworks! pod TensorFlowLiteSwift通过运行pod install来安装包这将安装pod文件中包括的所有包包括新添加的TFLite包。 安装后可以通过在swift文件顶部附近添加import TensorFlowLite来导入包。 要运行interpreter首先为张量分配内存 let outputTensor: Tensor do {try interpreter.allocateTensors()let inputTensor try interpreter.input(at: 0)然后从图像缓冲区中删除alpha组件以获取rgbData变量 guard let rgbData rgbDataFromBuffer(thumbnailPixelBuffer,byteCount: batchSize * inputWidth * inputHeight * inputChannels,isModelQuantized: inputTensor.dataType .uInt8) else {print(Failed to convert the image buffer to RGB data.)return}接下来将rgbData变量复制到Tensor输入模型中 try interpreter.copy(rgbData, toInputAt: 0)通过调用interpreter函数运行推理 try interpreter.invoke()获取outputTensor函数以处理推理结果 outputTensor try interpreter.output(at: 0) } catch let error {print(Failed to invoke the interpreter with error: \(error.localizedDescription))return }然后可以处理结果并将其显示在应用中。 在低功率机器上运行 TFLite TFLite 能够在低功耗和低二进制计算机上运行的能力使其在嵌入式 Linux 计算机上运行时非常强大。 TFLite 可以在许多流行的嵌入式 Linux 机器以及 Coral Dev Board 上运行。 在本节中我们将介绍在三个设备上 TFLite 的构建编译和运行。 涵盖的第一个设备是带有 Edge TPU 处理器的 Coral Dev Board第二个设备是 NVIDIA Jetson Nano最后一个是 Raspberry Pi。 NVIDIA Jetson Nano 是 NVIDIA 的小型而强大的计算机可在图像分类目标检测分割和语音等应用中并行运行多个神经网络。 在 Edge TPU 处理器上运行 TFLite Edge TPU 是一种小型处理器能够执行深度前馈网络例如卷积神经网络。 但是它仅支持量化的 TFLite 模型。 量化是一种优化技术可将所有 32 位浮点数转换为最接近的 8 位定点数。 这使模型更小更快尽管精度和准确率有所降低。 TF 支持两种类型的量化。 第一种量化方式是训练后量化。 通过将模型优化属性设置为带有tf.lite.Optimize.OPTIMIZE_FOR_SIZE的列表可以在将 TF 模型转换为 TFLite 模型时完成此操作。 这导致权重被转换为 8 位精度从而将延迟增加了多达 3 倍。 网络中其他更多计算密集型操作将转换为具有定点操作但具有浮点内存的混合操作。 另一种量化类型是量化感知训练它使用伪造的量化节点来模拟前向和后向模型中量化的效果 该量化是直接估计。 这是 Edge TPU 支持的唯一量化并允许在其上运行 TFLite 模型。 Edge TPU 有两种可用方式 Coral 开发板其中包含 TPU 以及预安装的所有必需软件和 APIEdge TPU USB 扩展器可在所需计算机上添加另一个处理器 USB 加速器与任何具有运行 Debian 的 USB 端口的 Linux 计算机兼容。 要设置 USB 加速器请从这里下载.tar文件然后解压缩并运行install.sh。 这里要注意的一点是在安装过程中安装程序将要求启用最大工作频率这将大大加快推理时间但也会使 TPU 摸起来很烫。 下图显示了将 TF 模型转换为 Edge TPU 模型并在其上运行的过程 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lCTiwxkG-1681704017945)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/whats-new-tf2/img/ee7dff88-2f0b-4a1a-86b9-966f0c8ce1d7.png)] 但是Edge TPU 有两个约束。 如前所述必须使用量化感知训练对Tensor参数进行量化。 张量大小必须恒定这样就不能有动态大小 模型参数必须恒定 张量必须是一维二维或三维张量或者是三个最里面的大小大于 3 维的张量并且只能包含 Edge TPU 支持的那些操作。 如果不满足这些要求那么将仅编译某些模型。 模型图中发生不支持的操作的第一点是编译器将图分为两部分一部分包含 Edge TPU 可以计算的所有操作另一部分包含它不能计算的操作这些部分将运行在 CPU 上 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W4OjpxEr-1681704017945)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/whats-new-tf2/img/aedc0f8e-e06f-4917-ad0a-41abe07ad00b.png)] 一旦 TFLite 模型已编译并准备好运行就可以使用 Edge TPU 运行时和 API 库执行该模型。 Edge TPU API 具有三个用于推理的关键 API ClassificationEngine API执行图像分类。 要使用它请通过指定模型来创建实例然后将图像传递到该实例的ClassifyWithImage()方法该方法返回标签和分数列表。DetectionEngine API用于执行对象检测。 与先前的 API 一样通过指定模型文件来创建实例然后运行DetectWithImage()方法该方法返回检测候选对象的列表每个候选对象包含一个标签一个得分和该对象的坐标。最终的关键 API 是允许压印的 API一种迁移学习算法可以进行模型重新训练而无需反向传播并且可以在 Edge TPU 上运行。 要运行此 API必须遵循三个步骤 首先确定嵌入张量它是最后一个分类层的输入张量。然后切断最后一个分类层。最后完成嵌入提取器。 Edge TPU 的性能远远优于许多最强大的 CPU。 当在带或不带 USB 加速器的 IntelXeon®3.60 GHz 处理器上测试模型时单个 Edge TPU 能够以每秒 2 瓦的功率每秒执行 4 万亿次操作 嵌入式 1.5 GHz CPU 和珊瑚开发委员会。 在运行 DeepLab 网络时英特尔至强花费了 301 毫秒带加速器的英特尔至强花费了 35 毫秒嵌入式 CPU 花费了 1,210 毫秒而珊瑚开发板花费了 156 毫秒。 显然Edge TPU 对模型的延迟具有重大影响。 在 NVIDIA Jetson Nano 上运行 TF NVIDIA Jetson Nano 是另一种嵌入式设备可为机器学习应用提供强大的计算能力。 Jetson Nano 的前提与 Edge TPU 不同因为 Jetson Nano 是一款小型而功能强大的 GPU 计算机。 Jetson Nano 可以像配置用于深度学习的任何机器一样使用并且可以轻松安装 GPU 版本的 TF。 也不需要安装 CUDA 和 cuDNN因为它已预先安装在系统上。 比较 TFLite 和 TF 如前所述TFLite 模型与普通 TF 模型有很大不同。 TFLite 模型更快更小且计算量更少。 这种区别来自 TFLite 模型的特殊存储和解释方式。 速度的首次提高来自模型存储的基本格式。.tflite模型文件以FlatBuffer格式存储其中包含模型的简化形式和二进制形式。 FlatBuffer是适用于多种流行语言的高效跨平台序列化库由 Google 创建用于游戏开发和其他对性能至关重要的应用。 FlatBuffer格式在有效序列化模型数据并提供对这些数据的快速访问同时保持较小的二进制大小方面起着至关重要的作用。 由于大量的数字数据这对于模型存储很有用这通常会在读取操作中产生很多延迟。 通过使用FlatBuffersTFLite 可以绕过许多传统的文件解析和非解析操作这在计算上非常昂贵。 TFLite 模型优化也一直延伸到设备上的硬件。 这是因为由于电话处理器和嵌入式 CPU 的限制必须以超高效标准使用所有处理器。 在 Android 上运行 TFLite 时可访问 Android 神经​​网络 API该接口可访问 Android 中的硬件加速推理操作并且已接口以利用有利的硬件加速来使用所使用的设备。 TFLite 还可以在电话和其他设备中使用内置的 GPU从而使具有过多可并行化操作和量化敏感精度的模型的速度提高了近 7 倍。 如前所述量化是另一种非常有影响力的优化技术。 量化被视为 TF 中的一种压缩技术。 神经网络中的权重和激活趋向于具有分布在相对较小范围内的三个值因此可以有效地使用量化来压缩这些值。 由于神经网络往往对权重噪声具有鲁棒性因此量化和舍入加到参数上的噪声对模型的整体准确率影响很小。 量化模型的好处在于它可以有效地表示任意范围的范围它们的线性扩展使乘法简单明了而量化权重具有对称范围可以实现下游硬件优化而 32 位浮点数则无法实现。 如下图所示将模型从 TF 转换为量化的 TFLite 模型会大大减少模型的推理时间和延迟 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hPM7g7vJ-1681704017945)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/whats-new-tf2/img/6b0e98ac-64e7-4b03-ad69-abbde7fee70d.png)] AIY Google 为语音和视觉应用发布了自己的制造商套件称为 AIY。 这些套件随附了所有必需的零件和组件以及在线易于理解的教程。 AIY 当前提供两种套件-语音套件和视觉套件。 语音套件 语音工具包提供了构建自然语言处理器并将其连接到 Google Assistant 或 Cloud Speech-to-Text 服务的功能。 该套件随附 Raspberry Pi Zero以及定制设计的语音引擎盖和用于音频功能的扬声器。 该套件还随附可插入 Pi 的 SD 卡以及用于许多最常见应用的大量演示示例和摘要。 它还带有一个在设备上运行 Google Assistant 并将其转变为智能家居设备的应用。 要开始使用语音工具包请按照这个页面上的说明构建设备。 该设备设计合理易于组装和设置。 要设置设备可以使用计算机或手机。 该套件的设置非常简单可以通过安全外壳SSH或 HDMI 连接来完成。 完成后可以运行许多演示来进一步了解和探索该工具包例如前面提到的 Google Assistant 应用。 语音工具包可以完成的一些事情包括创建自定义语音用户界面和使用助手控制 IoT 设备。 可以使用套件中demo文件夹中包含的 Google Cloud 语音转文本 API 和 AIY API 在语音工具包上创建自定义语音用户界面。 该 API 增加了使用 Cloud Speech API语音转文本以及控制 Vision Bonnet 上的 GPIO 引脚的功能。 要使用语音工具包和助手来控制 IoT 设备您可以使用几种强大的技术。 都使用了用于物联网项目的 Wi-Fi 开发套件 Particle Photon 和用于创建对话界面的DialogFlow。 语音套件中包含的演示提供了打开和关闭连接到 Photon 的 LED 的代码。 视觉套件 视觉套件提供了构建智能相机的功能该相机可以使用机器学习来查看和识别对象甚至可以在其上运行自定义 TF 模型。 与语音工具包一样该工具包还附带 Raspberry Pi Zero定制设计的 Vision Bonnet压电蜂鸣器和 Raspberry Pi Camera V2。 该套件随附一个预先存储有 AIY 系统图像的 SD 卡其中包括针对多种计算机视觉应用的演示例如图像分类物体检测人脸检测食物分类和自动拍照。 和以前一样可以按照这里。 该设备有一个简单的… 总结 TFLite 是 TF2.0 的一项功能它采用 TF 模型并对其进行压缩和优化以在嵌入式 Linux 设备或低功耗和低二进制设备上运行。 可以通过三种方式将 TF 模型转换为 TFLite 模型从已保存的模型tf.keras模型或具体函数。 转换模型后将创建一个.tflite文件然后可以将其传输到所需的设备并使用 TFLite 解释器运行。 该模型经过优化以使用硬件加速并以FlatBuffer格式存储以提高读取速度。 可以将其他优化技术应用于该模型例如量化以最小的精度权衡将 32 位浮点数转换为 8 位定点数。 可以在 TFLite 上运行的某些设备是 Edge TPUNVIDIA Jetson Nano 和 Raspberry Pi。 Google 还提供了两个工具包可为用户提供创建与视觉和语音相关的机器学习应用所需的硬件。 在下一章中我们将学习如何从 TF1.x 迁移到 TF2.0。 第 4 部分TensorFlow 2.0 - 迁移总结 本书的本部分将以高级方式总结 TensorFlow 2.0TF 2.0的使用以及与以前版本相比 TF 2.0 的兼容性差异。 如果您使用过 TensorFlow 1.xTF 1.x则本书的这一部分将重点介绍如何迁移到 TF 2.0。 尽管有一个将 TF 1.x 代码转换为 TF 2.0 的迁移 API但它只是进行语法到语法的转换。 本部分还将深入指导您完成从语义上将 TF 1.x 代码转换为 TF 2.0 所需的代码级更改。 本节包含以下章节 第 7 章“从 TensorFlow 1.x 迁移到 2.0” 七、从 TensorFlow 1.x 迁移到 2.0 本章将介绍如何将 TensorFlow 1.xTF 1.x代码转换为 TensorFlow 2.0TF 2.0 代码有两种方式。 第一种方法是使用更新脚本该脚本会更改大多数 TF 1.x 代码以便可以在 TF 2.0 中运行。 但是这仅将所有tf.x API 调用转换为tf.compat.v1.x格式。 另一种方法是考虑到对库所做的核心更改将 TF 1.x 代码转换为惯用的 TF2.0 代码。 我们将讨论 TF 1.x 和 TF 2.0 之间的概念差异它们之间的兼容性标准以及我们在语法和语义上进行迁移的方式。 我们还将展示从 TF 1.x 到 TF 2.0 的语法和语义迁移的几个示例我们将通过它们提供参考和将来的信息。 本章将涵盖以下主题 TF 2.0 的主要变化适用于 TF 2.0 的推荐技术使代码 TF 2.0 原生常见问题TF 2.0 的未来 TF 2.0 的主要变化 从 TF 1.x 迁移到 TF 2.0 时您将遇到的主要变化涉及 API 清理。 TF 2.0 中的许多 API 都已被删除或移动。 主要更改包括删除tf.apptf.flags和tf.logging以支持其他 Python 模块例如absl-py和内置的日志记录系统。 TF 2.0 在代码方面所做的最大更改之一就是急切执行。 TF 1.x 要求用户使用tf.*调用来手工拼接抽象语法树以构建计算图该图将与session.run()一起运行。 这意味着 TF 2.0 代码逐行运行因此不再需要tf.control_dependancies()。 TF 1.x 中的session.run()调用与…非常相似。 适用于 TF 2.0 的推荐技术 第一条建议涉及在 TF 2.0 中处理常规代码工作流。 TF 1.x 中常见的工作流程是使用瀑布策略其中所有计算都布置在默认图上。 然后使用session.run()运行选定的张量。 在 TF 2.0 中应将代码重构为较小的函数这些函数将在需要时调用。 这些函数可以是普通的 Python 函数但如果在另一个以tf.function注解的函数中调用它们则仍可以在图模式下运行。 这意味着tf.function仅应用于注解高级计算例如模型的前向传递或单个训练步骤。 以前模型和训练循环所需的所有计算都将预先确定并编写并使用session.run()执行。 这使得 TF 1.x 代码对于大多数编码人员来说很难遵循因为模型的流程可能与图的编码方式完全不同因为该图是在最后运行的。 急切执行和tf.function专门用于简化 TensorFlow 代码动态过程并使其他开发人员更容易理解预编写的代码。 管理和跟踪变量是 TF 1.x 中另一个复杂的过程。 使用了许多方法来控制和访问这些变量这为线性代码增加了更多的维度。 TF 2.0 更加强调使用tf.keras层和tf.estimator模型来管理模型中的变量。 这与手动滚动神经网络层和手动创建变量形成对比。 在以下示例中必须跟踪权重和偏差变量其形状的定义应远离模型的创建。 这使得难以更改模型并使模型适应不同的架构和数据集 def dense(x, W, b):return tf.nn.sigmoid(tf.matmul(x, W) b)tf.function def multilayer_perceptron(x, w0, b0, w1, b1, w2, b2 ...):x dense(x, w0, b0)x dense(x, w1, b1)x dense(x, w2, b2)...此代码的tf.keras实现非常简单明了并确保开发人员不必担心变量和变量名的组织和管理。 它还可以轻松访问模型中的可训练变量 layers [tf.keras.layers.Dense(hidden_size, activationtf.nn.sigmoid) for _ in range(n)] perceptron tf.keras.Sequential(layers)# layers[3].trainable_variables returns [w3, b3] # perceptron.trainable_variables returns [w0, b0, ...]tf.keras模型还继承了tf.train.Checkpointable模型的方法并与tf.function集成在一起因此可以将它们直接保存到检查点并导出到SavedModels。 以下是迁移学习实现的示例并显示tf.keras如何使收集相关值的子集计算其梯度以及基于梯度对其进行调整变得容易 trunk tf.keras.Sequential([...]) head1 tf.keras.Sequential([...]) head2 tf.keras.Sequential([...])path1 tf.keras.Sequential([trunk, head1]) path2 tf.keras.Sequential([trunk, head2])# Train on primary dataset for x, y in main_dataset:with tf.GradientTape() as tape:prediction path1(x)loss loss_fn_head1(prediction, y)# Simultaneously optimize trunk and head1 weights.gradients tape.gradient(loss, path1.trainable_variables)optimizer.apply_gradients(zip(gradients, path1.trainable_variables))# Fine-tune second head, reusing the trunk for x, y in small_dataset:with tf.GradientTape() as tape:prediction path2(x)loss loss_fn_head2(prediction, y)# Only optimize head2 weights, not trunk weightsgradients tape.gradient(loss, head2.trainable_variables)optimizer.apply_gradients(zip(gradients, head2.trainable_variables))# You can publish just the trunk computation for other people to reuse. tf.saved_model.save(trunk, output_path)所有尚未存储在内存中的数据集都应使用tf.dataset进行存储和流传输。 数据集在 TF 2.0 中是可迭代的因此在急切的执行模式下它们可以像任何其他 Python 可迭代的一样使用例如列表和元组。 您还可以通过使用tf.function包装数据集迭代来利用数据集异步预取和流传输功能该迭代将 Python 交互转换为与 AutoGraph 等效的图操作。 正如我们在本书前面所提到的AutoGraph 采用默认的 Python 流并将其转换为基于图的代码。 例如诸如if...else块之类的控制流将转换为tf.condition语句。 以下代码块向您展示了如何使用for块训练模型 tf.function def train(model, dataset, optimizer):for x, y in dataset:with tf.GradientTape() as tape:prediction model(x)loss loss_fn(prediction, y)gradients tape.gradient(loss, model.trainable_variables)optimizer.apply_gradients(zip(gradients, model.trainable_variables))但是如果您正在使用 Keras 的model.fit则不必担心。 要使用model.fit在数据集上训练模型只需将数据集传递给方法。 它将处理其他所有事项 model.compile(optimizeroptimizer, lossloss_fn) model.fit(dataset)使代码 TF 2.0 原生 使 TF 1.x 代码与 TF 2.0 代码兼容的最简单方法是运行系统上安装的更新脚本以及 TF 2.0 安装。 更新脚本使用tf.compat.v1模块。 为了向 TF 1.x 编写的代码提供向后兼容性在 TF 2.0 中引入了tf.compat.v1模块。 tf.compat.v1模块替换了所有 TF 1.x 符号例如tf.foo和tf.compat.v1.foo。 此模块允许转换为 TF 1.x 编写的大多数代码以便可以在 TF 2.0 中运行。 作为简化此过程的一种方式TensorFlow 提供了tf_upgrade_v2工具该工具有助于尽可能简化转换。 该工具已预装… 转换 TF 1.x 模型 第一步是将所有tf.Session.run()调用替换为 Python 函数。 这意味着将tf.placeholder和feed_dict转换为函数参数。 这些成为函数的返回值。 此更改意味着与 TF 1.x 不同可以使用标准的 Python 工具例如pdb来逐步调试该功能。 构建函数后可以添加tf.function注解以在图模式下运行该函数以及 TF 1.x 中等效的tf.Session.run调用的效率。 使用tf.layers API 创建的 TF 1.x 模型可以相对容易地转换为 TF 2.0。 tf.layers模块用于包含依赖于tf.variable_scope定义和重用变量的层函数。 以下代码块是使用tf.layers API 编写的 TF 1.x 中小型卷积神经网络的实现 def model(x, training, scopemodel):with tf.variable_scope(scope, reusetf.AUTO_REUSE):x tf.layers.conv2d(x, 32, 3, activationtf.nn.relu,kernel_regularizertf.contrib.layers.l2_regularizer(0.04))x tf.layers.max_pooling2d(x, (2, 2), 1)x tf.layers.flatten(x)x tf.layers.dropout(x, 0.1, trainingtraining)x tf.layers.dense(x, 64, activationtf.nn.relu)x tf.layers.batch_normalization(x, trainingtraining)x tf.layers.dense(x, 10, activationtf.nn.softmax)return xtrain_out model(train_data, trainingTrue) test_out model(test_data, trainingFalse)将模型转换为 TF 2.0 的最简单方法是使用tf.keras.Sequential因为该模型由线性层组成。 从tf.layers到tf.keras.layers有一对一的转换但有一些区别。 在 TF 2.0 代码中训练参数不再传递给每个层因为模型会自动处理该参数。 这是 TF 2.0 中的代码 model tf.keras.Sequential([tf.keras.layers.Conv2D(32, 3, activationrelu,kernel_regularizertf.keras.regularizers.l2(0.04),input_shape(28, 28, 1)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dropout(0.1),tf.keras.layers.Dense(64, activationrelu),tf.keras.layers.BatchNormalization(),tf.keras.layers.Dense(10, activationsoftmax) ])train_data tf.ones(shape(1, 28, 28, 1)) test_data tf.ones(shape(1, 28, 28, 1))train_out model(train_data)test_out model(test_data, trainingFalse)如我们所见tf.variable_scope没有用于组织为模型创建的变量。 在 TF 1.x 中该范围将用于从模型中恢复变量。 在 TF 2.0 中可以使用model.trainable_variables列出模型变量。 尽管从tf.layers到tf.keras.layers的转换相对简单但是由于代码流的差异转换变得更加复杂。 TF 1.x 中的低级 API 的一些示例包括使用变量作用域来控制重用使用tf.get_variable创建变量使用tf.placeholder和session.run定期访问集合以及手动初始化变量。 由于引入了系统范围内的急切执行这些技术和策略中的许多现在已过时因此以低级 API 编写的代码比以高级 API 编写的代码例如tf.keras和tf.layers需要更大的更改。 。 以下是使用 TF 1.x 的低级 API 编写的一些代码的示例 in_a tf.placeholder(dtypetf.float32, shape(2)) in_b tf.placeholder(dtypetf.float32, shape(2))def forward(x):with tf.variable_scope(matmul, reusetf.AUTO_REUSE):W tf.get_variable(W, initializertf.ones(shape(2,2)),regularizertf.contrib.layers.l2_regularizer(0.04))b tf.get_variable(b, initializertf.zeros(shape(2)))return W * x bout_a forward(in_a) out_b forward(in_b)reg_loss tf.losses.get_regularization_loss(scopematmul)with tf.Session() as sess:sess.run(tf.global_variables_initializer())outs sess.run([out_a, out_b, reg_loss],feed_dict{in_a: [1, 0], in_b: [0, 1]})可以通过将前向函数更改为用tf.function注解的函数进行基于图的计算删除session.run函数和变量范围并添加简单的函数调用来转换此代码。 将不会在W变量上全局调用正则化 相反它将被手动调用而无需引用全局集合 W tf.Variable(tf.ones(shape(2,2)), nameW) b tf.Variable(tf.zeros(shape(2)), nameb)tf.function def forward(x):return W * x bout_a forward([1,0]) out_b forward([0,1])regularizer tf.keras.regularizers.l2(0.04) reg_loss regularizer(W)正如我们所看到的TF 2.0 代码比以前的 TF 1.x 代码更加 Python 化和简洁。 使用tf.placeholder的好处之一是可以控制图输入的形状如果输入与预定形状不匹配则会返回错误。 在 TF 2.0 中仍然可以通过使用 Python 内置的assert命令来完成此操作。 这可以用来断言该函数的输入自变量的形状与输入自变量所期望的形状匹配。 现有的 TF 1.x 代码通常同时包含较低级别的 TF 1.x 变量和具有较高级别tf.layers的操作。 这意味着上述示例都不足以转换 TF 1.x 代码并且需要tf.keras编程的更复杂形式称为模型或层子类。 以下是在 TF 1.x 中使用tf.get_variable和tf.layers编写的原始代码 def model(x, training, scopemodel):with tf.variable_scope(scope, reusetf.AUTO_REUSE):W tf.get_variable(W, dtypetf.float32,initializertf.ones(shapex.shape),regularizertf.contrib.layers.l2_regularizer(0.04),trainableTrue)if training:x x Welse:x x W * 0.5x tf.layers.conv2d(x, 32, 3, activationtf.nn.relu)x tf.layers.max_pooling2d(x, (2, 2), 1)x tf.layers.flatten(x)return xtrain_out model(train_data, trainingTrue) test_out model(test_data, trainingFalse)通过将所有低层操作和变量包装在自定义创建的 Keras 层中可以转换此代码。 这可以通过创建一个从tf.keras.layers.Layer类继承的类来完成 # Create a custom layer for part of the model class CustomLayer(tf.keras.layers.Layer):def __init__(self, *args, **kwargs):super(CustomLayer, self).__init__(*args, **kwargs)def build(self, input_shape):self.w self.add_weight(shapeinput_shape[1:],dtypetf.float32,initializertf.keras.initializers.ones(),regularizertf.keras.regularizers.l2(0.02),trainableTrue)# Call method will sometimes get used in graph mode,# training will get turned into a tensortf.functiondef call(self, inputs, trainingNone):if training:return inputs self.welse:return inputs self.w * 0.5前面的代码创建了一个名为CustomLayer的类该类继承了tf.keras.layers.Layer类的属性。 此技术允许在tf.keras模型内部使用任何类型的低级代码而不管它是使用Sequential API 还是functional API 的模型。 此类中有两种方法 build()此方法修改继承的类的默认生成方法。 在这种方法中应该创建模型所需的所有变量。 尽管可以在模型的the __init__()方法中完成此操作但建议使用build()以便在正确的最佳时间构建变量。 可以使用self.add_weight函数完成此操作以使 Keras 跟踪变量和正则化损失。call()在输入张量上调用模型时将运行此方法。 此方法通常采用两个参数inputs和training。 尽管inputs参数是不言自明的但training参数可能不会一直使用但是对于在该层中使用批量规范化和丢弃的情况而言是必不可少的。 该功能由tf.function装饰器注解以实现签名基于图的优点以及自动控件的依赖关系。 写入此自定义层后即可在tf.keras模块中的任何位置使用它。 对于此转换将使用Sequential API train_data tf.ones(shape(1, 28, 28, 1)) test_data tf.ones(shape(1, 28, 28, 1))# Build the model including the custom layer model tf.keras.Sequential([CustomLayer(input_shape(28, 28, 1)),tf.keras.layers.Conv2D(32, 3, activationrelu),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(), ])train_out model(train_data, trainingTrue) test_out model(test_data, trainingFalse)升级训练循环 将 TF 1.x 代码转换为惯用的 TF 2.0 代码的第二步是升级训练管道。 TF 1.x 训练管道涉及对优化器损失和预测的多个tf.Session.run()调用。 这样的训练循环还涉及样板代码该样板代码被编写为将训练结果记录到控制台以方便监督。 在 TF 2.0 中可以使用三种类型的训练循环。 这些循环中的每一个都有不同的优点和缺点并且难度API 级别和复杂性各不相同。 它们如下 第一种训练循环是tf.keras.Model.fit()。 这是一个内置的训练循环可处理训练的所有方面并为各种 Keras 提供统一的接口… 转换时要注意的其他事项 从 TF 1.x 迁移到 TF 2.0 时还需要进行其他几个主要转换。 比起我们先前描述的对话要困难得多的对话是将以 TF-Slim 编写的代码转换为 TF 2.0。 由于 TF-Slim 打包在tf.contrib.layers库下因此即使在兼容性模块中它也无法在 TF 2.0 中使用。 这意味着要将 TF-Slim 代码转换为 TF 2.0 格式通常需要更改整个代码动态。 这包括从代码中删除参数范围因为所有参数在 TF 2.0 中都应明确。 normalizer_fn和activation_fn函数应分为各自的层。 请注意TF-Slim 层的参数名称和默认值与tf.keras层不同。 将 TF-Slim 模型转换为 TF 2.0 的最简单方法是将其转换为 TF 1.x 中的tf.layers API然后将其转换为tf.keras.layers。 另一个需要注意的转换细节是在 TF 2.0 中所有指标都是具有三种主要方法的对象update_state()添加新的观察值result()获取指标的当前结果和reset_states() 清除所有观察结果。 度量对象也是可调用的并且在新观察值上调用时它们会累加值并返回最新结果。 以下示例向我们展示了如何在自定义训练循环中使用指标 创建度量标准对象该度量标准对象在每次调用时都会累积度量标准数据 loss_metric tf.keras.metrics.Mean(nametrain_loss) accuracy_metric tf.keras.metrics.SparseCategoricalAccuracy(nametrain_accuracy)tf.function def train_step(inputs, labels):with tf.GradientTape() as tape:predictions model(inputs, trainingTrue)regularization_loss tf.math.add_n(model.losses)pred_loss loss_fn(labels, predictions)total_loss pred_loss regularization_lossgradients tape.gradient(total_loss, model.trainable_variables)optimizer.apply_gradients(zip(gradients, model.trainable_variables))更新指标 loss_metric.update_state(total_loss)accuracy_metric.update_state(labels, predictions)for epoch in range(NUM_EPOCHS):重置指标 loss_metric.reset_states()accuracy_metric.reset_states()for inputs, labels in train_data:train_step(inputs, labels)获取度量结果 mean_loss loss_metric.result() mean_accuracy accuracy_metric.result()print(Epoch: , epoch) print( loss: {:.3f}.format(mean_loss)) print( accuracy: {:.3f}.format(mean_accuracy))常见问题 在本节中将解决有关从 TF 1.x 迁移到 TF 2.0 的一些常见问题。 用 TF 2.0 编写的代码的速度是否与基于图的 TF 1.x 代码相同 是的使用tf.function或tf.keras在 TF 2.0 中编写的代码将具有与 TF 1.x 相同的速度和最优性。 正如我们在本章前面提到的那样使用tf.function注解主要功能允许模型以图模式运行并且该功能中的所有计算和逻辑都将编译为一个计算图。 使用tf.keras定义和训练 TensorFlow 模型也是如此。 使用model.fit方法还将在图模式下训练模型并具有所有优点和优化功能这些优点和优点包括 TF 2.0 的未来 TF 2.0 目前处于 beta 版本因此仍在开发中。 即将出现的一些关键功能包括对包的修改例如 TensorBoardTensorFlow LiteTensorFlow.js用于 TensorFlow 的 Swift 和 TensorFlow Extended以及对基本 API 的微小更改。 TensorBoard 将看到增强功能例如改进的超参数调优功能引入托管功能以使共享仪表板变得容易并使插件能够使用不同的前端技术例如 ReactJS。 TensorFlow Lite 将扩大支持的操作范围将 TF 2.0 模型更轻松地转换为 TFLite并扩展对 Edge TPU 和 AIY 板的支持。 TensorFlow.js 和用于 TensorFlow 的 Swift 都将看到速度和性能方面的改进并且很快将包含一组丰富的示例和带有端到端教程的入门指南。 TF Extended 即将与 TF 2.0 基本 API 完全集成并将包括完全协调的端到端工作流程和训练函数。 TF 2.0 基本 API 将包括针对任务的更多预制估计器例如增强树随机森林最近邻搜索和 k 均值聚类。 tf.distribute.Strategy模型将扩展其对 Keras 子模型TPU 和多节点训练的支持以在多个处理器上实现更优化和更快的训练。 当前正在开发的另一个主要附加功能是tf-agents模块。 该模块将核心强化学习算法实现为智能体该算法定义了与环境进行交互的策略并从集体经验中训练了该策略。 TF-agents与 OpenAI Gym 框架一起实现并抽象了许多用于开发的关键强化学习算法。 该模块当前处于预发布状态但将于今年晚些时候发布。 可看的更多资源 可以在 TensorFlow Beta 网站上找到教程和许多其他资源其中包含有关创建和训练机器学习模型的关键因素的信息。 该页面还为该领域的许多重要技术提供了许多有用的端到端教程。 可以在网站上找到 TF 2.0 的官方文档以及该模块中每个 API 的详细文档。 该站点还具有指向其他 TensorFlow 模块和功能的链接。 TensorFlow Medium 博客还提供有关 TensorFlow 库和服务状态的许多更新并且源源不断的有用新闻和… 总结 本章介绍了两种将 TF 1.x 代码转换为 TF 2.0 代码的方法。 第一种方法是使用随附的升级脚本该脚本会将所有 API 调用从tf.x更改为tf.compat.v1.x。 这允许 TF 1.x 代码在 TF 2.0 中运行但不会从 TF 2.0 中带来的升级中受益。 第二种方法是将 TF 1.x 更改为惯用的 TF 2.0 代码这涉及两个步骤。 第一步是将所有模型创建代码更改为 TF 2.0 代码这涉及使用对函数的sess.run调用以及将占位符和字典馈入函数的参数来更改张量。 使用tf.layers API 创建的模型与tf.keras.layers具有一对一的比较。 第二步是通过使用tf.keras.Model.fit或带有tf.GradientTape的自定义训练循环来升级训练管道。 TF 2.0 改变了 TensorFlow 代码的编写和组织方式。 TF 2.0 中的一些主要更改是对主模块中 API 的重组和清理。 这包括删除tf.contrib模块。 其他更改包括增加了代码范围内的急切执行以简化调试和使用范围。 由于急切执行因此在 TF 2.0 中创建的变量的行为类似于普通的 Python 变量。 这意味着用于处理全局变量的 TF 1.x API 已过时因此已在 TF 2.0 中删除。 这使我们到书的结尾
http://www.hkea.cn/news/14344930/

相关文章:

  • 宿舍网站建设目的长沙 网站建设
  • 搜索引擎的网站推广方式建一个网站需要购买域名 虚拟主机
  • 企业网站代建设网站建设行业赚钱么
  • 广州做创客教室的厂家网站贵州网站建设工作室
  • 网站专题框架怎么做网页设计行业市场分析
  • 平安做计划书的网站民宿行业网站建设方案
  • 网站建设 自动生成哪些网站做的不好用
  • 如何写网站代码是什么原因江门百度seo
  • 给网站做seo的必要性网站返回500错误页面
  • 番禺网站建设培训学校做网站一月能赚50万吗
  • 滕州市中远建设工程公司网站首页推广什么
  • 前端做用vue做后台多还是做网站多常州云之家网站建设公司怎么样
  • 临汾建设局网站用手机做网站好学吗
  • 阿里云网站建设步骤台州千寻网站建设公司
  • 网站建设方案格式网站怎么建设后台
  • 做网站要服务器和什么怎么找精准客户资源
  • 医疗网站建设好么wordpress 取消置顶
  • 建设厅企业锁在哪个网站登录工程建设信息网站资质公告
  • 特价网站建设价格低安徽六安什么时候解封
  • 深圳网站建设比较精品网站欣赏
  • 漂亮产品网站本地网站搭建
  • 为网站做一则广告语做网站需要什么营业执照
  • 做网站怎样用链接赚钱iis6添加网站
  • 北京网站制做的公司广西壮族自治区博物馆
  • 深圳建设资格注册中心网站wordpress自动博客
  • 昆明市住房和城乡建设局网站网站开发后台一般用什么
  • 旅行社网站规划与建设的流程图专业培训大全
  • 永川网站制作wordpress 多站点开启
  • 建网站建设网站建筑设计机构
  • 广西建设网站官网网站建设发展史