使用TF2.x-GPU中的Tensorboard工具进行可视化训练分析:书写字体源码实现

TensorBoard是一套用于检查和理解TensorFlow运行和图形的Web应用程序,这也是Google的TensorFlow比Facebook的Pytorch最大的优势之一。

TensorBoard工具在Tensorflow中是非常常用的一种可视化分析工具,其参数解释如下:

log_dir:保存TensorBoard要解析的日志文件的目录的路径。

histogram_freq:频率(在epoch中),计算模型层的激活和权重直方图。如果设置为0,则不会计算直方图。必须为直方图可视化指定验证数据(或拆分)。

write_graph:是否在TensorBoard中可视化图像。当write_graph设置为True时,日志文件可能会变得非常大。

write_grads:是否在TensorBoard中可视化渐变直方图。 histogram_freq必须大于0。
batch_size:用以直方图计算的传入神经元网络输入批的大小。

write_images:是否在TensorBoard中编写模型权重以显示为图像。

embeddings_freq:将保存所选嵌入层的频率(在epoch中)。如果设置为0,则不会计算嵌入。要在TensorBoard的嵌入选项卡中显示的数据必须作为embeddings_data传递。

embeddings_layer_names:要关注的层名称列表。如果为None或空列表,则将监测所有嵌入层。

embeddings_metadata:将层名称映射到文件名的字典,其中保存了此嵌入层的元数据。如果相同的元数据文件用于所有嵌入层,则可以传递字符串。

embeddings_data:要嵌入在embeddings_layer_names指定的层的数据。Numpy数组(如果模型有单个输入)或Numpy数组列表(如果模型有多个输入)。

update_freq:‘batch’或’epoch’或整数。使用’batch’时,在每个batch后将损失和指标写入TensorBoard。这同样适用’epoch’。如果使用整数,比方说1000,回调将会在每1000个样本后将指标和损失写入TensorBoard。请注意,过于频繁地写入TensorBoard会降低您的训练速度。可能引发的异常:ValueError:如果设置了histogram_freq且未提供验证数据。

# Import the deep learning library
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
# Define our compuational graph
W1 = tf.constant(5.0, name="x")
W2 = tf.constant(3.0, name="y")
W3 = tf.cos(W1, name="cos")
W4 = tf.sin(W2, name="sin")
W5 = tf.multiply(W3, W4, name="mult")
W6 = tf.divide(W1, W2, name="div")
W7 = tf.add(W5, W6, name="add")

# Open the session
with tf.compat.v1.Session() as sess:
    cos = sess.run(W3)
    sin = sess.run(W4)
    mult = sess.run(W5)
    div = sess.run(W6)
    add = sess.run(W7)

    # Before running TensorBoard, make sure you have generated summary data in a log directory by creating a summary writer
    writer = tf.compat.v1.summary.FileWriter("./ComputationGraph", sess.graph)

    # Once you have event files, run TensorBoard and provide the log directory
    # Command: tensorboard --logdir="path/to/logs"

在这里插入图片描述

终端运行:备注:tensorboard --logdir="path/to/logs
到指定路径下执行:
tensorboard --logdir logs/ComputationGraph

根据提示打开链接:

Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.0.2 at http://localhost:6006/ (Press CTRL+C to quit)


在这里插入图片描述

书写字体源码实现:

import tensorflow as tf
import numpy as np
import math
from tensorflow import keras
from tensorflow.keras import datasets,layers,optimizers,Sequential
from tensorflow.keras.callbacks import TensorBoard
import datetime
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus']=True


#导入数据
(x_train,y_train),(x_test,y_test)=tf.keras.datasets.mnist.load_data()
print(x_train.shape,x_test.shape)

#预处理---正规化
def normalize(x,y):
    x=tf.cast(x,tf.float32)
    x/=255
    return x,y

#添加一层维度,方便后续扁平化
x_train=tf.expand_dims(x_train,axis=-1)
x_test=tf.expand_dims(x_test,axis=-1)

train_dataset=tf.data.Dataset.from_tensor_slices((x_train,y_train))
test_dataset=tf.data.Dataset.from_tensor_slices((x_test,y_test))
train_dataset=train_dataset.map(normalize)
test_dataset=test_dataset.map(normalize)


