本笔记参照TensorFlow官方教程,主要是对‘Tensor’教程内容翻译和内容结构编排,原文链接:Variables
TensorFlow变量是能表示由程序操作的,共享的、持续时间长的状态的最好方法。
变量是由‘tf.Variable’类控制的。‘tf.Variable’表示可以被张量上运行的操作改变的张量值。我们可以用特定的操作读取并修改张量的值。高级别的库像tf.keras使用’tf.Variable‘来存储模型参数。在这篇教程里谷歌教我们如何创建、更新和管理TensorFlow里的变量。
一、创建变量
要想创建一个变量,只提供它的初始值就可以做到:
my_variable = tf.Variable(tf.zeros([1., 2., 3.]))
这个创造出来的变量是一个三维张量,它的形状为[1,2,3],里面都是由0填充。默认情况下这个变量的dtype为‘tf.float32’。如果没有指定,dtype默认从变量的初始值推断得到。
如果’tf.device’处于激活状态,变量将被放到这台设备上;否则,变量将放到可以兼容它dtype的最快设备上(也就是说大部分变量会自动的给GPU)。例如,下面这段代码创建了一个变量‘V’,并且把它放到了第二个GPU设备上。
with tf.device("/device:GPU:1"):
v = tf.Variable(tf.zeros([10, 10]))
理想情况下你应该使用tf.distribute API,因为它允许我们编写一次代码,并让它在许多不同的分布式设置下工作。
二、使用变量
为了使用TensorFlow图中的变量值,我们只需要把它当做正常的张量看待就行了:
v = tf.Variable(0.0)
w = v + 1 # w is a tf.Tensor which is computed based on the value of v.
# Any time a variable is used in an expression it gets automatically
# converted to a tf.Tensor representing its value.
我们可以使用‘assign’、‘assign_add’和tf.Variable类的朋友来给变量分配值。例如,下面是教我们如何调用这些方法:
v = tf.Variable(0.0)
v.assign_add(1)
大多数TensorFlow优化器都有专门的操作,可以根据类似梯度下降的算法有效地更新变量的值。更多优化器(optimizer)的详情请参考:tf.keras.optimizers.Optimizer
我们还可以显式地(explicitly)读取变量的当前值,使用’read_value’:
v = tf.Variable(0.0)
v.assign_add(1)
v.read_value() # 1.0
当最后一个对变量的引用超出作用域时,其内存被释放。
2.1 跟踪变量
TensorFlow里的变量是一个Python对象。正如我们创建层,模型,优化器以及其他关联工具一样,我们也希望在一个模型里得到所有模型的序列。
常用用例为执行‘Layer’子类化。层类递归跟踪变量设置为实例属性:
class MyLayer(tf.keras.layers.Layer):
def __init__(self):
super(MyLayer, self).__init__()
self.my_var = tf.Variable(1.0)
self.my_var_list = [tf.Variable(x) for x in range(10)]
class MyOtherLayer(tf.keras.layers.Layer):
def __init__(self):
super(MyOtherLayer, self).__init__()
self.sublayer = MyLayer()
self.my_other_var = tf.Variable(10.0)
m = MyOtherLayer()
print(len(m.variables)) # 12 (11 from MyLayer, plus my_other_var)
如果不开发一个新层,TensorFlow也可以用tf.Module基类来执行变量跟踪。‘tf.Model’的实例有一个’variables‘ 和’trainable_variables‘属性,该属性返回模型可以访问的变量,也可以导航通过其它模块(很像层类所做的跟踪)-----Instances of tf.Module have a variables and a trainable_variables property which return all (trainable) variables reachable from that model, potentially navigating through other modules (much like the tracking done by the Layer class).