tensorflow中TensorflorBoard和checkpoints学习笔记

TensorBoard 工作机制

TensorBoard 通过读取tensorflow事件文件来运行,TensorFlow 的事件文件包括了你会在 TensorFlow 运行中涉及到的主要数据。
首先,创建你想汇总数据的 TensorFlow 图,然后再选择你想在哪个节点进行汇总(summary)操作。

比如,假设你正在训练一个卷积神经网络,用于识别 MNISt 标签。你可能希望记录学习速度(learning rate)的如何变化,以及目标函数如何变化。通过向节点附加scalar_summary操作来分别输出学习速度和期望误差。然后你可以给每个 scalary_summary 分配一个有意义的 标签,比如 ‘learning rate’ 和 ‘loss function’。
具体代码如下:

# Add the loss to summary
tf.summary.scalar('cross_entropy', loss)

# Evaluation op: Accuracy of the model
with tf.name_scope("accuracy"):
  correct_pred = tf.equal(tf.argmax(score, 1), tf.argmax(y, 1))
  accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
   
# Add the accuracy to the summary
tf.summary.scalar('accuracy', accuracy)

或者你还希望显示一个特殊层中激活的分布,或者梯度权重的分布。可以通过分别附加 histogram_summary 运算来收集权重变量和梯度输出。
例如:

# Add gradients to summary  
for gradient, var in gradients:
  tf.summary.histogram(var.name + '/gradient', gradient)

然后你可以执行合并命令,它会依据特点步骤将所有数据生成一个序列化的Summary protobuf对象。最后,为了将汇总数据写入磁盘,需要将汇总的protobuf对象传递给tf.train.Summarywriter

SummaryWriter 的构造函数中包含了参数 logdir。这个 logdir 非常重要,所有事件都会写到它所指的目录下。此外,SummaryWriter 中还包含了一个可选择的参数 GraphDef。通过指定该参数,可以在TensorBoard中展示Tensorflow中的Graph。
例如:

# Merge all summaries together
merged_summary = tf.summary.merge_all()

# Initialize the FileWriter
writer = tf.summary.FileWriter(filewriter_path)

            # Generate summary with the current batch of data and write to file
            if step%display_step == 0:
                s = sess.run(merged_summary, feed_dict={x: batch_xs, 
                                                        y: batch_ys, 
                                                        keep_prob: 1.})
                writer.add_summary(s, epoch*train_batches_per_epoch + step)
                
            step += 1

启动TensorBoard的命令如下

python tensorflow/tensorboard/tensorboard.py --logdir=path/to/log-directory

或者,如果你已经通过pip安装了 TensorBoard,你可以通过执行更为简单地命令来访问 TensorBoard

tensorboard --logdir=/path/to/log-directory

其中–logdir命令行参数指定的路径必须跟SummaryWriter的logdir参数值保持一致,TensorBoard才能够正确读取到Tensorflow的事件文件

启动Tensorflow后,在浏览器中输入http://localhost:6006 即可访问TensorBoard页面了。
tensorflow中TensorflorBoard和checkpoints学习笔记_第1张图片
summary操作函数汇总:
http://www.tensorfly.cn/tfdoc/api_docs/python/train.html#merge_all_summaries
参考文件:
http://www.tensorfly.cn/tfdoc/how_tos/summaries_and_tensorboard.html

checkpoints模型的保存和恢复

Estimators

Estimators是TensorFlow的高层API,它大大简化了机器学习的编程。Estimator封装了以下功能:
模型训练
模型评价
模型预测
模型导出
TensorFlow提供了一些Estimator,你也可以开发自己的Estimator,不论是TensorFlow提供的还是你自定义的都是tf.estimator.Estimator的子类。
Estimator 提供了一个安全的分布式的训练环,它控制了如何和怎样去完成下边的任务

  • 构建graph
  • 初始化变量
  • 启动队列
  • 异常处理
  • 创建checkpoint文件和错误恢复
  • 为TensorBoard保存概要信息
    用Estimator写一个应用的时候,你必须把数据输入流和model分开。这样你可以方便的来更换不同的数据源来实验

