详解TensorFlow的 tf.summary.FileWriter 函数:将 TensorBoard 可视化数据写入磁盘

  • Post category:Python

TensorFlow的tf.summary.FileWriter函数主要用于将TensorFlow graph的信息写入TensorBoard中,以便可视化查看训练过程中的变化和性能指标。

具体的使用方法如下:

首先需要声明一个文件写入器对象,例如:

writer = tf.summary.FileWriter("/path/to/log/directory", sess.graph)

其中,/path/to/log/directory是一个文件夹的路径,将存储TensorBoard文件。sess.graph是用于可视化的计算图对象。

然后,在训练模型的过程中可以调用tf.summary.FileWriter对象的方法,将可视化结果写入到TensorBoard日志目录中。主要的方法有:

  1. add_summary(summary, global_step=None): 将一个TensorFlow summary写入日志目录中,其中summary是需要写入的summary对象,global_step参数是可选的,用于标记每个summary的时间步,以便在TensorBoard界面中显示时间序列。

  2. add_graph(graph, global_step=None): 将一个TensorFlow graph写入日志目录中,其中graph是需要写入的计算图对象,global_step参数同上。

具体使用方法如下:

import tensorflow as tf

# 构建计算图
a = tf.constant(1)
b = tf.constant(2)
c = a + b

# 创建文件写入器对象
writer = tf.summary.FileWriter("/path/to/log/directory", tf.get_default_graph())

# 写入计算图
writer.add_graph(tf.get_default_graph())

# 执行计算图
with tf.Session() as sess:
    print(sess.run(c))

# 关闭文件写入器
writer.close()

在以上例子中,“/path/to/log/directory”是TensorBoard日志目录的路径。首先,我们在创建的计算图中创建一个文件写入器对象。在这个例子中,我们通过add_graph方法将计算图写入日志目录中。运行计算图对象,标记了每个TensorBoard日志的时间步,然后关闭文件写入器对象。

另一个实例是在TensorFlow中使用minibatch进行训练。这里我们将使用add_summary方法,将每个minibatch的精度和误差写入TensorBoard。关键代码如下:

import tensorflow as tf
import numpy as np

# 定义模型
def model(inputs):
    with tf.name_scope("layer1"):
        W1 = tf.Variable(tf.random_uniform([4, 4], -1.0, 1.0), name="W1")
        b1 = tf.Variable(tf.zeros([4]), name="b1")
        z1 = tf.nn.relu(tf.matmul(inputs, W1) + b1)
    with tf.name_scope("layer2"):
        W2 = tf.Variable(tf.random_uniform([4, 1], -1.0, 1.0), name="W2")
        b2 = tf.Variable(tf.zeros([1]), name="b2")
        z2 = tf.matmul(z1, W2) + b2
    return z2

# 计算精度和误差
def accuracy(targets, predictions):
    with tf.name_scope("accuracy"):
        correct_predictions = tf.equal(tf.argmax(targets,1), tf.argmax(predictions,1))
        acc = tf.reduce_mean(tf.cast(correct_predictions, "float"))
        tf.summary.scalar("accuracy", acc)
    return acc

def loss(predictions, targets):
    with tf.name_scope("loss"):
        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=predictions, labels=targets))
        tf.summary.scalar("loss", loss)
    return loss

# 生成随机数据
train_data = np.random.uniform(size=(1000,4))
train_targets = np.zeros((1000,2))
for i in range(1000):
    if train_data[i,0]+train_data[i,1]+train_data[i,2]+train_data[i,3] > 2:
        train_targets[i,:] = [0,1]
    else:
        train_targets[i,:] = [1,0]

# 构造模型
x = tf.placeholder(tf.float32, [None, 4])
y_ = tf.placeholder(tf.float32, [None, 2])
predictions = model(x)
accuracy_op = accuracy(y_, predictions)
loss_op = loss(predictions, y_)

# 创建文件写入器对象
writer = tf.summary.FileWriter("/path/to/log/directory", tf.get_default_graph())

# 迭代训练
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(1000):
        indices = np.random.choice(1000, size=10)
        batch_data = train_data[indices,:]
        batch_targets = train_targets[indices,:]
        _, train_accuracy, train_loss, summary = sess.run([train_step, accuracy_op, loss_op, merged_summary], feed_dict={x: batch_data, y_: batch_targets})
        writer.add_summary(summary, global_step=i)

# 关闭文件写入器
writer.close()

在这里,我们定义了一个具有两个隐藏层的神经网络,然后使用TensorFlow的函数生成了一些随机数据并进行训练。我们使用tf.summary.scalar函数来定义每个minibatch的精度和误差,然后通过add_summary方法将它们写入到TensorBoard日志目录中。在训练结束后,我们关闭文件写入器对象。

以上两个实例展示了tf.summary.FileWriter函数的主要用途:可视化TensorFlow graph和训练过程的指标。但它并不仅限于此,还可以用于可视化其他TensorFlow变量和评估过程中的指标。注意,为了使TensorBoard使用tf.summary.FileWriter日志文件,您需要在TensorBoard中使用相同的目录来运行。