#画图
plt.figure(figsize=(10,15))
i=0
for (x_test,y_test) in test_dataset.take(25):
    x_test=x_test.numpy().reshape((28,28))
    plt.subplot(5,5,i+1)
    plt.grid(False)
    plt.xticks([])
    plt.imshow(x_test,cmap=plt.cm.binary)
    plt.xlabel([y_test.numpy()],fontsize=10)
    i+=1
plt.show()


#开始定义模型
model=tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28,28,1)),
    tf.keras.layers.Dense(128,activation=tf.nn.relu),
    tf.keras.layers.Dense(64,activation=tf.nn.relu),
    tf.keras.layers.Dense(10,activation=tf.nn.softmax)
])

model.summary()

# 模型编译
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

#开始训练
batch_size=32
train_dataset=train_dataset.repeat().shuffle(60000).batch(batch_size)
test_dataset=test_dataset.batch(batch_size)
#为tensorboard可视化保存数据
tensorboard_callback=tf.keras.callbacks.TensorBoard(histogram_freq=1)
model.fit(train_dataset,epochs=5,steps_per_epoch=math.ceil(60000/batch_size),callbacks=[tensorboard_callback])

#模型评估
test_loss,test_accuracy=model.evaluate(test_dataset,steps=math.ceil(10000/32))
print('Accuracy on test_dataset',test_accuracy)

# 模型预测
predictions = model.predict(test_dataset)


# 查看预测结果
def plot_test(i, predictions_array, true_labels, images):
    predic, label, img = predictions_array[i], true_labels[i], images[i]
    plt.grid(False)
    plt.xticks([])
    plt.imshow(img[..., 0], cmap=plt.cm.binary)
    predic_label = np.argmax(predic)
    if (predic_label == label):
        color = 'green'
    else:
        color = 'red'
    plt.xlabel("预测标签为:{},概率:{:2.0f}% (真实标签:{})".format(predic_label, 100 * np.max(predic), label), color=color)


def plot_value(i, predictions_array, true_label):
    predic, label = predictions_array[i], true_label[i]
    plt.grid(False)
    plt.xticks([])
    thisplot = plt.bar(range(10), predic, color='#777777')
    plt.ylim([0, 1])
    predic_label = np.argmax(predic)
    thisplot[predic_label].set_color('blue')
    thisplot[label].set_color('green')


rows, cols = 5, 3
num_images = rows * cols
for test_images, test_labels in test_dataset.take(1):
    test_images = test_images.numpy()
    test_labels = test_labels.numpy()

plt.figure(figsize=(2 * 2 * cols, 2 * rows))
for i in range(num_images):
    plt.subplot(rows, 2 * cols, 2 * i + 1)
    plot_test(i, predictions, test_labels, test_images)
    plt.subplot(rows, 2 * cols, 2 * i + 2)
    plot_value(i, predictions, test_labels)

运行之后在当前目录会生成logs训练的计算流程:
在这里插入图片描述

在该目录下运行命令:
tensorboard --logdir=’./train’ --host=127.0.0.1

这里在ubuntu或windows下可能会报错,这是因为没有给出权限,下面输入以下命令:
sudo chmod -R 777 train

执行结果:
TensorBoard 2.0.2 at http://127.0.0.1:6006/ (Press CTRL+C to quit)
在浏览器中打开提链接即可:
在这里插入图片描述
从本例的输出数据上就可以看到,训练过程中准确度是不断增大的,增大的速度由快到慢,这一点在tensorboard上显示为不断逼近0.97以上的弧线,切线斜率由大变小。事实上,在Scalars 选项卡上,你可以看到训练过程中随着准确度的增大,交叉熵在减小。在这里插入图片描述
在Graph选项卡中,你可以窥见整个模型的大致结构以及数据的流向。
在这里插入图片描述

在Distribution 选项卡中, 你可以看到激活函数(relu函数)激活神经网络中某一部分神经元的情况。
在这里插入图片描述
在Histogram 选项卡中,你可以看到各数据的直方图。

到此,训练和可视化过程完成。
参考文献:

模型可视化与tensorboard的使用
使用Tensorboard

通过TensorBoard分析模型

优化你的模型

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页