预置的Estimators
预置的 Estimators让你基于高层的封装的TensorFlow API进行开发,你不用去自己创建计算流图和session,因为Estimator会处理所有的流程。也就是预置的Estimators会自己创建和管理Graph和Session对象。而且它可以让你通过很小的改动就可以尝试不同的模型架构。比如DNNClassifier是一个预置的Estimator,它是一个通过稠密前向传播的神经网络来进行分类预测的模型。
例如:

  1. 写一个或者多个数据导入的function。比如你写了两个方法,一个导入训练数据,一个导入测试数据。每个方法都返回两个object。
    – 一个dictionary,keys是feature的名字,values是Tensors(或者SparseTensors)保留着对应的feature的data。
    – 一个Tensor包含着一个或者多个label
    比如下边的代码展示了一个input function的概要:
def input_fn(dataset):
   ...  # 操作数据, 提取feature的名字和label
   return feature_dict, label
  1. 定义feature的columns。 每一个tf.feature_column表示一个feature的名字,类型和任意的预处理。比如下边的一段代码创建了3个feature column,他们持有integer或者floating-point类型的数据。前两个feature简单的定义了feature的名字和类型。第三个feature同时指定了一个lambda表达式,这个表达式会在读入数据时被调用。
population = tf.feature_column.numeric_column('population')
crime_rate = tf.feature_column.numeric_column('crime_rate')
median_education = tf.feature_column.numeric_column('median_education',
                    normalizer_fn='lambda x: x - global_education_mean')
  1. 实例化预置的Estimator。
estimator = tf.estimator.Estimator.LinearClassifier(
    feature_columns=[population, crime_rate, median_education])
  1. 调用 training,evalutation或者inference方法。比如所有的Estimator都提供一个train方法来训练模型。
estimator.train(input_fn=my_training_set, steps=2000)

预置的Estimator内置了best practices,提供了如下的好处:
– 默认实现了帮助我们决定计算流图的哪一部分应该在哪里运行,实现了针对单机和集群的策略。
– 提供了很好的event(summary)记录和全局有用的summaries。
如果你不用内置的Estimator,你就需要自己实现上边所说的这行功能。

自定义Estimator
不论是内置还是自定义的Estimator,最重要的就是其中的模型函数(Model Function),它是一个为建模,评估,预测创建 graphs的方法。预置模型已经实现了这些。如果你要自定义一个Estimator,你就要自己实现。
建议流程:
假如存在一个合适的预置的Estimator,用它去build你自己的第一个模型,把它作为你的baseline。
用这个预置的Estimator去测试你的整个流程,包括测试你的数据的完整性和可靠性。
如果有多个预置的Estimator合适,试着替换不同的Estimator,看哪个好。
如果可能,自己动手创建你自己的Estimator去改善你的模型。

checkpoints

Tensorflow可以将训练好的模型以两种形式保存:

  • chekpoints检查点集,依赖于创建模型的代码
  • SavedModel已保存模型,不依赖于创建模型的代码

保存部分训练的模型

Estimator自动将这些写入硬盘:

  • checkpoints,即训练期间创建的模型的版本。
  • event files,其中包含TensorBoard用于创建可视化的信息。
    要将值分配给任何Estimator的构造函数的可选model_dir参数以指定Estimator存储其信息的顶级目录。

检查点文件目录

checkpoint_path = "/alexnet_tensorflow/insect/checkpoints1/"

如果没有在构造函数里指定 model_dir,Estimator将检查点文件写入由Python的tempfile.mkdtemp函数选择的临时目录。

检查点保存频率
默认规则:

  • 每600秒写一次checkpoint
  • 当train 方法开始(第一次迭代)和完成(最终迭代)时写入检查点
  • 只保留目录中最近的5个检查点。
    也可以通过以下步骤修改:
  • 创建一个定义所需计划的RunConfig对象。
  • 在实例化Estimator时,将该RunConfig对象传递给Estimator的config参数。

你可能感兴趣的:(深度学习)