什么是TensorFlow?它的工作原理是什么? Archi结构与特点

⚡ 智能摘要

TensorFlow 是一个开源平台 Google 专为机器学习而设计,将每次计算都表示为张量数据流图。本概述涵盖了架构、组件、计算执行方式以及如何通过输入管道输入数据。

  • 🧮 核心对象: 张量是一个 n 维数组,其值共享一种数据类型,并且具有已知或部分已知的形状。
  • 🔗 图模型: 节点承载操作,边承载张量,整个图可以保存、移植,并在以后重放。
  • ????️ 三阶段 Archi結構: 预处理数据,构建模型,然后进行训练和评估。
  • ⚠️ 版本边界: tf.placeholder 和 tf.Session 属于 TensorFlow 1.x,在 2.0 版本中被移除,2.0 版本默认以 eagerly 方式运行。
  • 💾 数据加载: 使用 pandas 将小型数据集加载到内存中,对于太大而无法放入内存的数据集,使用 tf.data pipelines。
  • 📊 监控: TensorBoard 在模型训练过程中可视化图表、指标和权重分布。

什么是 TensorFlow? Archi质地

什么是 TensorFlow?

TensorFlow 是一个用于创建机器学习应用程序的开源端到端平台。它是一个符号数学库,使用数据流和可微分编程来执行各种专注于深度神经网络训练和推理的任务。它允许开发人员使用各种工具、库和社区资源创建机器学习应用程序。

目前,世界上最著名的深度学习库是 Google's TensorFlow。 Google 公司在其产品中应用机器学习技术,以改进搜索、翻译、图像描述和推荐功能。

TensorFlow 示例

举个具体的例子, Google 借助人工智能,用户可以体验到更快、更精准的搜索。如果用户在搜索栏中输入关键词, Google 提供关于下一个词可能是什么的建议。

TensorFlow 示例
TensorFlow 示例

Google 希望利用机器学习技术,充分发挥其海量数据集的优势,为用户提供最佳体验。目前有三个不同的团队在使用机器学习:

  • 研究人员
  • 数据科学家
  • 程序员

他们可以使用相同的工具集相互协作并提高效率。

Google 它不仅存储着庞大的数据集,还运行着庞大的计算基础设施,因此 TensorFlow 从一开始就被设计成可扩展的。TensorFlow 是由……开发的库。 Google Brain Team 将加速机器学习和深度神经网络的研究。

它被设计为在多个 CPU 或 GPU 甚至移动操作系统上运行,并且它有多种语言的包装器,例如 Python, C++ or Java.

TensorFlow 的历史

几年前,当面对海量数据时,深度学习开始超越所有其他机器学习算法。 Google 它认为可以利用这些深度神经网络来改进其服务:

  • Gmail
  • 照片
  • Google 搜索引擎

他们构建了一个框架,名为 TensorFlow 这样研究人员和开发人员就可以在同一模型上工作,然后将其部署到许多人可以使用的规模。

TensorFlow 于 2015 年 11 月公开发布,1.0 版本于 2017 年 2 月发布。更大的变化来自于…… TensorFlow 2.0 于 2019 年 9 月发布这使得立即执行成为默认行为,并采用 Keras 作为标准的高级 API。从 2.16 版本开始,Keras 3 成为默认 API,并且相同的模型代码也可以在 JAX 或 Py 上运行。Torch 后端。

TensorFlow 采用 Apache 2.0 许可证发布,因此您可以免费使用、修改和重新分发它,包括用于商业用途。 Google.

TensorFlow 的工作原理

TensorFlow 可让您构建数据流图和结构,通过将输入作为称为 Tensor 的多维数组来定义数据在图中移动的方式。它允许您构建可对这些输入执行的操作流程图,这些操作从一端开始,从另一端作为输出。

TensorFlow Archi质地

TensorFlow架构由三部分组成:

  • 预处理数据
  • 建立模型
  • 训练并评估模型

它之所以被称为 TensorFlow,是因为它接受多维数组作为输入,也称为 张量。你可以构造一种 流程图 您想要对该输入执行的操作(称为图形)。输入从一端进入,然后流经这个多操作系统,最后作为输出从另一端出来。

