主要内容:
一、TensorBoard应用进阶
1.1图像的显示
在构建模型的输入层时,定义了占位符x,placeholder就是接收训练样本的图像数据。为了把这些图像在TensorBoard中显示出来,需要把它加入summary中去。
通过tf.summary.image()函数,把带进来的图像信息加到summary中去。它的第一个参数是标识ID;第二个参数是图像的数据;第三个参数为10,表示最多显示10张图片。
image_shaped_input要求的形是一个四维的模式,后面三个参数分别表示图像的长、宽以及颜色的通道数(灰度图为1),第一个参数表示一次有多少行数据,-1表示暂时不确定,会根据带进来所有数据的总数来计算。
1.2张量的显示
在TensorBoard中以直方图的形式显示在计算中一些tensor的情况
可以通过tf.summary.histogram()函数。它的第一个参数也是标识ID,第二个参数是要显示的tensor值。
1.3标量的显示
当我们定义好loss_function以后,就可以通过tf.summary.scalar()函数,把loss值以标量的形式显示出来。
我们还可以把准确率也以标量的形式显示出来。
1.4训练模型的显示
在训练模型的过程中,需要把前面所有定义的summary操作合并。
这里定义了一个merged_summary_op,直接调用tf.summary.merge_all()函数就可以了。
接下来把计算图写进去,调用了tf.summary.FileWriter()函数。
在训练的迭代过程中,需要生成真正写入到日志文件中的信息,通过sess.run()函数来实现,返回的结果赋给summary_str,并加入到摘要信息中。
完整代码为:
import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data import matplotlib.pyplot as plt import numpy as np from time import time #载入数据 mnist = input_data.read_data_sets("MNIST_data/",one_hot=True) #建立模型 — 定义全连接层函数 def fcn_layer(inputs,input_dim,output_dim,activation=None): #输入数据,输入神经元数量,输出神经元数量,激活函数 W = tf.Variable(tf.truncated_normal([input_dim, output_dim], stddev=0.1)) # 以截断正态分布的随机数初始化W b = tf.Variable(tf.zeros([output_dim])) # 以0初始化b XWb = tf.matmul(inputs, W)+b # 建立表达式:inputs * W + b if activation is None: # 薪认不使用激活函数 outputs = XWb else: # 若传入激活函数,则用其对输出结果进行变换 outputs = activation(XWb) return outputs #构建输入层 x= tf.placeholder(tf.float32, [None, 784], name='X') image_shaped_input = tf.reshape(x,[-1, 28, 28, 1]) tf.summary.image('input',image_shaped_input,10) #构建隐藏层 h1 = fcn_layer(inputs=x,input_dim=784,output_dim=256,activation=tf.nn.relu) #构建输出层 forward = fcn_layer(inputs=h1,input_dim=256,output_dim=10,activation=None) pred = tf.nn.softmax(forward) tf.summary.histogram('forward',forward) y= tf.placeholder(tf.float32, [None, 10], name='Y') #定义标签数据占位符 loss_function = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=forward,labels=y)) #注意第一个参数是不做Softmax的前向计算结果 tf.summary.scalar('loss',loss_function) #将loss损失以标量显示 #设置训练参数 train_epochs = 40 #训练轮数 batch_size=50 #单次训练样本数(批次大小) total_batch= int(mnist.train.num_examples/batch_size)#一轮训练有多少批次 display_step=1 #显示粒度 learning_rate=0.01 #学习率 #选择优化器 optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss_function) #定义准确率 correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(pred,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))#准确率,将布尔值转化为浮点数,并计算平均值 tf.summary.scalar('accuracy',accuracy) sess = tf.Session() sess.run(tf.global_variables_initializer()) merged_summary_op = tf.summary.merge_all() #合并所有summary writer = tf.summary.FileWriter('log/',sess.graph) #创建写入符 startTime = time() for epoch in range(train_epochs): for batch in range(total_batch): xs, ys = mnist.train.next_batch(batch_size) # 读取批次数据 sess.run(optimizer,feed_dict={x:xs,y:ys}) # 执行批次训练 #生成summary summary_str = sess.run(merged_summary_op,feed_dict={x:xs,y:ys}) writer.add_summary(summary_str,epoch) #将summary写入文件 loss,acc = sess.run([loss_function,accuracy],feed_dict={x:mnist.validation.images,y:mnist.validation.labels}) #打印训练过程中的详细信息 if (epoch+1) % display_step == 0: print("Train Epoch:",'%02d' %(epoch+1),"Loss=","{:.9f}".format(loss),"Accuracy=","{:.4f}".format(acc)) duration = time()-startTime #显示运行总时间 print("Train Finished takes:","{:.2f}".format(duration)) #使用测试集评估模型 accu_test = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels}) print("Test Accuracy:",accu_test)
Note:需要把log文件夹放在某个盘的子目录下才能正常显示TensorBoard,没找到原因,如:
二、TensorFlow游乐场
TensorFlow游乐场是一个通过网页浏览器就可以训练简单神经网络的web应用。它不但可以让用户自定义神经网络的结构,还可以可视化训练过程。有利于初学者提高对神经网络的认识。
网址:http://playground.tensorflow.org
使用方法演示:https://minghuiwu.gitbook.io/tfbook/