页面树结构

2017-11-09 ApacheCN 开源组织,第二期邀请成员活动,一起走的更远 : http://www.apachecn.org/member/209.html


MachineLearning 优酷地址 : http://i.youku.com/apachecn

转至元数据结尾
转至元数据起始

训练模型时,您可以使用变量 来保存和更新参数。变量是包含张量的内存缓冲区。必须明确地初始化它们,并在训练期间和训练之后将其保存到磁盘中。您可以稍后恢复保存的值以运行或分析模型。

本文档引用了以下TensorFlow类。请参阅其参考手册的链接,了解其API的完整说明:


创建

当您创建一个变量 时,您将一个 Tensor作为其初始值传递给Variable()构造函数。TensorFlow提供了一系列操作来初始化张量,初始化产生常量或随机值

请注意,所有这些操作都需要您指定张量形状。该形状自动变为变量的形状。变量通常具有固定的形状,但是TensorFlow提供了重新变换变量的高级机制。

# Create two variables.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases") 
调用tf.Variable()向图中添加了几个操作:
  • 一个variable操作保存变量值。
  • 初始化操作将变量设置为其初始值。这实际上是一个tf.assign操作。
  • 初始值的操作, 例如示例中biases变量的zeros操作也被添加到图中。

tf.Variable()返回的值是Python的 tf.Variable类的一个实例。

设备选取

变量可以在创建时被固定到特定设备,使用 with tf.device(...)块:

# Pin a variable to CPU.
with tf.device("/cpu:0"):
  v = tf.Variable(...)

# Pin a variable to GPU.
with tf.device("/gpu:0"):
  v = tf.Variable(...)

# Pin a variable to a particular parameter server task.
with tf.device("/job:ps/task:7"):
  v = tf.Variable(...) 
注意:改变变量的操作,例如 tf.Variable.assigntf.train.Optimizer中参数更新操作 必须与变量在同一设备上运行。创建这些操作时,不兼容的设备布局指令将被忽略。  

在设置的副本中运行时,设备选取特别重要。有关设备相关函数的详细信息请参阅 tf.train.replica_device_setter ,可以简化副本模型的配置。

 

初始化

在运行模型中的其他操作之前,必须先进行变量初始化。最简单的方法是添加一个运行所有变量初始值的操作,并在使用模型之前运行该操作。

您也可以从检查点文件中恢复变量值,如下所示。

使用tf.global_variables_initializer()添加一个操作进行变量初始化。在完成构建模型并在会话中启动模型之后,才能运行该操作。

# Create two variables.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")
...
# Add an op to initialize the variables.
init_op = tf.global_variables_initializer()

# Later, when launching the model
with tf.Session() as sess:
  # Run the init operation.
  sess.run(init_op)
  ...
  # Use the model
  ...

由另一个变量初始化

您有时需要从另一个变量的初始值初始化一个变量。由于tf.global_variables_initializer()为并行的初始化变量,在必要的时候必须小心使用。

要从另一个变量的值初始化一个新的变量,使用另一个变量的initialized_value()属性。您可以直接将已初始化值用作新变量的初始值,或者你可以使用它作为任一张量去计算新变量的值

 # Create a variable with a random value.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
# Create another variable with the same value as 'weights'.
w2 = tf.Variable(weights.initialized_value(), name="w2")
# Create another variable with twice the value of 'weights'
w_twice = tf.Variable(weights.initialized_value() * 2.0, name="w_twice")

自定义初始化

tf.global_variables_initializer()添加了一个操作来初始化模型中的所有变量。您还可以传递一个初始化变量的列表给tf.variables_initializer。有关更多选项,请参阅 变量文档,包括检查变量是否被初始化。

 

保存和恢复

保存和恢复模型的最简单方法是使用tf.train.Saver对象。构造器给图中的所有变量,或是定义在列表里的变量,添加saverestore操作。saver对象提供了运行这些操作的方法,指定检查点文件写入或读取的路径。

检查点文件

变量保存在二进制文件中,主要包含从变量名称到张量值的映射。

创建Saver对象时,可以选择在检查点文件中选择变量的名称。默认情况下,它使用每个变量的 tf.Variable.name属性值。

要了解检查点中的哪些变量,可以使用 inspect_checkpoint 库,特别是print_tensors_in_checkpoint_file函数。

保存变量

使用tf.train.Saver()创建Saver管理模型中的所有变量。

 # Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add an op to initialize the variables.
init_op = tf.global_variables_initializer()

# Add ops to save and restore all the variables.
saver = tf.train.Saver()

# Later, launch the model, initialize the variables, do some work, save the
# variables to disk.
with tf.Session() as sess:
  sess.run(init_op)
  # Do some work with the model.
  ..
  # Save the variables to disk.
  save_path = saver.save(sess, "/tmp/model.ckpt")
  print("Model saved in file: %s" % save_path)

恢复变量

用用一个Saver对象恢复变量。请注意,当您从文件中恢复变量时,您不必事先初始化它们。

# Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add ops to save and restore all the variables.
saver = tf.train.Saver()

# Later, launch the model, use the saver to restore variables from disk, and
# do some work with the model.
with tf.Session() as sess:
 # Restore variables from disk.
 saver.restore(sess, "/tmp/model.ckpt")
 print("Model restored.")
 # Do some work with the model
 ...

选择存储和恢复哪些变量

如果您没有传递任何参数到tf.train.Saver(),那么Saver将保存图中的所有变量。它们中的每一个变量都以变量创建时传入的名称被保存。

在检查点文件中明确指定变量的名称有时是有用的。例如,您可能已经使用一个名为"weights"名称的变量来训练一个模型,该变量要在一个名为"params"的新变量中还原。

只保存或恢复模型的部分变量有时也是有用的。例如,您可能已经训练了一个具有5层的神经网络,您现在要训练一个具有6层的新模型,您可以将以前训练模型的前5层参数恢复到新模型的前5层。

您可以给tf.train.Saver()构造器传入一个Python字典来简单地指定要保存的名称和变量 :keys是要使用的名称,values是要管理的变量。

注意:

  • 如果需要保存和恢复模型变量的不同子集,您可以创建尽可能多的saver对象。相同的变量可以列在多个saver对象中,其值仅在saver中的restore()函数运行时更改。

  • 如果您仅在会话开始时还原模型变量的一个子集,则必须为其他变量运行初始化操作。更多信息请查看tf.variables_initializer

 
# Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add ops to save and restore only 'v2' using the name "my_v2"
saver = tf.train.Saver({"my_v2": v2})
# Use the saver object normally after that.
...
  • 无标签