前面我们讲了tensorflow构建简单神经网络,今天我们讲讲tensorflow另一个强大的工具tensorboard。简单来说,tensorboard可以把我们整个神经网络运算的流程,损失函数的变化,准确率的变化,特征值的变化。等等以可视化图表的形式表现出来。(反正就是装B利器)。
下面我来说下实现的具体代码
我们就以前面建立的简单神经网络为例,在这个例子上建立可视化的tensorboard
1.还是导入数据集,设定各项参数
import tensorflow as tf
#读取MNIST数据
from tensorflow.examples.tutorials.mnist import input_data
#从MNIST_data/中读取MNIST数据。这条语句在数据不存在时会自动执行下载
mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)
#设定网络参数
learning_rate = 0.001 #学习率
training_epochs = 15 #训练次数,总体数据需要循环多少次
batch_size = 100 #每批次要取的数据的量,这里是提取100张图片
n_hidden_1 = 256 #隐藏层1的神经元个数
n_hidden_2 = 256 #隐藏层2的神经元个数
n_input = 784 #输入层的个数
n_classes = 10 #输出层的个数(我们要识别的分类数)
n_samples = mnist.train.num_examples #训练数据的总数据量,这里是55000
2.这里我们首先设置第一个tensorboard参数,命名
with tf.name_scope('inputs'): #tensorboard画流程图时为了可视化封装变量, 主要目的是为了更加方便地管理参数命名。这里大家可以简单的理解,要想tensorboard记住它,就要给它命个名。
x = tf.placeholder('float', [None, n_input])
y = tf.placeholder('float', [None, n_classes])
#让tensorboard显示输入的图片
with tf.name_scope('input_reshape'):
image_input = tf.reshape(x, [-1, 28, 28, 1])
tf.summary.image('input', image_input, 10) #这里我们显示10个图片
3.构建神经网络
#构建多层神经网络
def add_layer(x, input_tensors, output_tensors, layer_name, activation_function = None):
with tf.name_scope('Layer'):
with tf.name_scope('Weights'):
weight = tf.Variable(tf.random_normal([input_tensors, output_tensors]), name = 'w')
tf.summary.histogram(name = layer_name + '/weights', values=weight)#这行代码的目的是以直方图的形式显示权重W的变化,layer_name 来标记每一层的W
with tf.name_scope('Biases'):
bias = tf.Variable(tf.random_normal([output_tensors]), name='b')
tf.summary.histogram(name=layer_name + '/biases', values=bias)
with tf.name_scope('Wx_plus_b'):
#构建y = wx + b 方程式
formula = tf.add(tf.matmul(x, weight), bias)
#下面的目的是如果是最后的输出层,激活函数就是None 直接输出结果,如果不是就要加入激活函数
if activation_function is None:
outputs = formula
else:
outputs = activation_function(formula)
tf.summary.histogram(name=layer_name + '/outputs', values=outputs)
return outputs
tf.summary.histogram是画直方图,这里我们画出权重w的直方图,其他同理
4.定义隐藏层输出层
#定义隐藏层layer1,layer2还有输出层
layer1 = add_layer(x, input_tensors=n_input, output_tensors=n_hidden_1, layer_name='layer1', activation_function=tf.nn.relu)
layer2 = add_layer(layer1, input_tensors=n_hidden_1, output_tensors=n_hidden_2, layer_name='layer2', activation_function=tf.nn.relu)
out_layer = add_layer(layer2, input_tensors=n_hidden_2, output_tensors=n_classes, layer_name='out_layer', activation_function=None)
5.损失函数,梯度下降,准确率
#定义损失函数,梯度下降方法,准确率
with tf.name_scope('cost'):
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=out_layer, labels=y))
tf.summary.scalar('loss', cost)
with tf.name_scope('optimizer'):
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost)
with tf.name_scope('Accuracy'):
acc = tf.equal(tf.argmax(out_layer, 1), tf.argmax(y, 1))
acc = tf.reduce_mean(tf.cast(acc, tf.float32))
tf.summary.scalar("accuracy", acc)
tf.summary.scalar('loss', cost) 画出损失函数的线性图
6.初始化所有变量
#初始化所有变量
init = tf.global_variables_initializer()
merged = tf.summary.merge_all() #merge_all 可以将所有summary全部保存到磁盘,以便tensorboard显示。
我们把我们定义好的所有要可是画的变量进行保存,但目前我们还没有开始画图,因为tensorflow还没开始运行建立会话,只有建立会话开始运行可视化的这些变量才开始保存。
7.建立会话,开始运行
with tf.Session() as sess:
sess.run(init)
writer = tf.summary.FileWriter('tensorboard3/', graph=sess.graph) #指定一个文件用来保存图
for epoch in range(training_epochs):
avg_cost = 0.0
total_batch = int(n_samples/batch_size)
for i in range(total_batch):
batch_x, batch_y = mnist.train.next_batch(batch_size)
_, c, result = sess.run([optimizer, cost, merged], feed_dict={x:batch_x, y:batch_y})
avg_cost += c/total_batch
writer.add_summary(result, epoch*total_batch+i)
print("Epoch: {} cost={}".format(epoch + 1, avg_cost))
print("Training Completed in {} Epochs".format(training_epochs))
8.下面开始运行代码,运行完毕后我们会在tensorboard3看到我们保存的可视化数据。
![v2-d50ae29d257a7700204987ab2db217a9_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=c8f22187-d92e-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-d50ae29d257a7700204987ab2db217a9_b.png)
这时我们进入命令行工具,dos
进入我们存储放tensorboard3文件的目录 输入 tensorbaord --logdir='tensorboards'
![v2-7ff6eb37e39a02f780c1fb4181e26369_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=c8f22187-d92e-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-7ff6eb37e39a02f780c1fb4181e26369_b.png)
接下来我们在浏览器上输入localohost:6006就可以看到我们向要的东西了。
![v2-bf6070456f5262186392fb67d3561060_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=c8f22187-d92e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-bf6070456f5262186392fb67d3561060_b.jpg)
我们可以看到我们准确率和损失值的变化
![v2-40bc722f38d6a852e94b385e6d8ca2b2_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=c8f22187-d92e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-40bc722f38d6a852e94b385e6d8ca2b2_b.jpg)
我们输入的数据
![v2-4322d107428041889289c350f964f289_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=c8f22187-d92e-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-4322d107428041889289c350f964f289_b.jpg)
我们整个神经网络的流程图
![v2-dbac466aed1c58bb06c16abcd38512e3_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=c8f22187-d92e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-dbac466aed1c58bb06c16abcd38512e3_b.jpg)
![v2-c156036a7aa303cf073bbac01c9d996b_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=c8f22187-d92e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-c156036a7aa303cf073bbac01c9d996b_b.jpg)
w 和b 还有输入等特征值的变化。
里面还有好多细节大家可以自己点点试试,具体功能大家可以去官网查看(其实我知道也不多,呵呵)
好了总之这个tensor board可视化我们已经实现了。