TensorBoard及模型保存
天学网人工智能学院
2018年07月05日 17:18

本周的教程主要介绍-使用TensorFlow训练模型的一些相关技巧,包括:

  • 模型变量的保存和恢复

  • TensorBoard用法

  • 利用 tf.summary 记录数据

  • 可视化计算图

模型变量的保存和恢复

TensorFlow中的 tf.Variable 提供了表达模型状态的最好的方法,在这一节中,我们将介绍如何保存和恢复变量。

tf.train.Saver 类提供了保存和恢复模型的方法,tf.train.Saver  的构造函数将为计算图中增加save 和 restore 操作。

TensorFlow将变量都存在二进制checkpoint 文件 之中,内容基本上就是将变量名称与tensor相对应。

保存变量

使用tf.train.Saver() 创建Saver 来管理模型中的所有变量,用以下语句保存所有变量:

saver.save(sess, "./tmp/model.ckpt")

这个语句表示将这个session中运行的图的所有变量存在./tmp/model.ckpt 路径下。

下面的例子就是将所有的变量存在一个 checkpoint 文件中:

import tensorflow as tf import numpy as np graph = tf.Graph() # 定义模型 with graph.as_default():    # Model parameters    W = tf.Variable([.3], dtype=tf.float32)    b = tf.Variable([-.3], dtype=tf.float32)    # Model input and output    x = tf.placeholder(tf.float32)    linear_model = W*x + b    y = tf.placeholder(tf.float32)    # loss    loss = tf.reduce_mean(tf.square(linear_model - y)) # MSE    # optimizer    optimizer = tf.train.GradientDescentOptimizer(0.01)    train = optimizer.minimize(loss) # training data x_train = [1, 2, 3, 4] y_train = [0, -1, -2, -3] with tf.Session(graph=graph) as sess:    # 定义Saver    saver = tf.train.Saver()    # training loop    init = tf.global_variables_initializer()    sess.run(init)    for i in range(5000):        sess.run(train, {x: x_train, y: y_train})    # evaluate training accuracy    curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x: x_train, y: y_train})    print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))    save_path = saver.save(sess, "./tmp/model.ckpt")      print("Model saved in file: %s" % save_path)

输出为:

W: [-0.99999601] b: [ 0.99998856] loss: 2.20526e-11 Model saved in file: ./tmp/model.ckpt

恢复变量

tf.train.Saver 不仅仅将变量存到checkpoint文件中,它也可以用来恢复变量,语句是:

saver.restore(sess, "./tmp/model.ckpt")

如将上面程序 with tf.Session 部分改为:

with tf.Session(graph=graph) as sess:    # 定义saver    saver = tf.train.Saver()    # 恢复模型    saver.restore(sess, "./tmp/model.ckpt")    curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x: x_train, y: y_train})    print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))    print("Model restored")

输出为:

INFO:tensorflow:Restoring parameters from ./tmp/model.ckpt W: [-0.99999601] b: [ 0.99998856] loss: 2.20526e-11 Model restored

选择保存和恢复的变量

上述的方式将所有的变量都存储或者读取出来,tf.train.Saver 也支持选择某部分的变量进行储存,构造方式为:

  • 一个变量list

  • 一个Python词典,其中key是变量名称,值就是变量

定义如下计算图:

graph_t = tf.Graph() with graph_t.as_default():    a = tf.Variable(1.5, name='var_a')    b = tf.Variable(2.5, name='var_b')    op = a.assign_add(1)

存储变量:

with tf.Session(graph=graph_t) as sess:    init = tf.global_variables_initializer()    sess.run(init)    sess.run(op)    saver = tf.train.Saver([a])  # 与 tf.train.Saver({var_a: a})等价    saver.save(sess, './tmp/model.ckpt')

恢复变量:

with tf.Session(graph=graph_t) as sess:    # 单独初始化b    sess.run(b.initializer)    saver = tf.train.Saver([a])  # 与 tf.train.Saver({var_a: a})等价    saver.restore(sess, './tmp/model.ckpt')    print(sess.run(a))

TensorBoard用法

TensorBoard 是TensorFlow自带的可视化工具,可以用来可视化定义的计算图,绘制模型训练过程中的相关指标,如正确率等等。

利用 tf.summary 记录数据

tf.summary  被用来导出用于可视化模型的相关数据,支持记录多种类型,其中最常用的就是tf.summary.scalar ,用于记录标量,如:

summary_loss = tf.summary.scalar('MSE', loss) summary_b = tf.summary.scalar('b', b)

除了以上步骤以外,还需要定义tf.summary.FileWriter 来将对应数据写入文件,以下代码将summary_loss 和summary_b 写入文件夹./tmp/visualization :

writer = tf.summary.FileWriter('./tmp/visualization/') _, s_loss, s_b = sess.run([train, summary_loss, summary_b], {x: x_train, y: y_train}) writer.add_summary(s_loss) writer.add_summary(s_b)

当需要记录的参数很多的时候,可以使用tf.summary.merge_all 将所有的记录操作汇总,简化代码。改为使用tf.summary.merge_all 并且增加记录训练的step后,上述代码变为:

writer = tf.summary.FileWriter('./tmp/visualization/') merged = tf.summary.merge_all() _, s_m = sess.run([train, merged], {x: x_train, y: y_train}) writer.add_summary(s_m, global_step=i)

使用以下命令打开TensorBoard :

tensorboard --logdir ./tmp/visualization

其中 --logdir 后面的路径要与 tf.summary.FileWriter 中定义的路径对应。然后打开浏览器,输入http://127.0.0.1:6006

计算图

如果要可视化计算图,可以在定义 tf.summary.FileWriter 的时候指明:

writer = tf.summary.FileWriter('./tmp/visualization/', graph=graph)

或者定义  tf.summary.FileWriter  之后添加:

writer = tf.summary.FileWriter('./tmp/visualization/') writer.add_graph(graph)

可以通过为变量、placeholder命名,结合name_scope 使得计算图可视化的时候更加清晰。

完整代码:

graph = tf.Graph() with graph.as_default():    # Model parameters    W = tf.Variable([.3], dtype=tf.float32, name='W')    b = tf.Variable([-.3], dtype=tf.float32, name='b')    # Model input and output    x = tf.placeholder(tf.float32, name='input_x')    y = tf.placeholder(tf.float32, name='input_y')    with tf.name_scope('linear_model'):        linear_model = W*x + b    with tf.name_scope('cal_loss'):        # loss        loss = tf.reduce_mean(tf.square(linear_model - y), name='loss') # MSE    with tf.name_scope('add_summary'):        summary_loss = tf.summary.scalar('MSE', loss)        summary_b = tf.summary.scalar('b', b[0])    with tf.name_scope('train_model'):        # optimizer        optimizer = tf.train.GradientDescentOptimizer(0.01)        train = optimizer.minimize(loss) # training data x_train = [1, 2, 3, 4] y_train = [0, -1, -2, -3] with tf.Session(graph=graph) as sess:    # define summary writer    writer = tf.summary.FileWriter('./tmp/visualization/', graph=graph)    # merge summaries    merged = tf.summary.merge_all()    # training loop    init = tf.global_variables_initializer()    sess.run(init)    for i in range(5000):        _, s_m = sess.run([train, merged], {x: x_train, y: y_train})        writer.add_summary(s_m, global_step=i)    # evaluate training accuracy    curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x: x_train, y: y_train})    print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))

参考资料

  • TensorFlow官网介绍

  • Stanford CS20SI

下周同一时间"玩转TensorFlow与深度学习模型"系列教程(八): “TensorFlow中的正则化方法” ,请大家保持关注! 

喜欢我们的小伙伴记得动动您纤细的手指点赞留言哦!