主要介绍TensorFlow提供的一系列用来管理实验的优秀的工具。包括tf.train.Saver类,
TensorFlow的随机种子和NumPy的随机状态,并可视化我们的训练过程。
tf.train.Saver()
tf.train.Saver()类使得我们能够用二进制文件保存计算图的变量。这样使得我们可以在若干步训练过后保存参数并随时重新加载参数进行训练。
例如我们想每训练1000步保存一次参数,我们可以这样做:
在TensorFlow术语中,保存图形变量的步骤称为检查点。由于我们将创建多个检查点,因此将模型所经历的训练步骤的数量附加到名为global_step的变量中会很有帮助。 在TensorFlow程序中看到这是一个非常常见的变量。 我们首先需要创建它,将其初始化为0,并将其设置为不可训练,因为我们不希望TensorFlow对其进行优化。
我们需要将global_step作为参数传递到optimizer中,使得它能够每训练一步加一。
为了在名为“checkpoints”的文件夹保存检查点,我们这样操作:
于是整个word2vec的训练过程大概如下:
这时检查点文件都在文件夹checkpoints中。
如果想要恢复某个检查点,可以用以下语句:
值得注意的是,我们只能恢复已经存在的checkpoints文件,所以在恢复时,需要先检查文件的有效性,可以这样做:
默认情况下,saver.save()保存图中的所有变量,而且也是推荐这么做的。但是,但是也可以通过以下方法只保存部分变量的值:
注意:savers只是保存了变量的值,并没有保存整个计算图,所以我们需要自己创建计算图,然后载入变量。检查点文件指定了从变量到tensor的映射方式。人们通常不只是保存上一次迭代的参数,还保存迄今为止效果最好的参数,以便可以根据最佳参数评估模型。
tf.summary
我们可以使用Tensorboard可视化训练数据,包括loss, average loss, accuracy等。可以将它们可视化为点,直方图,甚至是图像。所以我们建立一个新的name scope来管理所有这类操作。
然后用 sess.run()来执行。
接着我们需要用用于可视化计算图的FileWriter对象来将这些summary写入文件。
然后我们就可以得到一些可视化结果。
值得注意的是,如果我们将summary数据保存在graph文件夹的不同子文件夹,就可以对不同超参数的训练结果进行比较。
我们也可以使用tf.summary.image将结果可视化为图片。
Control Randomization
我们往往必须控制随机化过程才能为实验获得稳定的结果。NumPy以随机种子和随机状态获得随机数。但是TensorFlow不允许我们以numpy的方式获得随机状态,但它确实可以让我们通过以下两种方式获得稳定的随机结果:
在操作级别设置随机种子。 所有的随机张量都允许你在初始化时传入种子值。
|
|
注意每个新会话都会重新开始随机状态。例如:
|
|
随着操作级别的随机种子,每个操作保持自己的种子。
在计算图级别用tf.Graph.seed设置随机种子
|
|
如果你不关心图中每个操作的随机化,而只是希望能够在另一个图上复制结果(以便其他人可以在你自己的图上复制你的结果),你可以使用tf.set_random_seed。设置当前的TensorFlow随机种子只影响当前的默认图形。
例如,有两个模型 a.py 和 b.py,它们有相同的代码。
当没有设置图级别的随机种子时,两个代码文件会运行得到不同的结果。而如果设置了,则会得到相同的结果。
Reading Data in Tensorflow
将数据加载到TensorFlow图中有两种主要的方法:一种是通过我们熟悉的feed_dict,另一种是通过读者使我们直接从文件中读取张量。当然,第三种方法是使用常量加载数据,但是这会造成图严重臃肿且无法运行。为了明白为什么我们需要比feed_dict更多的东西,我们需要看看feed_dict是如何工作的。Feed_dict将首先将数据从存储系统发送到客户端,然后从客户端发送到工作进程。这会导致数据变慢,特别是如果客户端与工作进程不在同一台机器上。TensorFlow有readers可以直接将数据加载到工作进程中。当我们不在分布式系统或者当我们的数据集很小的时候,这种改进将不会被注意到,但是它仍然值得研究。 TensorFlow有几个内置读卡器来满足您的阅读需求。
从队列读取数据。
|
|
Threads 和 Queues
我们可以使用tf.Coordinator 和 tf.QueueRunner 来管理队列。