继续挖坑,因为Batch normalization的inference还没有解决,不知道怎么在tf.Tensor中更新数值,参考tf.layer.BatchNormalization的思路,需要利用is_training
来选择feed给BN的mean
和variance
。因此,需要理解TensorFlow的graph概念。除此之外,TF提供了TensorBoard作为计算图可视化的工具,也是值得借鉴的。
计算图—Graph
TensorFlow是一个通过计算图的形式来表达张量之间通过计算相互转化的过程[1]。作为TensoFlow的基本概念,TF中的所有计算都会转化为计算图上的节点,节点之间的边用于描述计算之间的依赖关系。TF中不同的计算图之间维护的节点和边是独立的。通过tf.GraphKeys可以对图进行维护,稍后会介绍。
利用tf.Graph
类实例化计算图,有如下的样例,
TensorBoard 可视化
TensorBoard可以有效地展示TF在运行过程中的计算图、各种指标随时间的变化趋势以及训练中使用的图像等信息,其利用TF运行过程中输出的日志文件可视化程序的运行状态。TensorBoard和TensorFlow运行在不同的进程中,TB会自动读取TF的日志文件,并呈现当前的运行状态。根据TensorBoard的官方文档,其实现过程有如下步骤,
1. 搭建网络
First, create the TensorFlow graph that you’d like to collect summary data from, and decide which nodes you would like to annotate with summary operations.
利用TensorFlow搭建网络,例如基于MLP的手写体识别网络,提供一个样例,可以参考。
2. Select variables to be summarized
通常我们关注训练过程中待学习的参数 (如weights, biases等) 的变化和收敛情况,通过tf.summary.scalar
和tf.summary.histogram
可以很方便地收集这些数据。下面给出一个样例,参考了[3],
而对于单个Variable
,可以用tf.summary.scalar(name,variable)
的形式进行收集。
3. Merge summary data
定义好要收集的信息,需要对他们进行汇总,此时用tf.summary.merge_all
进行汇总,例如
4. FileWriter for saving the log
为了将训练中收集的数据保存到日志中,可以用tf.summary.FileWriter
来实现,此时需要提供存放日志的文件夹位置,即logdir
。
此时,利用sess.run(tf.global_variables_initializer())
初始化所有Tensor和Variable,便可以开始训练网络。
5. Running
merged
的类型为tensorflow.python.framework.ops.Tensor
,属于tf.Graph的一部分。因此也需要在session
中运行,并且要提供feed_dict
。相应的python实现如下
6. 利用TensorBoard可视化
TensorFlow提供了tensorboard.py
脚本用于可视化。利用如下指令启动并运行TensorBoard, 其默认端口为6006,这里利用--port
显式表达
|
|
注:在执行此条指令的时候,可能会报错command not found: tensorboard,解决方法参考本文
以下给出运行的样例,我写了一个notebook,欢迎来PR :)
- Graph及FC1和train节点

- Scalars and histograms

References
[1] TensorFlow实战Google深度学习框架
[2] tf.summary.FileWriter
[3] TensorBoard: Visualizing Learning
[3] tensorboard在linux下的启动问题