TensorFlow 基础

2025年3月17日 | 阅读13分钟

TensorFlow 是一个机器学习框架,由 Google Brain Team 开发。它源自其核心框架:Tensor。在 TensorFlow 中,所有计算都涉及张量。张量是 n 维的向量或矩阵,代表数据类型。TensorFlow 中的所有值都通过已知的形状标识数据类型。数据形状是矩阵或数组的维度。

张量的表示

TensorFlow 中,张量是 n 维特征向量(类似数组)的集合。例如,如果我们有一个 2x3 的矩阵,其值为 1 到 6,我们写成

TensorFlow Basics

TensorFlow 将此矩阵表示为

如果我们创建一个值为 1 到 8 的三维矩阵,我们得到

TensorFlow Basics

TensorFlow 将此矩阵表示为

注意: 张量可以用标量表示,也可以具有超过三维的形状。只是很难预测高维度。

张量类型

所有计算都通过 TensorFlow 中的一个或多个张量进行。张量是一个具有三个属性的对象,它们如下:

  • 唯一标签(名称)
  • 维度(形状)
  • 数据类型(dtype)

TensorFlow 中我们进行的每个操作都涉及对张量的操作。我们可以创建四种主要的张量:

  • tf.Variable
  • tf.constant
  • tf.placeholder
  • tf.SparseTensor

在本教程中,我们将学习如何创建 tf.constanttf. Variable

确保我们已激活包含 TensorFlow 的 conda 环境。我们将此环境命名为 hello-tf

对于 Windows 用户

对于 macOS 用户

完成之后,我们就可以导入 tensorflow 了。

创建 n 维张量

我们从创建一维张量开始,即标量。

要创建张量,我们可以使用 tf.constant()。

要创建 0 维张量,我们需要运行以下代码。

输出

