Tensorboard可视化工具是训练过程中很重要的工具。可以实时的检测模型,主要有两个方面的应用,首先是可以检测每一层的偏向 b 和 权重 w的更新过程,另一个作用就是在训练过程中,使用验证集去检测模型的、准确率还有“loss”的实时变化。
1. Tensorboard介绍
1.1 Tensorboard的数据形式
Tensorboard可以记录与展示以下数据形式:
(1)标量Scalars
(2)图片Images
(3)音频Audio
(4)计算图Graph
(5)数据分布Distribution
(6)直方图Histograms
(7)嵌入向量Embeddings
1.2 Tensorboard的可视化过程
(1)首先肯定是先建立一个graph,你想从这个graph中获取某些数据的信息
(2)确定要在graph中的哪些节点放置summary operations以记录信息
使用tf.summary.scalar记录标量
使用tf.summary.histogram记录数据的直方图
使用tf.summary.distribution记录数据的分布图
使用tf.summary.image记录图像数据
….
(3)operations并不会去真的执行计算,除非你告诉他们需要去run,或者它被其他的需要run的operation所依赖。而我们上一步创建的这些summary operations其实并不被其他节点依赖,因此,我们需要特地去运行所有的summary节点。但是呢,一份程序下来可能有超多这样的summary 节点,要手动一个一个去启动自然是及其繁琐的,因此我们可以使用tf.summary.merge_all去将所有summary节点合并成一个节点,只要运行这个节点,就能产生所有我们之前设置的summary data。
(4)使用tf.summary.FileWriter将运行后输出的数据都保存到本地磁盘中
(5)运行整个程序,并在命令行输入运行tensorboard的指令,之后打开web端可查看可视化的结果
2.具体实例 (使用经典的Mnist数据集为例)
2.1 程序实现
mnist_ff.py
import tensorflow as tf
input_node=784 #输入节点
layer1_node=500 #隐藏神经元的个数
output_node=10 #输出节点
def get_weight (shape,regularizer): #采用get_variable 可以在其他函数内直接获取变量值,不用再传参数
'''获取weights函数,可以通过名字获取值 变量名称必填 '''
weights=tf.get_variable("weights",shape,initializer=tf.truncated_normal_initializer(stddev=0.1))
if (regularizer!= None):
tf.add_to_collection("losses",regularizer(weights)) #采用正则化方法 放入损失函数中
return weights
def ff(input_tensor,regularizer):
#生成一个上下文管理器,并指明需求的变量在这个上下文管理器中,就可以直接通过tf.get_variable获取已经生成的变量。
with tf.variable_scope('layer1',reuse =tf.AUTO_REUSE): #layer1 命名空间 reuse 重复使用
#声明第一层神经网络
weights=get_weight([input_node, layer1_node],regularizer)#共享变量 可以直接使用
biases=tf.get_variable("biases1",[layer1_node],initializer=tf.constant_initializer(0.0))
layer1=tf.nn.relu(tf.matmul(input_tensor,weights)+biases)
with tf.variable_scope('layer2',reuse =tf.AUTO_REUSE): #layer2 命名空间
#声明第一层神经网络
weights=get_weight([layer1_node,output_node],regularizer)
biases=tf.get_variable("biases2",[output_node],initializer=tf.constant_initializer(0.0))
layer2=tf.matmul(layer1,weights)+biases
return layer2
mnist_train.py
import tensorflow as tf
import mnist_ff
import time
import os #用来保存训练的模型
from tensorflow.examples.tutorials.mnist import input_data
batch_size=100 #一次训练的个数
learning_rate_base=0.8 #学习率
learning_rate_decay=0.99#学习的衰减率
move_average_rate=0.99 #滑动平均律的衰减率
regularaztion=0.0001 #regularizer 所占的比重
steps=30000 #设置训练轮数
model_save_path="E:\TensorFlow\Project_TF\mnist_network\log"#设置保存模型的路径
model_name="model_minist.ckpt"#设置模型的的名称
event_path="E:\TensorFlow\Project_TF\mnist_network\event" #tensorboard日志保存的路径
def train(mnist):
start = time.clock()
x=tf.placeholder(tf.float32,shape=(None,mnist_ff.input_node),name="x_input")#定义初始数据想x,在具体运行时再代入具体数据
y_=tf.placeholder(tf.float32,shape=(None,mnist_ff.output_node),name="y_input")#定义标签值
regularizer=tf.contrib.layers.l2_regularizer(regularaztion) #使用L2正则化方法
y=mnist_ff.ff(x,regularizer)#前向传播过程
'''采用滑动平均模型 调整learning_rate'''
global_step=tf.Variable(0,trainable=False)#定义存储训练轮数的变量,定义为不可训练的参数
variable_averages=tf.train.ExponentialMovingAverage(move_average_rate,global_step)#定义滑动的对象
variables_averages_op=variable_averages.apply(tf.trainable_variables()) #定义执行滑动平均的操作
#设置可变的learning rate
learning_rate=tf.train.exponential_decay(learning_rate_base,global_step,mnist.train.num_examples/batch_size, learning_rate_decay)# 完整的使用一遍数据后,学习率*衰减率
'''定义误差函数'''
with tf.variable_scope('loss'):
cross_entropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
loss= cross_entropy+tf.add_n(tf.get_collection('losses'))
tf.summary.scalar('loss', loss)
'''准确率'''
validation_feed={x: mnist.validation.images,y_: mnist.validation.labels}
y2=mnist_ff.ff(x,None) #测试时不关注正则化损失的值
with tf.name_scope('accuracy'):
correct_prediction = tf.equal(tf.argmax(y2, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) #一组数据上的正确率
tf.summary.scalar('accuracy', accuracy)
'''既要bp更新,又要更新每个参数的滑动平均值'''
train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)
with tf.control_dependencies([train_step, variables_averages_op]):
train_op=tf.no_op(name='train') #什么也不做
#初始化 TensorFow持久化类
saver=tf.train.Saver()
with tf.Session() as sess:
tf.initialize_all_variables().run() #启动所有的变量
'''使用tensorboard可视化工具'''
summary_op = tf.summary.merge_all() #将所有的summary同时运行
summary_writer = tf.summary.FileWriter(event_path, graph=sess.graph)
#在训练过程中不在使用验证集
for i in range(steps):#开始训练
batch_xs, batch_ys = mnist.train.next_batch(batch_size) #一次取batch_size个数据进行训练
_,loss_value,step=sess.run([train_op,loss,global_step],feed_dict={x:batch_xs,y_:batch_ys})
#每1000轮保存一次模型
if (i%1000==0):
print("After %d steps,the loss on model of mnist is %f"%(step,loss_value))
saver.save(
sess,os.path.join(model_save_path,model_name),
global_step=global_step)#放上global_step 可以将模型保存为第多少次的模型
elif (i % 100 == 0):
'''运行的时候要将placeholder的数据放进去'''
summary_str = sess.run(summary_op,feed_dict= validation_feed)
summary_writer.add_summary(summary_str, i) #横坐标为模型训练的次数,纵坐标为相应的summary
end = time.clock() #计算程序结束时间
print("running time is %g s" % (end-start))
def main (argv=None):#定义主函数 将数据加载进来
mnist=input_data.read_data_sets("E:\TensorFlow\Project_TF\mnist_network\data",one_hot=True)
train(mnist)
if (__name__=="__main__"): # 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。
tf.app.run()
2.2 Tensorboard 实现下(这里以win系统为例)
打开win下的命令行
在程序所在的磁盘下,输入以下命令:
tensorboard --logdir=E:\TensorFlow\Project_TF\mnist_network\event(换成你的路径命)
2.3 Tensorboard结果