1.tensoflow 参数可视化
有时候需要查看网络模型结构、训练过程中的loss变化、以及权重变化,张量(tensor)分布,需要通过tensorboard来查看。TensorBoard是一个可视化工具,有助于我们调试,选择数据。训练过程中各种数据的汇总都可以通过tensorbaord表现。tensorboard还可以展示每个节点运行时消耗的时间、空间、运行的机器(GPU或者CPU)等信息。还可以将程序运行过程中不同迭代轮数中tensorflow各节点消耗的时间和空间等信息写入日志文件中,用tensorboard展示。
1.1tensorboard基础
1.1.1tensorboard可表示的量
(1)标量(scale):
是用来显示accuracy,cross entropy,dropout等标量变化趋势的函数
(2)图片(image)
(3)音频(Audi)
(4)计算图(Graphs)
(5)数据分布(Distribution)
(6)直方图(Histogram):展示训练过程中记录的数据的分布图
(7)嵌入向量(Emdebings)
1.1.2tensorbosrd常用函数
tf.image_summary 用于保存图
tf.scalar_summary 用于保存标量
tf.histogram_summary 用于保存直方图
tf.merge_summary 用于汇总所有的量
tf.train.SummaryWriter 用于创建写操作
1.2搭建tensorboard流程
(1)定义一个计算图 ,添加需要记录节点
如果为了查看网络参数,loss,accuracy等变量,需要使用命域tf.namescope(),给每个参数,操作op命名。
然后使用tf.summary.scalar/image/histogram()添加需要记录的节点(需要根据变量性质使用函数,标量使用tf.summary.scalar)。
(2)创建writer,配置log保存路径
writer=tf.summary.FileWriter('/path/to/logs', sess.graph)
(3)对记录的节点进行汇总
使用tf.summary.merge_all()直接汇总所用的参数。
merged = tf.summary.merge_all()
(4)运行汇总节点
通过Session运行汇总节点,summary = sess.run(merged),根据自己需求设置保存频率,比如一个epoch保存一次。
(5)将汇总写入日志文件
writer.add_summary(summary, global_step=i),i表示迭代步数,可以自己设置
writer.close()
运行完会生成events.out.tfevents.前缀的文件。
(6)启动TensorBoard服务
通过cmd启动
tensorboard --logdir=/log_path/
当系统报错,找不到tensorboard命令时,则需要使用绝对路径调用tensorboard,
python tensorflow/tensorboard/tensorboard.py --logdir=/log_path/
生成
(7)并在浏览器中输出localhost:6006打开tensorboard查看:
1.3 简单示意程序(计算图结构)
import tensorflow as tf
#定义命名空间
with tf.name_scope('input'):
input1 = tf.constant(1,name='a')#定义变量名
input2 = tf.constant(2,name='b')
with tf.name_scope('add_op'):
add = tf.add(input2,input3)
with tf.Session() as sess:
wirter = tf.summary.FileWriter('logs/',ss.graph)#默认在当前目录下的logs文件夹,可以自己设置
result = sess.run()
writer.close()
计算图结构如下
图结构中常见符号如下
2. tensorflow 通过tensorflow显示 loss和accury
(1)定义loss和accuracy的作用域
(2)将变量保存在一起
(3)创建写操作,配置保存路径,需要在session中操作
(4)在模型训练时候运行变量集合merged,在sess中完成
(5)查看loss
2.1实例程序1
#1.定义loss和accuracy的作用域
with tf.name_scope('loss'):
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(y_holder, predict_y))
loss_summary = scalar_summary('loss', loss)#保存标量loss
with tf.name_scope('accuracy'):
accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float'))
acc_summary = scalar_summary('accuracy', accuracy)保存标量loss
#2.将变量保存在一起
merged = merge_summary([loss_summary, acc_summary])
#3.创建写操作,配置保存路径,需要在session中操作
writer = SummaryWriter('/path/logs', sess.graph)
#4在模型训练时候运行变量集合merged,在sess中完成
for step in range(total_step):
summary, _ = sess.run([merged, train], feed_dict={x:x_batch, y:y_batch})
writer.add_summary(summary, step)
writer.close()
2.1实例程序2
import tensorflow as tf
# 导入数据
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./data/", one_hot=True)
# 设置相关参数
learning_rate = 0.01
training_epochs = 50
batch_size = 128
display_epoch = 1
logs_path = './log' # log存放位置
#输入数据: mnist data image of shape 28*28=784
#(name=''将在Tensorboard中显示)
x = tf.placeholder(tf.float32, [None, 784], name='InputData') #输入图像数据
y = tf.placeholder(tf.float32, [None, 10], name='LabelData') # 输出标签
#构建计算图(模型+损失函数+优化方法)
W = tf.Variable(tf.zeros([784, 10]), name='Weights') #权重
b = tf.Variable(tf.zeros([10]), name='Bias') #偏置
#对需要在tensorboard中显示的tensor,标量,op设置命令域
with tf.name_scope('Model'):
pred = tf.nn.softmax(tf.matmul(x, W) + b) # Softmax
with tf.name_scope('Loss'):#损失函数
cost = tf.reduce_mean(-tf.reduce_sum(y * tf.log(pred), reduction_indices=1))
with tf.name_scope('SGD'):#优化策略
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
with tf.name_scope('Accuracy'):
acc = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
acc = tf.reduce_mean(tf.cast(acc, tf.float32))
# 初始化全局变量
init = tf.global_variables_initializer()
#把标量loss和acc通过summary加入监测
tf.summary.scalar("loss", cost)
tf.summary.scalar("accuracy", acc)
#把所有的 summaries汇入merge节点
merged_summary_op = tf.summary.merge_all()
# 开始训练
with tf.Session() as sess:
sess.run(init)
#初始化写操作
summary_writer = tf.summary.FileWriter(logs_path, graph=sess.graph))
for epoch in range(training_epoch):
avg_cost = 0.
total_iteration = int(mnist.train.num_examples / batch_size)
# Loop over all batches
for i in range(total_iteration):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
# Run optimization op (backprop), cost op (to get loss value)
# and summary nodes
_, c, summary = sess.run([optimizer, cost, merged_summary_op],
feed_dict={x: batch_xs, y: batch_ys})
# Write logs at every iteration
summary_writer.add_summary(summary, epoch * total_batch + i)
# Compute average loss
avg_cost += c / total_iteration
# Display logs per epoch step
if (epoch+1) % display_epoch == 0:
print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost))#打印loss