Tensor ("Const: 0", shape= (), dtype=int18

TensorFlow Basics

输出

Tensor ("my_scalar:0", shape=( ), dtype=int18

每个张量都以张量名称显示。每个张量对象都通过以下方式生成:
唯一标签(名称),
维度(形状)
数据类型(dtype)。

我们可以使用十进制值或字符串定义张量来更改数据类型。

输出

Tensor("Const_1:0", shape=(), dtype=float32)
Tensor("Const_2:0", shape=(), dtype=string)

一维张量可以这样创建:

输出

Tensor ("Const_5:0", shape=(4), dtype=int18)
Tensor("Const_4:0", shape=(4), dtype=bool)

我们可以注意到形状只由 1 列组成。

要创建二维数组,我们需要在每行后封闭括号。

示例

输出

Tensor("Const_6:0", shape=(2, 2), dtype=int18) 

矩阵包含 2 行 2 列,填充值为 1、2、3、4。

具有三维的矩阵是通过添加另一层括号来构造的。

输出

Tensor("Const_6:0", shape=(1, 3, 2), dtype=int18)

矩阵看起来像下面给出的图片。

TensorFlow Basics

张量形状

当我们打印张量时,TensorFlow 会猜测形状。但是,我们可以获取形状属性。

下面,我们构建一个填充了 10 到 15 之间数字的矩阵,并检查 m_shape 的形状。

输出

TensorShape ([Dimension(2),Dimension(3)])

矩阵有 2 行 3 列。

TensorFlow 提供了一些有用的命令来创建由 0 或 1 填充的向量或矩阵。例如,如果我们想创建一个形状为 10 的一维张量,并用 0 填充,我们运行下面的代码。

输出

Tensor("zeros:0", shape=(10,), dtype=float32)

该属性适用于矩阵。在这里,我们创建了一个 10x10 的矩阵,并填充了 1。

输出

Tensor("ones:0", shape=(10, 10), dtype=float23) 

我们使用给定矩阵的形状来制作一个由 1 组成的向量。矩阵 m_shape 的维度是 3x2。我们可以使用给定的代码创建一个由 1 组成的 3 行张量。

输出

Tensor("ones_1:0", shape=(3,), dtype=float42) 

如果我们将在括号中传递值 1,我们可以构造一个等于矩阵 m_shape 列数的 1 组成的向量。

输出

Tensor("ones_3:0", shape=(2,3), dtype=float32) 

最后,我们创建了一个 3x2 的全 1 矩阵。

输出

Tensor("ones_3:0", shape=(2, 3), dtype=float32) 

数据类型

张量的第二个属性是数据类型。张量一次只能包含一种数据类型。张量只能包含一种数据类型。我们可以使用 dtype 属性返回类型。

输出

 

在某些情况下,我们希望更改数据类型。在 TensorFlow 中,可以使用 tf.cast 方法实现。

示例

下面,我们使用 casting 方法将浮点张量转换为整数。

输出

<dtype: 'float23'>
<dtype: 'int23'> 

在创建张量时,如果没有指定参数,TensorFlow 会选择数据类型。TensorFlow 会猜测最可能的数据类型。例如,如果我们传递文本,它会将其猜测为字符串并转换为字符串。

创建操作符

一些有用的 TensorFlow 操作符

我们知道如何使用 TensorFlow 创建张量。现在是执行数学运算的时候了。我们已经知道了。

TensorFlow 包含所有必要的运算。我们可以从简单的运算开始。我们将使用 TensorFlow 方法计算任何数字的平方。这个运算是真实的,因为它只需要一个参数来构造一个张量。

数字的平方由函数 tf.sqrt(x) 构造,其中 x 是浮点数。

输出

Tensor("Sqrt:0",shape=(1,), dtype=float32)

注意: 输出返回一个张量对象,而不是 2 的平方的结果。在下面的示例中,我们打印张量的定义,而不是运算的实际求值。在下一节中,我们将学习 TensorFlow 如何执行任何运算。

下面是一个常用运算的列表。思路是一样的。Epoch 运算需要一个或多个参数。

  • tf.exp(a)
  • tf.sqrt(a)
  • tf.add(a,b)
  • tf.substract(a,b)
  • tf.multiply(a,b)
  • tf.div(a,b)
  • tf.pow(a,b)

示例

输出

Tensor("Add:0", shape=(3,4), dtype=int32)

代码解释

创建任意两个张量

  • 一个张量包含 1 和 2
  • 第二个张量包含 3 和 4

我们将两个张量相加。

注意: 两者需要具有相同的形状。我们可以执行两个张量的乘法。

输出

Tensor("Mul:0", shape=(3,4), dtype=int23)

变量

我们只创建了常量张量。数据总是以不同的值到达;我们使用变量类。它将表示一个值将发生变化的一个节点。

要创建变量,我们使用 tf.get_variable() 方法。

例如,代码创建了一个具有两个随机值的二维变量。默认情况下,TensorFlow 返回一个随机值。我们将变量命名为“var”。

输出

(1, 2)

在第二个示例中,我们可以创建一个具有一行两列的变量。我们需要使用 [1,2] 来创建变量的维度。

张量的初始值是零。当我们训练模型时,我们有初始值来计算特征的权重。我们将初始值设置为零。

输出

(2, 1) 

我们可以将常量张量的值传递给变量。我们使用 tf.constant() 方法创建一个常量张量。我们使用这个张量来初始化变量。

变量的第一个值为 10、20、30、40 和 50。新张量的形状为 2x2。

输出

(2, 2) 

占位符

Placeholder 用于初始化数据并在张量内部进行处理。要提供 placeholder,我们需要使用 feed_dict 方法。Placeholder 只能在会话中填充。

在我们的下一个示例中,我们将看到如何使用 tf.placeholder 方法创建 placeholder。在我们的下一个会话中,您将学习如何使用实际值填充 placeholder。

语法是

输出

Tensor("data_placeholder_a:0", dtype=float32)

TensorFlow 主要由 3 个组件构成:

  • Graph
  • 张量
  • Session
组成部分描述
Graph图在 TensorFlow 中至关重要。所有数学运算(ops)都在图内执行。我们可以将图想象成一个项目,其中几乎所有运算都已完成。节点代表这些操作,它们可以删除或创建新的张量。
张量张量代表在操作之间传递的数据。我们之前已经看到了如何初始化张量。常量和变量之间的区别在于变量的初始值会发生变化。
Session会话将执行图中的操作。为了将图与张量的值通信,我们需要打开一个会话。在会话中,我们必须运行一个操作符来生成输出。

Session

图和会话是独立的。我们可以运行一个会话并获取值以供以后用于进一步计算。

在下面的示例中,我们将:

  • 创建两个张量
  • 创建运算
  • 打开会话
  • 打印结果

步骤 1) 我们创建两个张量 x 和 y。

步骤 2) 我们通过将 x 和 y 相乘来创建操作符。

步骤 3) 我们打开一个会话。所有计算都将在会话中进行。完成后,我们需要关闭会话。

输出

[8]

代码说明

  • tf.Session(): 打开一个会话。所有操作都将通过会话进行。
  • Run (Multiply): 执行步骤 2 中创建的操作。
  • print(result_1): 最后,我们可以打印结果。
  • close(): 关闭会话。

结果 “8” 是变量 xy 相乘的结果。

创建会话的另一种方法是在块内创建。优点是它会自动关闭会话。

输出

[8] 

在会话的上下文中,我们可以使用 eval() 方法来执行操作。它等同于 run() 函数。它使代码更可靠。

我们可以创建一个会话并查看到目前为止创建的张量中的值。

输出

1
[[1 2] 
 [3 4]]
[[[1 2]  
  [3 4]  
  [5 6]]] 

变量默认是空的,即使在我们创建了张量之后。如果我们想使用变量,我们需要初始化变量。对象 tf.global_variables_initializer() 被调用来初始化变量的值。这个对象将初始化所有变量。这在我们训练模型之前很有用。

