Tensorflow的名称直接来自其核心框架:Tensor 。在Tensorflow中,所有计算都涉及张量。张量是n维的向量或矩阵,表示所有类型的数据。张量中的所有值都保持具有已知(或部分已知)形状的相同数据类型 。数据的形状是矩阵或数组的维数。
张量可以源自输入数据或计算结果。在TensorFlow中,所有操作都在图内部进行 。图是一组连续发生的计算。每个操作都称为操作节点,并相互连接。
图概述了节点之间的操作和连接。但是,它不显示值。节点的边缘是张量,即用数据填充操作的方法。
机器学习涉及从数据中学习基础模式。学习阶段需要选择大量的向量。每个向量都是数据的简化或测量观察到的现象的方法。这些特征向量将用于训练机器学习模型,您可以从此机器学习模型预测未来值。
在机器学习中,模型被提供一个称为特征向量的对象列表 。特征向量可以是任何数据类型。特征向量通常是填充张量的主要输入。这些值将通过张量流入op节点,此操作/计算的结果将创建一个新的张量,该张量又将用于新的操作。所有这些操作都可以在图中查看。
张量的表示
在TensorFlow中,张量是n维的特征向量(即数组)的集合。例如,如果我们有一个2x3矩阵,其值为1到6,我们这样写:
TensorFlow将此矩阵表示为:?
[[1, 2, 3], [4, 5, 6]]?
[[1, 2, 3], [4, 5, 6]]
如果我们创建一个值为1到8的三维矩阵,我们有:
TensorFlow将此矩阵表示为:
[ [[1, 2],
[[3, 4],
[[5, 6],
[[7,8] ]
注意:张量可以用标量表示,也可以有三维以上的形状。可视化更高维度级别更加复杂。
张量的类型
在TensorFlow中,所有计算都通过一个或多个张量。张量是一个具有三个属性的对象:
- 唯一标签(name)
- 维度(shape)
- 数据类型(dtype)
您将使用TensorFlow执行的每个操作都涉及张量的操作。您可以创建四个主要张量:
- tf.Variable
- tf.constant
- tf.placeholder
- tf.SparseTensor
在本教程中,您将学习如何创建tf.constant和a tf.Variable 。
在我们完成本教程之前,请确保使用TensorFlow激活conda环境。我们命名了环境为hello-tf 。
对于MacOS用户:
source activate hello-tf
对于Windows用户:
activate hello-tf
完成后,您就可以导入了 tensorflow
# Import tf import tensorflow as tf /Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6 return f(*args, **kwds)
创建一个n维张量
首先创建一个具有一个维度的张量,即标量。
要创建张量,您可以使用 tf.constant()
要创建维度0的张量,请运行以下Python代码
每个张量由张量名称显示。每个张量对象都使用唯一标签(name),维度(shape)和数据类型(dtype)定义。
您可以通过更改数据类型来定义具有十进制值或字符串的张量。
可以创建维度为1的张量,如下所示:
您可以注意到形状仅由1列组成。
要创建2维的数组,需要在每行后关闭括号。请查看以下示例
矩阵有2行2列,填充值1,2,3,4。
一个有三维空间的矩阵是由另一层的方括号组成的。
矩阵看起来像图2.
张量的形状
打印张量时,TensorFlow会猜测形状。但是,您可以使用shape属性获得张量的形状。
在下面,您构建一个填充了10到15之间的数字的矩阵,并检查 m_shape形状
矩阵有3行2列。
TensorFlow具有用于创建向量或填充为0或1的矩阵的命令。例如,如果要创建具有10的特定形状的1-D张量,填充0,则可以运行以下代码:
# Create a vector of 0 print(tf.zeros(10)) Tensor("zeros:0", shape=(10,), dtype=float32)
该属性也适用于矩阵。在这里,您创建一个填充为1的10x10矩阵
# Create a vector of 1 print(tf.ones([10, 10])) Tensor("ones:0", shape=(10, 10), dtype=float32)
您可以使用给定矩阵的形状来生成ones向量。矩阵m_shape是3x2维度。您可以使用以下代码创建一个由one’s 填充的3行的张量:
# Create a vector of ones with the same number of rows as m_shape print(tf.ones(m_shape.shape[0])) Tensor("ones_1:0", shape=(3,), dtype=float32)
如果把1的值传递到括号里,你就可以在矩阵m_shape中创建等于数列的ones向量。
# Create a vector of ones with the same number of column as m_shape print(tf.ones(m_shape.shape[1])) Tensor("ones_2:0", shape=(2,), dtype=float32)
最后,您可以创建一个矩阵3x2
print(tf.ones(m_shape.shape)) Tensor("ones_3:0", shape=(3, 2), dtype=float32)
数据类型
张量的第二个属性是数据类型。张量一次只能有一种类型的数据。张量只能有一种类型的数据。您可以使用属性返回类型dtype 。
print(m_shape.dtype) <dtype: 'int32'>
在某些情况下,您想要更改数据类型。在TensorFlow中,可以使用tf.cast方法。
例
下面,使用cast方法将浮点张量转换为整数
# Change type of data type_float = tf.constant(3.123456789, tf.float32) type_int = tf.cast(type_float, dtype=tf.int32) print(type_float.dtype) print(type_int.dtype) <dtype: 'float32'> <dtype: 'int32'>
在创建张量期间未指定参数时,TensorFlow会自动选择数据类型。TensorFlow将猜测最可能的数据类型。例如,如果你传递一个文本,它会猜测它是一个字符串并将其转换为string 。
创建操作
一些有用的TensorFlow运算符
TensorFlow包含所有基本操作。你可以从一个简单的开始。您将使用TensorFlow方法计算数字的平方。此操作很简单,因为构造张量只需要一个参数。
一个数字的平方是用tf.sqrt(x)构造的,x是一个浮点数。
x = tf.constant([2.0], dtype = tf.float32) print(tf.sqrt(x)) Tensor("Sqrt:0", shape=(1,), dtype=float32)
注意:输出返回张量对象而不是2的平方结果。在示例中,您打印张量的定义而不是操作的实际评估。在下一节中,您将了解TensorFlow如何执行操作。
以下是常用操作列表。每个操作都需要一个或多个参数。
- tf.add(a, b)
- tf.substract(a, b)
- tf.multiply(a, b)
- tf.div(a, b)
- tf.pow(a, b)
- tf.exp(a)
- tf.sqrt(a)
例
代码说明
创建两个张量:
- 一个张量拥有1和2
- 一个张量拥有3和4
你对两个张量加上。
注意 :两个张量都需要具有相同的形状。您可以在两个张量上执行乘法运算。
变量
到目前为止,您只创建了张量。它没有多大用处。数据总是以不同的值,你可以使用Variable类。它将代表一个节点,这里的值总是会变化。
要创建变量,可以使用tf.get_variable()方法
如果指定了初始化,则不需要包含values,因为使用的是initializer的形状。
例如,下面的Python代码创建了一个带有两个随机值的二维变量。默认情况下,TensorFlow返回随机值。将变量命名为var
# Create a Variable ## Create 2 Randomized values var = tf.get_variable("var", [1, 2]) print(var.shape) (1, 2)
您将创建一个包含一行和两列的变量。您需要使用[1,2]来创建变量的维度
张量的初始值为零。例如,在训练机器学习模型时,需要使用初始值来计算特征的权重。在下面,您将这些初始值设置为零。
var_init_1 = tf.get_variable("var_init_1", [1, 2], dtype=tf.int32, initializer=tf.zeros_initializer) print(var_init_1.shape) (1, 2)
您可以在变量中传递常量张量的值。使用tf.constant()方法创建常量张量 。您使用此张量初始化变量。
变量的第一个值是10,20,30和40.新张量的形状为2x2。
占位符
占位符用于初始化数据流(在张量内部)。要提供占位符,您需要使用方法feed_dict 。占位符仅在会话期间提供。
在下一个示例中,您将了解如何使用方法tf.placeholder 创建占位符。
语法是:
会话
TensorFlow主要处理3个主要组件:
- 图(Graph)
- 张量(Tensor)
- 会话(Session)
图和会话是独立的。您可以运行会话并获得稍后用于进一步计算的值。
在下面的示例中,您将:
- 创建两个张量
- 创建一个操作
- 打开一个会话
- 打印结果
步骤1)您创建两个张量x和y
## Create, run and evaluate a session x = tf.constant([2]) y = tf.constant([4])
步骤2)您通过将x和y相乘来创建操作符
## Create operator multiply = tf.multiply(x, y)
步骤3)您打开一个会话。所有计算都将在会话中进行。完成后,您需要关闭会话。
## Create a session to run the code sess = tf.Session() result_1 = sess.run(multiply) print(result_1) sess.close() [8]
代码说明
- tf.Session() :打开一个会话。所有操作都将在会话中
- run(multiply) :执行步骤2中创建的操作。
- print(result_1) :最后,您可以打印结果
- close() :关闭会话
- 结果:8,这是乘法x和y 。
创建会话的另一种方法是在块内。优点是它会自动关闭会话。
在会话的上下文中,您可以使用该eval()方法来执行操作。它相当于run() 。它使代码更具可读性。
您可以创建会话并查看到目前为止您创建的张量中的值。
## Check the tensors created before sess = tf.Session() print(sess.run(r1)) print(sess.run(r2_matrix)) print(sess.run(r3_matrix)) 1 [[1 2] [3 4]] [[[1 2] [3 4] [5 6]]]
即使在创建张量后,变量也默认为空。如果要使用变量,则需要初始化变量。tf.global_variables_initializer()需要调用对象来初始化变量的值。该对象将显式初始化所有变量。在训练机器学习模型之前,这很有用。
您可以检查之前创建的变量的值。请注意,您需要使用run来评估张量
sess.run(tf.global_variables_initializer()) print(sess.run(var)) print(sess.run(var_init_1)) print(sess.run(var_init_2)) [[-1.1434615 0.55900717]] [[0 0]] [[10 20] [30 40]]
您可以使用之前创建的占位符并将其与实际值一起提供。您需要将数据传递给方法feed_dict 。
例如,您将使用占位符data_placeholder_a的2次方。
代码说明
- import numpy as np :导入numpy库以创建数据
- tf.pow(data_placeholder_a, 2) :创建操作
- np.random.rand(1, 10) :创建随机数据数组
- feed_dict={data_placeholder_a: data} :使用占位符 data
图
TensorFlow所有计算都用数据流方案表示。已经开发了数据流图以查看各个操作之间的数据依赖性。数学公式或算法由许多连续操作组成。图是可视化计算如何协调的便捷方式。
图显示了节点和边缘 。节点是操作的表示,即计算单位。边缘是张量,它可以产生新的张量或消耗输入数据。它取决于各个操作之间的依赖关系。
图的结构将操作(即节点)连接在一起,以及这些操作是如何进给的。请注意,图不显示操作的输出,它仅有助于可视化各个操作之间的连接。
想象一下,您想要评估以下函数:
TensorFlow将创建一个图来执行该函数。该图如下所示:
您可以轻松查看张量到达最终目的地所需的路径
例如,您可以看到add在$ \ text {xz} $和$ x ^ {2} $之前无法执行操作。该图表说明它将:
- 计算$ xz $和$ x_2 $:
- 1)中相加
- 将$ z $添加到2)
- 将3)添加到$ c $
代码说明
- x :初始化一个x使用常量值5 调用的变量
- z :初始化一个z使用常量值6 调用的变量
- c :初始化一个常量张量,调用c常量值为5
- square :初始化一个常量张量,调用square常量值为2
- f :构造运算符
在此示例中,我们选择保持变量的值固定。我们还创建了一个常量张量c,它是函数f中的常量参数 。它需要固定值5.
从图表中,您可以了解张量会发生什么以及它如何返回66的输出。
下面的代码评估会话中的函数。
最后
TensorFlow适用于:
- 图:包含操作和张量的计算环境
- 张量:表示将在图表中流动的数据(或值)。它是图中的边缘
- 会话:允许执行操作
创建一个常数张量
创建一个运算符
创建一个变量张量
打开一个会话