
本周的教程主要介绍-使用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 是TensorFlow自带的可视化工具,可以用来可视化定义的计算图,绘制模型训练过程中的相关指标,如正确率等等。
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中的正则化方法” ,请大家保持关注!
喜欢我们的小伙伴记得动动您纤细的手指点赞留言哦!