TensorBoard(2.x版本)使用入门
- TensorBoard工具介绍
- TensorBoard工作原理
- 配套TensorBoard的代码编写
- 一个简单的操作实例
- TensorFlow代码
- TensorBoard操作
- 一个稍微复杂的实例
- TensorFlow代码
- TensorBoard操作
- 注意事项说明
- Jupyter环境下的操作
- 其他说明
TensorBoard工具介绍
TensorBoard是TensorFlow附带一个可视化分析工具,主要用来进行性能分析和问题定位。如果神经网络非常复杂,那么TensorFlow是一款不可或缺的分析工具。
网上很多关于TensorBoard介绍是基于1.x版本的,本文是基于2.4.0版本进行介绍(TensorFlow2.x版本代码执行方式有很大不同),并提供基于Keras API配套代码。
TensorBoard工作原理
TensorBoard工作流程比较简单,分为如下步骤:
- 在TensorFlow代码中输出log信息 :首先要在TensorFlow代码中加入log输出功能,配置好输出的路径和信息类型;
- 在命令行中执行TensorBoard命令:TensorBoard命令是随着TensorFlow一起安装的(可在命令行中执行
tensorboard --version
查看是否正常安装,其版本号应该和TensorFlow相同)。TensorBoard实际是一个轻量级的定制化web server,提供http服务,其默认端口号是6006。可以在同一台计算机上运行多个TensorBoard实例,其端口号是在6006上累加。下面是一个命令样例,其中"logs"是存放log信息的目录。执行这条命令时,会显示http的端口号信息,请注意观察。
tensorboard --logdir logs
- 通过浏览器打开TensorBoard的图形化界:可以在本机或者其他联网机器上打开浏览器;如果在本机上打开,其输入浏览器地址为:
http://localhost:6006/
,如果在其他机器上打开,请输入:http://[执行TensorBoard命令的机器IP地址]:6006/
。(请注意:如果执行多个TensorBoard实例,其端口号就不再是6006。)
配套TensorBoard的代码编写
要想通过TensorBoard查看信息,必须要在TensorFlow代码中编写信息输出的指令。如果只需要输出默认信息,其编写的代码量很小。下面是代码编写的要点:
- 指定输出信息的存放路径;
- 指定输出信息的类型和内容;
- 选择恰当流程位置点插入输出信息的语句。
更加详细的TensorBoard指导请参考TensorBoard的官网。
本文作者使用的版本为:TensorFlow 2.4.0,Python 3.7.0, 操作系统macOS 10.14.6,IDE为Jupyter Notebook 6.1.6。
一个简单的操作实例
TensorFlow代码
import tensorflow as tf
import datetime, os
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 下面第一行代码是指定log信息输出路径,第二行代码是创建一个回调函数。
logdir = os.path.join("logs", datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))
tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1)
model.fit(x_train, y_train,
epochs=5,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback])
代码说明:
- 代码
logdir = os.path.join("logs", datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))
中"logs"是父目录,日期是子目录,两个目录名通过os.path.join
进行拼接,该方法可以解决不同操作系统的目录分隔符不同的问题(window目录分隔符是“\”,Linux和macOS是“/”)。注意:如果自行指定目录,例如:“dir1/dir2/dir3”,请使用:logdir = os.path.join("dir1", "dir2", "dir2")
,不要使用logdir = "dir1/dir2/dir3"
,因为该代码在Windows操作系统中会出问题。 -
model.fit
语句增加了一个参数callbacks=[tensorboard_callback]
,该参数指定了模型训练时的回调函数。 - 总结:该段代码在原来正常流程基础上,增加了两行代码,同时模型训练函数
model.fit
增加了一个参数。
TensorBoard操作
上面代码运行成功后,进行如下操作:
- 打开命令行终端(任意终端都可以),进入“logs”的上级目录,输入下面命令:
$tensorboard --logdir logs
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.4.0 at http://localhost:6006/ (Press CTRL+C to quit)
- 注意:执行tensorboard命令时,一定要注意当前路径位置。在上例中,"logs"路径是针对当前路径而言的,如果在当前路径中没有“logs”子目录,tensorboard不会报错,但是打开浏览器将无法查询到信息。
- 打开Chrome或者Firefox浏览器(其他浏览器Google不保证其正确性),在浏览器地址输入:
http://localhost:6006
,即可以看到TensorBoard的图形化界面。详细操作这里不再赘述。 - 如果tensorboard是运行在远程服务器上,或者想在其他机器上观察TensorBoard数据,只需要把localhost修改为tensorboard运行机器的IP地址即可。
- 可以运行多个tensorboard实例,注意其对应的端口号会变化的。
一个稍微复杂的实例
下面是一个稍微复杂的实例。
TensorFlow代码
import tensorflow as tf
import datetime, os
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
logdir = os.path.join("logs", datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))
tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1)
logdir_1 = logdir + 'test'
file_writer = tf.summary.create_file_writer(logdir_1)
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs=None):
my_text = str(model.layers[3].bias.numpy())
with file_writer.as_default():
tf.summary.text(f"Epoch {epoch} end :", my_text, step=0)
model.fit(x_train, y_train,
epochs=5,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback, myCallback()])
代码说明:
- 这里增加一个输出目录,增加一个回调函数。
- 增加的回调函数其作用是:在每次epoch结束时,输出layer 3(也就是
tf.keras.layers.Dense(10, activation='softmax')
这一层)的bias参数值。
TensorBoard操作
和之前例子操作不同之处是,在TensorBoard界面中,打开上面的“Text”标签,可以看到输出的信息。
注意事项说明
Jupyter环境下的操作
Jupyter环境支持内置TensorBoard显示,具体操作如下:
- 在运行代码之前增加一行语句:
%load_ext tensorboard
- 在模型的正常代码运行后,增加一行命令:
%tensorboard --logdir path/to/logs
- 说明:在Jupyter环境下显示TensorBoard界面比较受限(界面大小,操作灵活性),建议首选在浏览器是打开。
其他说明
- 关于TensorBoard更多操作和细节请浏览官网地址;
- TensorBoard官网文档质量不是很高,明显是多人共同写作而成,其代码风格不同,代码示例的TensorFlow版本也未必是最新版本的,甚至有一些明显编辑错误。阅读时注意自我分辨。