《TensorFlow自然语言处理》—2.2.2 在TensorFlow中定义变量

举报
华章计算机 发表于 2019/07/21 18:49:31 2019/07/21
【摘要】 本节书摘来自华章计算机《TensorFlow自然语言处理》一书中的第2章,第2.2.2节,[澳] 图珊·加内格达拉(Thushan Ganegedara) 著 马恩驰 陆 健 译。

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变量:

 image.png

则TensorFlow计算图知道这个变量的名称是b,而不是a。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。