(四)Tensorflow神经网络可视化之tensorboard Graph

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)

【结果:整体结构】
Graph1

图2.1 整体结构

【结果:内部结构】
Graph2

图2.2 内部结构

【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)

【结果:整体结构】
Graph3

图2.3 整体结构

【结果:内部结构】
Graph2

图2.4 内部结构

【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)

【结果:整体结构】
Graph5

图2.5 整体结构

【结果:内部结构】
在这里插入图片描述

图2.6 内部结构

【结果:初始化放入图中】
Graph6

图2.7 初始化+主图结构

【结果:初始化放入主图内部结构】
Graph

图2.8 初始化+主图内部结构

【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)

【结果:整体结构】
在这里插入图片描述

图3.1 整体结构

【Result:内部结构】
在这里插入图片描述

图3.2 内部结构

【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即是保存图结构,只有先保存了模型才能读取出图的可视图;


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值