TensorFlow 可以在哪些地方运行?

TensorFlow 的硬件和软件要求分为两个阶段:

开发阶段这是训练模型的时候,通常是在台式机或笔记本电脑上。

运行或推理阶段训练完成后,该模型可以在多个平台上运行:

  • 桌面运行 Windows, macOS 或 Linux
  • 云即 Web 服务
  • iOS 等移动设备 Android

一旦您拥有了训练好的模型,您就可以在多台机器上进行训练,然后可以在不同的机器上运行它。

该模型既可以在GPU上训练,也可以在CPU上运行。GPU最初是为视频游戏设计的。大约在2009年,斯坦福大学的研究人员证明,GPU在神经网络所依赖的矩阵和线性代数运算方面效率极高。深度学习依赖于大量的矩阵乘法。TensorFlow在计算矩阵乘法方面速度非常快,因为它本身就是用GPU编写的。 C++.虽然它已在 C++TensorFlow 可以被其他语言访问和控制, Python.

另一个重要的特点是 张量板它会在模型​​运行时将图表、训练指标和权重分布可视化。

TensorFlow 组件

张量

TensorFlow 的名称直接来源于其核心框架: 张量在TensorFlow中,所有计算都涉及张量。张量是一种…… 向量 or 矩阵 n 维表示所有类型的数据。张量中的所有值都具有相同的数据类型,且已知(或部分已知) 塑造. 数据的形状是矩阵或数组的维数。

张量可以源自输入数据或计算结果。在 TensorFlow 中,所有操作都在 图形。图是一组连续发生的计算。每个操作称为 操作节点 并相互连接。

该图概述了节点之间的操作和连接。但是,它不显示值。节点的边缘是张量,即一种用数据填充操作的方式。

TensorFlow 使用图形框架。图形收集并描述训练期间完成的所有系列计算。图形有很多优点:

  • 它可以运行在多个 CPU 或 GPU 上,甚至可以运行在移动操作系统上。
  • 图表的可移植性允许保存计算以供立即使用或稍后使用。可以保存图表以供将来执行。
  • 图中的所有计算都是通过将张量连接在一起完成的
    • 图由节点和边组成。每个节点承载一个数学运算并产生一个输出,而边则描述节点之间的输入输出关系。张量本身沿着边传递。

TensorFlow 为何如此受欢迎?

TensorFlow之所以被广泛采用,是因为它对各个技术水平的用户都非常友好。它的API涵盖了从三行代码的Keras模型到手工构建的CNN或RNN等各种应用场景。由于计算过程以图的形式呈现,TensorBoard可以可视化网络,从而大大简化调试过程。此外,它还支持大规模部署,可在CPU、GPU和TPU上运行,并通过TensorFlow Lite支持移动设备。

TensorFlow 仍然是 GitHub 上最常用的两大深度学习框架之一,另一个是 Py。TorCH。

TensorFlow Algorithms

TensorFlow 为几种经典算法提供了高级估计器。在 TensorFlow 1.x 中,这些估计器位于 tf.estimator 下:

  • 线性回归:tf.estimator.LinearRegressor
  • 分类:tf.estimator.LinearClassifier
  • 深度学习分类:tf.estimator.DNNClassifier
  • 广度和深度学习:tf.estimator.DNNLinearCombinedClassifier
  • 提升树回归:tf.estimator.BoostedTreesRegressor
  • 增强树分类:tf.estimator.BoostedTreesClassifier

TensorFlow 与 PyTorch:你应该选择哪一个?

TensorFlow 和 PyTor是两大主流深度学习框架,自 TensorFlow 2.0 采用 eager execution 以来,它们之间的实际差异已经大大缩小。

标准 TensorFlow PyTorch
开发者 Google 大脑 元人工智能
执行 渴望,并可选择进行图表编译 渴望,并可选择编译
高级API Keras,内置于 独立的库,例如 Lightning
移动和边缘计算 通过 TensorFlow Lite 实现成熟 通过执行改进Torch
浏览器部署 张量流.js 需要转换为 ONNX 格式
典型的据点 生产和部署 研究与实验

