详解TensorFlow的 tf.train.SummaryWriter 函数:保存 TensorBoard 可视化数据

  • Post category:Python

TensorFlow的tf.train.SummaryWriter函数的作用是用于将图形、数据汇总并写入TensorBoard的日志目录中。该函数会将在训练过程中收集的数据合并后输出到磁盘中,方便在TensorBoard中查看和分析。以下是tf.train.SummaryWriter的使用方法:

1.创建SummaryWriter对象

writer = tf.summary.FileWriter(logdir, graph=tf.get_default_graph())

其中,logdir表示TensorBoard日志目录的路径,graph表示使用DefaultGraph或指定Graph对象。这条语句需要在TensorFlow图形创建完毕之后执行。

2.写入事件和摘要信息

merged_summary = tf.summary.merge_all()
summary, _ = sess.run([merged_summary, train_op], feed_dict={x: x_data, y: y_data})
writer.add_summary(summary, global_step)

其中,merged_summary将所有摘要操作组合成一个操作,summary运行merged_summary操作,将汇总的数据通过Writer写入文件。一般在训练过程中会运行多次summary操作,每次运行都会生成一个新的摘要,通过global_step来区分不同的summary,从而在TensorBoard中可以看到每一步的结果。

以上是tf.train.SummaryWriter使用方法的完整攻略,下面提供两个实例:

实例1:在MNIST数据集上使用tf.train.SummaryWriter

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# 导入数据
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 定义Placeholders
x = tf.placeholder(tf.float32, [None, 784], name='X')
y = tf.placeholder(tf.float32, [None, 10], name='Y')

# 定义模型和损失函数
W = tf.Variable(tf.zeros([784, 10]), name='W')
b = tf.Variable(tf.zeros([10]), name='b')
pred = tf.nn.softmax(tf.matmul(x, W) + b)
cost = tf.reduce_mean(-tf.reduce_sum(y * tf.log(pred), reduction_indices=1))

# 定义训练优化器和摘要操作
optimizer = tf.train.AdamOptimizer(0.01).minimize(cost)
tf.summary.scalar(name='cost', tensor=cost)
merged_summary = tf.summary.merge_all()

# 初始化变量和摘要写入器
init = tf.global_variables_initializer()
writer = tf.summary.FileWriter('./log/', graph=tf.get_default_graph())

# 运行图形
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(25):
        avg_cost = 0
        total_batch = int(mnist.train.num_examples / 100)
        for i in range(total_batch):
            batch_x, batch_y = mnist.train.next_batch(100)
            _, c, summary = sess.run([optimizer, cost, merged_summary], feed_dict={x: batch_x, y: batch_y})
            avg_cost += c / total_batch
            writer.add_summary(summary, epoch * total_batch + i)
        print("Epoch:", '%04d' % (epoch + 1), "cost=", "{:.9f}".format(avg_cost))
    print("Optimization Finished!")

实例2:使用TensorBoard可视化张量的变化

import tensorflow as tf

a = tf.Variable(tf.zeros([100]), name='a')
b = tf.Variable(tf.zeros([100]), name='b')
c = tf.add(a, b, name='sum')
tf.summary.scalar(name='a', tensor=a[1])
tf.summary.scalar(name='b', tensor=b[1])
tf.summary.scalar(name='c', tensor=c[1])
merged_summary = tf.summary.merge_all()

writer = tf.summary.FileWriter('./log/', graph=tf.get_default_graph())

sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(100):
    _, summary = sess.run([tf.assign(a[i], i), merged_summary])
    writer.add_summary(summary, global_step=i)

以上两个实例分别展示了在MNIST数据集上使用tf.train.SummaryWriter记录损失函数和使用SummaryWriter可视化张量变量的变化。