《TensorFlow自然语言处理》—2.2.2 在TensorFlow中定义变量
2.2.2 在TensorFlow中定义变量
变量在TensorFlow中扮演重要角色。变量本质上是具有特定形状的张量,而形状定义了变量有多少维度以及每个维度的大小。然而,与常规张量不同,变量是可变的,这意味着变量的值在定义后可以改变。这对于需要改变模型参数(例如,神经网络权重)的学习模型来说是理想特性,其权重在每个学习步骤之后会稍微变化。例如,如果使用x = tf.Variable(0, dtype = tf.int32)定义变量,则可以使用TensorFlow操作(比如tf.assign(x,x + 1))更改该变量的值。
但是,如果像x = tf.constant(0,dtype = tf.int32)这样定义张量,则无法像对变量一样更改张量的值,它会一直保持为0,直到程序执行结束。
变量创建非常简单,在我们的例子中,我们已经创建了两个变量W和b。在创建变量时,有一些事情非常重要,我们在这里列出它们并在以下段落中详细讨论:
变量形状
数据类型
初始值
名称(可选)
变量形状是[x,y,z,…]格式的一维向量。列表中的每个值表示相应维度或轴的大小。例如,如果需要具有50行和10列的二维张量作为变量,则形状是[50, 10]。
变量的维数(即形状矢量的长度)在TensorFlow中被看作张量的秩,不要将它与矩阵的秩混淆。
TensorFlow中,张量的秩表示张量的维数,对于二维矩阵,秩= 2。
数据类型在决定变量大小方面起着重要作用。有许多不同的数据类型,包括常用的tf.bool、tf.uint8、tf.f?loat32和tf.int32。每种数据类型都需要一定的比特数来表示该类型的值。例如,tf.uint8需要8比特,而tf.f?loat32需要32比特。通常的做法是使用相同的数据类型进行计算,否则会导致数据类型不匹配。因此,如果你有两个不同数据类型的张量,则需要对它们做数据类型转换,因而必须使用tf.cast(…)操作将一个张量显式转换为另一个类型的张量。tf.cast(…)操作就是为了应对这种情况而设计的。例如,如果有一个tf.int32类型的x变量,需要将其转换为tf.f?loat32,则可以通过tf.cast(x,dtype = tf.f?loat32)将x转换为tf.f?loat32。
接下来,变量需要用初始值进行初始化。为方便起见,TensorFlow提供了几种不同的初始化器,包括常数初始化器和正态分布初始化器。以下是一些可用于初始化变量的流行TensorFlow初始化器:
tf.zeros
tf.constant_initializer
tf.random_uniform
tf.truncated_normal
最后,我们会将变量的名称用作ID在图中标识该变量。因此,如果你可视化计算图,那么变量将显示为传递给name关键字的参数。如果未指定名称,TensorFlow将使用默认命名方案。
请注意,计算图并不知道被tf.Variable赋值的Python变量,该变量不是TensorFlow变量命名的一部分。例如,如果定义如下TensorFlow变量:
则TensorFlow计算图知道这个变量的名称是b,而不是a。
- 点赞
- 收藏
- 关注作者
评论(0)