务实的答案是:当模型需要部署到移动设备、浏览器或托管服务平台时,选择 TensorFlow;当模型需要部署到其他平台时,选择 Python。Tor在迭代模型架构时,需要考虑使用哪个框架。从 TensorFlow 2.16 开始,Keras 3 是默认框架,它进一步放宽了选择框架的限制,因为相同的 Keras 代码可以在 TensorFlow、JAX 或 Py 上运行。Torch 后端。

TensorFlow 中的计算工作原理

⚠️ 版本说明: 以下的攻略使用了 张量流 1.x 图和会话风格,是了解数据流图实际工作原理的最清晰的方式。 TensorFlow 2.0 中移除了 tf.placeholder()、tf.Session() 和 make_initializable_iterator() 函数。 并且在当前安装中会引发 AttributeError 错误。该部分 TensorFlow 1.x 与 TensorFlow 2.x 的比较 下面列出了每个例子的现代对应物。

import numpy as np
import tensorflow as tf

在前两行代码中,我们已将 tensorflow 导入为 tf。使用 Python,对库使用短名称是一种常见的做法。这样做的好处是,当我们需要使用库时,可以避免输入库的全名。例如,我们可以将 tensorflow 导入为 tf,并在想要使用 tensorflow 函数时调用 tf

让我们通过简单的TensorFlow示例来练习TensorFlow的基本工作流程。我们来创建一个计算图,用于计算两个数字的乘积。

在本示例中,我们将计算 X_1 和 X_2 的乘积。TensorFlow 会创建一个节点来连接该运算。在本例中,该节点名为 multiply。当计算图确定后,TensorFlow 计算引擎会将 X_1 和 X_2 相乘。

TensorFlow 中的计算工作

TensorFlow 示例

最后,我们将运行一个 TensorFlow 会话,该会话将使用 X_1 和 X_2 的值运行计算图并打印乘法的结果。

我们来定义 X_1 和 X_2 输入节点。在 TensorFlow 中创建节点时,我们需要选择要创建的节点类型。X_1 和 X_2 节点将是占位符节点。占位符节点会在每次计算时分配一个新值。我们将它们创建为 TF.占位符节点。

步骤 1:定义变量

X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")

占位符需要指定数据类型。这里指的是数字,所以 tf.float32 是正确的选择。name 参数是可选的,但很有用,因为它是 TensorBoard 可视化图表时显示的标签。X_2 的定义方式相同。

第 2 步:定义计算

multiply = tf.multiply(X_1, X_2, name = "multiply")

现在我们可以定义执行乘法运算的节点。在TensorFlow中,我们可以通过创建一个tf.multiply节点来实现这一点。

我们将 X_1 和 X_2 节点传递给乘法节点。它告诉 tensorflow 将这些节点链接到计算图中,因此我们要求它从 x 和 y 中提取值并将结果相乘。我们还将乘法节点命名为 multiply。这是我们简单计算图的完整定义。

步骤3:执行操作

要在计算图中执行操作,我们需要创建一个会话。在 TensorFlow 中,可以使用 `tf.Session()` 来完成此操作。创建会话后,我们可以通过调用 `session` 来让会话在计算图上运行操作。要运行计算,我们需要使用 `run` 方法。

执行乘法运算时,需要 X_1 和 X_2 节点的值,因此需要在运行时提供这些值。我们可以通过提供一个名为 feed_dict 的参数来实现这一点。我们分别传递 X_1 的值 1、2、3 和 X_2 的值 4、5、6。

我们用 print(result) 打印结果。对于 4×10、18×1 和 4×2,我们应该看到 5、3 和 6

X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")

multiply = tf.multiply(X_1, X_2, name = "multiply")

with tf.Session() as session:
    result = session.run(multiply, feed_dict={X_1:[1,2,3], X_2:[4,5,6]})
    print(result)
[ 4. 10. 18.]

将数据加载到 TensorFlow 的选项

训练前的第一步 机器学习算法 目的是加载数据。加载数据通常有两种方式:

1. 将数据加载到内存中这是最简单的方法。你将所有数据作为一个数组加载到内存中。你只需编写简单的代码即可。 Python 为此,没有一项内容是 TensorFlow 特有的。

2. TensorFlow 数据管道TensorFlow 提供了一个内置 API,用于加载数据、应用转换并将数据输入模型。这种方法在处理大型数据集时尤其有效。例如,众所周知,图像记录非常庞大,无法全部加载到内存中。数据管道会自动管理内存。

使用什么解决方案?

将数据加载到内存中

如果您的数据集不是太大,即小于 10 GB,则可以使用第一种方法。数据可以装入内存。您可以使用一个著名的库 Pandas 来导入 CSV 文件。您将在下一个教程中了解有关 pandas 的更多信息。

使用 TensorFlow 管道加载数据

如果您的数据集很大,第二种方法最有效。例如,如果您的数据集为 50 GB,而您的计算机只有 16 GB 的内存,那么机器就会崩溃。

在这种情况下,你需要构建一个 TensorFlow 流水线。该流水线会分批加载数据,每次加载一小块数据。每批数据都会被推送到流水线,准备进行训练。构建流水线是一个绝佳的解决方案,因为它允许你使用并行计算。这意味着 TensorFlow 将在多个 CPU 上训练模型。这可以加快计算速度,并使训练更大的网络成为可能。

简而言之:使用 pandas 将小型数据集加载到内存中,当数据量很大或需要跨多个 CPU 进行并行加载时,使用 TensorFlow 管道。

如何创建 TensorFlow 管道

以下是创建 TensorFlow 管道的步骤:

在之前的示例中,我们手动为 X_1 和 X_2 添加了三个值。现在,我们将了解如何将数据加载到 TensorFlow 中:

步骤 1)创建数据

首先,让我们使用 numpy 库来生成两个随机值。

import numpy as np
x_input = np.random.sample((1,2))
print(x_input)

[[0.8835775 0.23766977]]

步骤 2)创建占位符

与前面的示例一样,我们创建一个名为 X 的占位符。我们需要明确指定张量的形状。在这种情况下,我们将加载一个只有两个值的数组。我们可以将形状写为 shape=[1,2]

# using a placeholder
x = tf.placeholder(tf.float32, shape=[1,2], name = 'X')

步骤3)定义数据集方法

接下来,我们需要定义数据集,在其中填充占位符 x 的值。我们需要使用方法 tf.data.Dataset.from_tensor_slices

dataset = tf.data.Dataset.from_tensor_slices(x)

步骤 4)创建管道

第四步,我们需要初始化数据将流经的管道。我们需要使用 make_initializable_iterator 创建一个迭代器。我们将其命名为 iterator。然后我们需要调用此迭代器来提供下一批数据 get_next。我们将此步骤命名为 get_next。请注意,在我们的示例中,只有一批数据,只有两个值。

iterator = dataset.make_initializable_iterator() 
get_next = iterator.get_next()

步骤5)执行操作

最后一步与上一个示例类似。我们启动一个会话,然后运行操作迭代器。我们将由以下代码生成的值提供给 feed_dict: 麻木。这两个值将填充占位符 x。然后我们运行 get_next 来打印结果。

with tf.Session() as sess:
    # feed the placeholder with data
    sess.run(iterator.initializer, feed_dict={ x: x_input }) 
    print(sess.run(get_next))
[0.8835775  0.23766978]

TensorFlow 1.x 与 TensorFlow 2.x:有哪些变化

TensorFlow 2.0 对面向用户的 API 进行了重大重写。理解这种差异至关重要,因为网上大量的教程代码(包括上面的示例)都是针对 1.x 版本的。

提案 张量流 1.x 张量流 2.x
执行模型 定义图表,然后运行它。 默认情况下,操作会立即运行。
数据馈送 tf.placeholder 加上 feed_dict 通过 Python 直接值或张量
运行操作 tf.Session().run() 调用该函数,无需会话
高级API tf.estimator Keras,tf.keras
图优化 始终基于图 选择使用 @tf.function 装饰器
迭代数据集 make_initializable_iterator() 朴素 Python 遍历数据集的 for 循环