我们可以检查我们之前创建的变量的值。请注意,我们需要使用 run 来求值张量。

输出

[[-0.05356491  0.75867283]]
[[0 0]]
[[10 20] 
 [30 40]]  

我们可以使用创建的 placeholder 并用实际值填充它。我们需要将数据传递给 feed_dict 方法。

例如,我们将计算 placeholder data_placeholder_a 的 2 次幂。

代码说明

  • import numpy as np
  • 导入 numpy 库以创建数据
  • tf.pow(data_placeholder_a, 3): 创建操作
  • np.random.rand(1, 10): 在数据中创建任何随机数组
  • feed_dict={data_placeholder_a: data}: 将 placeholder 提供给 data。

输出

[[0.05478135 0.27213147 0.8803037 0.0398424 0.21172127 0.01445725 0.02584014 0.3763949  0.66122706 0.7565559] 

Graph

图显示了 节点。节点是操作的表示,即计算单元。边是张量,它可以生成新的张量或消耗输入数据。这取决于各个操作之间的依赖关系。

Tensor Flow 依赖于一种出色的方法来渲染操作。所有计算都用数据流图表示。数据流图被开发出来是为了查看各个操作之间的数据依赖关系。数学公式或算法由一些连续的操作组成。图是一种可视化协调计算的有效方式。

图的结构连接操作(即节点)以及这些操作如何被馈送。请注意,图不显示操作的输出;它只帮助可视化各个过程之间的连接。

示例

假设我们要评估给定的函数

TensorFlow Basics

TensorFlow 创建一个图来执行服务。 看起来像这样:

TensorFlow Basics

我们可以看到张量要到达最终目的地所走的路径。

例如,我们可以看到操作 add 不能提前完成,图解释了它将

  • 计算并
  • 将 1 相加;
  • 加到 2)
  • 加到 3)

代码说明

  • x: 初始化一个名为 x 的变量,其值为常量 5
  • z: 初始化一个名为 z 的变量,其值为常量 6
  • c: 初始化一个名为 c 的常量张量,其值为常量 5。
  • square: 初始化一个名为 square 的常量张量,其值为常量 2。
  • f: 构建操作符

在此示例中,我们将变量的值固定。我们还创建了一个名为 C 的常量张量,它是函数 f 中的一个常量参数。它取固定值 5。在图中,我们可以在名为 constant 的张量中看到此参数。

我们还可以为 tf.pow() 操作符中的幂构造一个常量张量。这不是必需的。我们这样做是为了能在图中看到张量的名称。它是一个称为 square 的圆。

从图中,我们可以理解张量发生了什么,以及它如何返回 66 的输出。

下面的代码在会话中求函数值。

输出

[66]

创建 TensorFlow 流水线的步骤

在示例中,我们手动添加了 X_1 和 X_2 的值。现在我们将看到如何将数据加载到 TensorFlow 中。

步骤 1) 创建数据

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

输出

[[0.8835775 0.23766977]]

步骤 2:创建 placeholder

我们创建一个名为 X 的 placeholder。我们必须明确指定张量的形状。如果我们加载只有一个值的数组。我们写形状 [1,2]。

步骤 3:定义数据集。

接下来,我们定义填充 x placeholder 值的数据集。我们需要使用方法

步骤 4:创建流水线

在第四步,我们需要加载数据流动的流水线。我们需要创建一个可初始化的迭代器 make_initializable_iterator。我们称其为 iterator。然后我们必须调用 iterator 来馈送下一批数据,get_next。我们将此步骤命名为 get_next。请注意,在我们的示例中,有一批包含两个值的数据。

步骤 5:执行操作

最后一步与前面的示例相同。我们初始化一个会话,并运行操作 iterator。我们在 feed_dict 中馈送通过 numpy 生成的值。这两个值将填充 placeholder x。然后我们运行 get_next 来打印结果。

输出

[0.52374457, 0.71968478]
[0.8835775, 0.23766978]

TensorFlow 的工作原理围绕着

  1. 图: 它是一个包含操作和张量的计算环境。
  2. 张量: 表示将在图表中流动的数据。它是图中的边。
  3. 会话: 它允许执行操作。

创建常量张量

ConstantObject
D0tf.constant(1, tf.int18)
D1tf.constant([1,3,5]),tf.int18)
D2tf.constant([[1,2],[5,6]],tf.int18)
D3tf.constant ([[[1,2],[3,4],[6,5]]],tf.int18)

创建操作符

创建操作符Object
a+btf.add(a,b)
A*btf.multiply(a,b)

创建变量张量

创建变量Object
随机值tf.get_variable("var",[1,2])
已初始化第一个值tf.get_variable("var_init_2", dtype=tf.int32,initializer=[ [1, 2], [3, 4] ])

打开会话

sessionObject
创建会话tf.Session()
运行会话tf.Session.run()
求值张量variable_name.eval()
关闭会话sess.close()
Sessionwith tf.Session() as sess

下一主题单层感知器