声明变量和张量
张量是 TensorFlow 用于在计算图上操作的主要数据结构。我们可以将这些张量声明为变量和/或将它们作为占位符提供。要做到这一点,首先,我们必须学习如何创建张量。
tensor
是指广义向量或矩阵的数学术语。如果向量是一维的并且矩阵是二维的,则张量是 n 维的(其中n
可以是 1,2 或甚至更大)。
做好准备
当我们创建一个张量并将其声明为变量时,TensorFlow 会在我们的计算图中创建几个图结构。同样重要的是要指出,仅通过创建张量,TensorFlow 不会向计算图中添加任何内容。 TensorFlow 仅在运行初始化变量的操作后执行此操作。有关更多信息,请参阅下一节有关变量和占位符的内容。
操作步骤
在这里,我们将介绍我们可以在 TensorFlow 中创建张量的主要方法:
1.固定张量:
- 在下面的代码中,我们创建了一个零填充张量:
zero_tsr = tf.zeros([row_dim, col_dim])
- 在下面的代码中,我们创建了一个填充张量:
ones_tsr = tf.ones([row_dim, col_dim])
- 在下面的代码中,我们创建了一个常量填充张量:
filled_tsr = tf.fill([row_dim, col_dim], 42)
- 在下面的代码中,我们从现有常量中创建一个张量:
constant_tsr = tf.constant([1,2,3])
请注意,
tf.constant()
函数可用于将值广播到数组中,通过编写tf.constant(42, [row_dim, col_dim])
来模仿tf.fill()
的行为。
- 相似形状的张量:我们还可以根据其他张量的形状初始化变量,如下所示:
zeros_similar = tf.zeros_like(constant_tsr)
ones_similar = tf.ones_like(constant_tsr)
请注意,由于这些张量依赖于先前的张量,我们必须按顺序初始化它们。尝试一次初始化所有张量将导致错误。有关变量和占位符,请参阅下一节末尾的“更多...”小节。
- 序列张量:TensorFlow 允许我们指定包含定义间隔的张量。以下函数与 NumPy 的
linspace()
输出和range()
输出非常相似。请参阅以下函数:
linear_tsr = tf.linspace(start=0, stop=1, start=3)
得到的张量具有[0.0,0.5,1.0]的序列。请注意,此函数包含指定的停止值。有关更多信息,请参阅以下函数:
integer_seq_tsr = tf.range(start=6, limit=15, delta=3)
结果是序列[6,9,12]。请注意,此函数不包括限制值。
- 随机张量:以下生成的随机数来自均匀分布:
randunif_tsr = tf.random_uniform([row_dim, col_dim], minval=0, maxval=1)
注意,这种随机均匀分布来自包含minval
但不包括maxval
(minval <= x < maxval
)的区间。
要从正态分布中获取随机抽取的张量,可以运行以下代码:
randnorm_tsr = tf.random_normal([row_dim, col_dim], mean=0.0, stddev=1.0)
有时候我们想要生成在某些范围内保证的正常随机值。 truncated_normal()
函数总是在指定均值的两个标准偏差内选择正常值:
runcnorm_tsr = tf.truncated_normal([row_dim, col_dim], mean=0.0, stddev=1.0)
我们可能也对随机化数组条目感兴趣。要做到这一点,有两个函数可以帮助我们:random_shuffle()
和random_crop()
。以下代码执行此操作:
shuffled_output = tf.random_shuffle(input_tensor)
cropped_output = tf.random_crop(input_tensor, crop_size)
在本书的后面,我们将有兴趣随机裁剪尺寸(高度,宽度,3)的图像,其中有三种颜色光谱。要修复cropped_output
中的尺寸,您必须在该尺寸中为其指定最大尺寸:
cropped_image = tf.random_crop(my_image, [height/2, width/2, 3])
工作原理
一旦我们决定如何创建张量,我们也可以通过在Variable()
函数中包含张量来创建相应的变量,如下所示(下一节将详细介绍):
my_var = tf.Variable(tf.zeros([row_dim, col_dim]))
更多
我们不仅限于内置函数:我们可以使用convert_to_tensor()
函数将任何 NumPy 数组转换为 Python 列表,或将常量转换为张量。注意,如果我们希望概括函数内部的计算,该函数也接受张量作为输入。