Table of Contents
第七章 Tensorboard可视化图及训练
TensorboardTensorboard可以用来可视化图和训练曲线,可以帮助识别图的错误及瓶颈。下面以最小批量梯度下降算法为例探究Tensorboard的使用。
7.1 过程记录
- 导入包
所用包与之前类似,额外导入datatime包,方便使用系统时间命名日志文件,具体代码如下:
import tensorflow as tf
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import StandardScaler
from datetime import datetime
- 数据处理
将数据下载,整理并做预处理。
housing = fetch_california_housing()
m,n = housing.data.shape # 获取数据的行列数
housing_data_plus_bias = np.c_[np.ones((m,1)),housing.data] # 为数据添加偏差项, 即添加y=ax+b中的b,其中b为1
# 数据预处理,归一化
scaler = StandardScaler().fit(housing_data_plus_bias)
scaled_housing_data_plus_bias = scaler.transform(housing_data_plus_bias)
- 设置日志文件
定义日志文件目录,每次运行时指定不同的日志文件,否则Tensorboard会自动将同目录下同名文件合并,导致可视化结果混乱。所以最方便的命名方法是利用本地时间戳进行命名。
now = datetime.utcnow().strftime("%Y%m%d%H%M%S")
root_logdir = "tf_logs"
logdir = "{}/run-{}/".format(root_logdir,now)
# # 以下代码放置在构造期最后
# mse_summary = tf.summary.scalar('MSE',mse)
# file_writer = tf.summary.FileWriter(logdir, tf.get_default_graph())
- 创建计算图(构造期)
将图的定义与训练状态(汇总)写入Tensorboard需要读取的日志文件中。
X = tf.placeholder(tf.float32, shape=(None, n+1), name="X")
y = tf.placeholder(tf.float32, shape=(None, 1), name="y")
n_epochs = 1000
batch_size = 100
n_batches= int(np.ceil(m/batch_size))
global_learning_rate = 0.01
XT = tf.transpose(X)
theta = tf.Variable(tf.random_uniform([n+1,1],-1.0,1.0),name="theta") # * 参数 seed=42
y_pred = tf.matmul(X, theta, name="prediction") # 预测值
error = y_pred-y # 误差
mse = tf.reduce_mean(tf.square(error), name="mse") # 均方误差(成本函数)
## 定义优化器(梯度下降)
optimizer = tf.train.GradientDescentOptimizer(learning_rate = global_learning_rate)
training_op = optimizer.minimize(mse)
## 定义汇总
mse_summary = tf.summary.scalar('MSE',mse) # 创建了用来求MSE值的节点,并将其写入称为汇总(summary)的二进制日志字符串中
file_writer = tf.summary.FileWriter(logdir, tf.get_default_graph()) # 创建一个将汇总写入日志目录的file_writer
- 创建会话(执行期)
在训练时定期对mse_summary节点求值,将汇总信息输出,并利用file_writer将其写入事件文件(日志文件)。
init = tf.global_variables_initializer() # 添加初始化节点
def fetch_batch(epoch, batch_index, batch_size):
# 随机分组
np.random.seed(epoch * n_batches + batch_index)
indices = np.random.randint(m, size=batch_size)
X_batch = scaled_housing_data_plus_bias[indices]
y_batch = housing.target.reshape(-1, 1)[indices]
return X_batch, y_batch
with tf.Session() as sess:
sess.run(init)
for epoch in range(n_epochs):
for batch_index in range(n_batches):
X_batch, y_batch = fetch_batch(epoch, batch_index, batch_size)
# 将均方误差mse写入日志文件
if batch_index % 10 == 0:
summary_str = mse_summary.eval(feed_dict={X:X_batch, y:y_batch})
step = epoch * n_batches + batch_index
file_writer.add_summary(summary_str, step)
sess.run(training_op, feed_dict={X:X_batch, y:y_batch})
best_theta = theta.eval()
print("The best theta is", best_theta)
file_writer.close()
- 运行结果
运行会话后输出最终参数值并在目录./tf_logs/run-20190410073421
下(目录名即系统时间戳)生成文件events.out.tfevents.1561521973.BaoDadeMacBook-Pro.local
。
- 启动Tensorboard服务器
可以通过多种方式启动Tensorboard服务,可以通过virtualenv新建一个虚拟环境并启动Tensorboard,也可以在当前目录下直接启动Tensorboard,个人感觉两者并无太大差别,只要保证启动Tensorboard服务的目录一样就好。
-
在当前目录启动Tensorboard
终端进入当前目录;
启动Tensorboard,终端输入:tensorboard --logdir=./tf_logs/(file_writer序列化数据的存储路径)
;
启动完毕后:浏览器输入localhost:6006
-
virtualenv环境中启动Tensorboard
根据个人喜好进入一个目录并在此目录下创建一个virtualenv环境并激活它;
在虚拟环境下启动Tensorboard:tensorboard --logdir=tf_logs/ starting TensorBoard on port 6006 (You can navigate to http://0.0.0.0:6006)
- 查看训练状态
由终端提示TensorBoard 1.13.1 at ...local:6006
可知Tensorboard服务已启动并在6006端口监听,在浏览器中输入loclahost:6006
可查看Tensorboard的监听界面如下:
- 使用Tensorboard
再次运行之前的代码,将产生新的日志文件。关于Tensorboard的使用可参见图9-2和图9-3。
7.2 参考
[1] Geron.机器学习实战