乘法示例(改写版)。 三个步骤和一个会话合并成一行代码,因为操作会在被调用时立即执行:

import tensorflow as tf

X_1 = tf.constant([1, 2, 3], dtype=tf.float32)
X_2 = tf.constant([4, 5, 6], dtype=tf.float32)

result = tf.multiply(X_1, X_2, name="multiply")
print(result.numpy())        # [ 4. 10. 18.]

输入管道已重写。 不需要占位符和迭代器对象:

import numpy as np
import tensorflow as tf

x_input = np.random.sample((1, 2))
dataset = tf.data.Dataset.from_tensor_slices(x_input)

for batch in dataset:
    print(batch.numpy())

如果需要编译图的速度,请将函数封装在 `@tf.function` 和 `TensorFlow` 中。 trac它会自动将其合并为一个。旧版 1.x 脚本也可以通过 tf.compat.v1 命名空间直接运行,但该路径仅用于维护,不应用于新项目。

TensorFlow:主要收获和 Code 参考法案

  • TensorFlow 含义: TensorFlow 是近年来最著名的深度学习库。使用 TensorFlow 的实践者可以构建任何深度学习结构,如 CNN、RNN 或简单的人工神经网络。
  • TensorFlow 主要被学术界、初创公司和大型企业使用。 Google 几乎所有方面都使用 TensorFlow Google 日常用品包括 Gmail照片和 Google 搜索引擎。
  • 此 Google Brain 团队开发 TensorFlow 的目的是为了弥合研究人员和产品开发人员之间的鸿沟。2015 年,他们将 TensorFlow 公开发布;此后,TensorFlow 迅速流行起来。如今,TensorFlow 已成为 GitHub 上代码库数量最多的深度学习库。
  • 从业者使用 TensorFlow 是因为它易于大规模部署,可以在云端、浏览器中或运行 iOS 的移动设备上部署。 Android.

TensorFlow 在会话中运行。每个会话都由一个包含不同计算的计算图定义。一个简单的例子是计算一个数的乘法。在 TensorFlow 中,需要三个步骤:

  1. 定义变量
X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")
  1. 定义计算
multiply = tf.multiply(X_1, X_2, name = "multiply")
  1. 执行操作
with tf.Session() as session:
    result = session.run(multiply, feed_dict={X_1: [1, 2, 3], X_2: [4, 5, 6]})
    print(result)

在 TensorFlow 中,一种常见的做法是创建数据管道来加载数据。如果您按照以下五个步骤操作,就可以将数据加载到 TensorFlow 中:

  1. 创建数据
import numpy as np
x_input = np.random.sample((1,2))
print(x_input)
  1. 创建占位符
x = tf.placeholder(tf.float32, shape=[1,2], name = 'X')
  1. 定义数据集方法
dataset = tf.data.Dataset.from_tensor_slices(x)
  1. 创建管道
iterator = dataset.make_initializable_iterator()
get_next = iterator.get_next()
  1. 执行程序
with tf.Session() as sess:
    sess.run(iterator.initializer, feed_dict={x: x_input})
    print(sess.run(get_next))

常见问题

`tf.placeholder` 属于 TensorFlow 1.x 版本,已在 2.0 版本中移除。2.0 版本会立即执行,不再需要占位符。您可以直接传递值,或者使用 `tf.compat.v1` 来运行旧版脚本,而无需进行任何更改。

张量是一个n维数组,其中每个元素都只有一种数据类型。标量秩为0,向量秩为1,矩阵秩为2,而图像批次通常秩为4。

Keras 是用于定义和训练模型的高级 API,而 TensorFlow 是底层计算引擎。自 2.16 版本起,TensorFlow 包含 Keras 3,Keras 3 也可在 JAX 或 Py 上运行。TorCH。

TensorFlow 适用于生产 AI:图像分类、自然语言处理、推荐系统以及任何必须部署到移动设备、浏览器或服务器集群的模型。

是的。AI 助手可以将会话代码和占位符代码重写为等效的即时版本,并标记已移除的函数。在弃用旧脚本之前,请将输出结果与原始结果进行数值验证。

总结一下这篇文章: