1 Tensorboard
Tensorboard专用于展示Tensorflow图的结构及绘制计算结果图像.帮助理解Tensorflow的工作原理,降低学习难度,总之,好工具.
2 基本用法
2.1 直接绘图
【Demo】
import tensorflow as tf
LOG_DIR = "./logs/addlog"
v1 = tf.constant([125.0], shape=[1], name='v1')
v1 = tf.Variable(tf.constant([125.0], shape=[1]), name='v2')
result = tf.add_n([v1, v2], name='add')
# 保存Tensorflow计算日志
writer = tf.summary.FileWriter(LOG_DIR, tf.get_default_graph())
writer.close()
【打开TensorBoard】
tensorboard --logdir=/home/xdq/xinPrj/python/AIstudy/NNTest/logs/addlog
TensorBoard 1.12.1 at http://xindq:6006 (Press CTRL+C to quit)
【结果:整体结构】
【结果:内部结构】
【Analysis】
(1) 由图2.1可知,定义两个变量,v1为常量,v2为变量;
(2) 由图2.2可知,变量v2由常量组成并取值;
(3) add即为结果;
2.2 命名空间绘图
【Demo】
import tensorflow as tf
LOG_DIR = "./logs/addlog"
with tf.name_scope("Input1"):
v1 = tf.Variable(constant([125.0], shape=[1]), name='v1')
with tf.name_scope("Input2"):
v2 = tf.Variable(tf.constant([125.0], shape=[1]), name='v2')
with tf.name_scope("Result"):
result = tf.add_n([v1, v2], name='add')
writer = tf.summary.FileWriter(LOG_DIR, tf.get_default_graph())
【打开TensorBoard】
tensorboard --logdir=/home/xdq/xinPrj/python/AIstudy/NNTest/logs/addlog
TensorBoard 1.12.1 at http://xindq:6006 (Press CTRL+C to quit)
【结果:整体结构】
【结果:内部结构】
【Analysis】
(1) 图2.3可知,定义加法由两个命名空间Input1和Input2组成;
(2) 图2.4 可是,命名空间有分别由变量v1和v2构成,从常量取值,完成读取分配并计算;
(3) add为结果;
2.3 命名空间+初始化
【Demo】
import tensorflow as tf
LOG_DIR = "./logs/addlog/"
with tf.name_scope("Input1"):
v1 = tf.Variable(tf.constant([125.0], shape=[1]), name='v1')
with tf.name_scope("Input2"):
v2 = tf.Variable(tf.constant([125.0], shape=[1]), name='v2')
result = tf.add_n([v1, v2], name='add')
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
writer = tf.summary.FileWriter(LOG_DIR, tf.get_default_graph())
wirter.close()
【打开TensorBoard】
tensorboard --logdir=/home/xdq/xinPrj/python/AIstudy/NNTest/logs/addlog
TensorBoard 1.12.1 at http://xindq:6006 (Press CTRL+C to quit)
【结果:整体结构】
【结果:内部结构】
【结果:初始化放入图中】
【结果:初始化放入主图内部结构】
【Analysis】
(1) 图2.5初始化在主图内部,图2.7初始化在主图内部;对比可知,命名空间依赖于初始化;(虚线连接)
(2) 图2.6和图2.8分别表示初始化在主图外部和内部的局部结构,可知命名空间的变量取值依赖于变量初始化;
(3) add为计算结果;
3 神经网络可视化
【Demo】
import tensorflow as tf
import numpy as np
import os
import matplotlib.pyplot as plt
from pylab import mpl
#
mpl.rcParams["font.serif"] = ['simhei']
MODEL_SAVE_PATH = "./models"
MODEL_NAME = "model.ckpt"
LOG_DIR = "./logs/NNlog"
# 模拟数据
x_data = np.linspace(-1, 1, 250, dtype=np.float32)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape).astype(np.float32)
y_data = np.square(x_data) - 0.5*x_data + noise
# 神经网络结构
input_size_1 = 1
output_size_1 = 10
input_size_2 = 10
output_size_2 = 1
def _result_():
# 输入层Input
with tf.name_scope("Input"):
xs = tf.placeholder(tf.float32, [None, 1], name='x')
ys = tf.placeholder(tf.float32, [None, 1], name='y')
# 神经网路第一层:Layer1
with tf.name_scope("Layer1"):
weights_1 = tf.Variable(tf.random_normal([input_size_1, output_size_1]), name='weights_1')
biases_1 = tf.Variable(tf.zeros([1, output_size_1]), name='biases_1')
layer_1 = tf.nn.relu(tf.matmul(xs, weights_1) + biases_1)
# 神经网络:输出层Output
with tf.name_scope("Output"):
weights_2 = tf.Variable(tf.random_normal([input_size_2, output_size_2]), name='weights_2')
biases_2 = tf.Variable(tf.zeros([1, output_size_2]), name='biases_2')
prediction = tf.matmul(layer_1, weights_2) + biases_2
# 损失函数
with tf.name_scope("Loss"):
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction), reduction_indices=[1]))
# 损失函数迭代优化
with tf.name_scope("Train_Step"):
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 增加变量
tf.add_to_collection('prediction', prediction)
tf.add_to_collection('loss', loss)
# 持久化模型
saver = tf.train.Saver()
# 训练
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
x = sess.run(xs, feed_dict={xs: x_data})
y = sess.run(ys, feed_dict={ys: y_data})
a = 0
# 迭代
for i in range(300):
train_step_value, loss_value, pre = sess.run([train_step,loss,prediction], feed_dict={xs: x_data, ys: y_data})
if i % 50 == 0:
a += 1
w1 = sess.run(weights_1)
w2 = sess.run(weights_2)
pre = sess.run(prediction, feed_dict={xs: x_data})
# 保存模型
saver.save(sess, os.path.join(MODEL_SAVE_PATH, MODEL_NAME),global_step=i)
# 保存计算日志
writer = tf.summary.FileWriter(LOG_DIR, tf.get_default_graph())
writer.close()
_result_()
【打开TensorBoard】
tensorboard --logdir=/home/xdq/xinPrj/python/AIstudy/NNTest/logs/NNlog
TensorBoard 1.12.1 at http://xindq:6006 (Press CTRL+C to quit)
【结果:整体结构】
【Result:内部结构】
【Analysis】
(1) 图3.1可知神经网络结构及数据流向,Input为数据输入层,Layer1为第一层神经网络,Output为输出层,Loss为损失函数,Train_step为损失函数迭代优化,saver是保存训练模型.
(2)前向计算过程:Input为输入数据,为神经网络第一层Layer1提供数据,第一层神经网络计算的数据传入输出层Output,完成神经网络的前向计算过程.
(2) 反向传播计算过程:输出层Output和输入层Input进行反向计算,得到损失函数Loss,损失函数经过梯度下降进行迭代优化,得到Train_Step,直至收敛.
(3) 图3.2显示神经网络具体算过程,输入层有x和y,神经网络第一层Layer1由weights_1和biases_1构成,输出层由weights_2和biase_2构成,Loss由输出层和输入层计算组成,Train_step则汇集所有数据进行迭代优化,直至收敛.Saver可以看出保存的变量有四个(黄色箭头指向):weights_1,weights_2,biases_1,biases_2.
(4) 神经网络清晰了.
4 总结
(1) TensorBoard可视化Tensorflow图内部结构,帮助理清计算过程,针对复杂的神经网络可利用该工具快速了解其结构;
(2) 提高Tensorflow可读性及易用性;
(3) TensorBoard即是保存图结构,只有先保存了模型才能读取出图的可视图;