Tensorflow学习笔记:基础篇(7)——Mnist手写集改进版(Tensorboard可视化)

Tensorflow学习笔记:基础篇(7)——Mnist手写集改进版(Tensorboard可视化界面)


前序

— 前文中,我们在三层全连接神经网络中使用了学习率随迭代次数增加而逐渐衰减的AdamOptimizer优化器来完成MNIST数据的分类问题,最终迭代计算20次,准确率超过0.98,同时掌握了如何写入Graph数据文件,并在Tensorboard查看。
— 本文我们将继续深入学习Tensorboard
Reference:Tensorflow的可视化工具Tensorboard的初步使用


Tensorboard的数据形式

Tensorboard可以记录与展示以下数据形式:
(1)标量Scalars
(2)图片Images
(3)音频Audio
(4)计算图Graph
(5)数据分布Distribution
(6)直方图Histograms
(7)嵌入向量Embeddings


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端可查看可视化的结果


tf.name_scope()函数

复杂的TensorFlow 一般由数以千计的节点所构成,如此多而难以一下全部看到,甚至无法使用标准图表工具来展示。为简单起见,我们为op/tensor名划定范围,并且可视化把该信息用于在图表中的节点上定义一个层级。默认情况下, 只有顶层节点会显示。(大家可能现在看的有点一知半解,文末将结合实例进行讲解)


代码示例

1、数据准备

今天程序上来第一部分就发生变化,出现了新面孔,那就是定义了一个variable_summaries()函数,传递参数为var。
这个函数的作用是:
(1)将传递过来的参数var进行求均值(mean)、标准差(stddev)、最大最小值(max、min)
(2)用tf.summary.scalar()函数,分别对上述的几个统计量(标量)进行记录,同时记录参数var的直方图(tf.summary.histogram()函数实现)

在这里大家发现了我用的tf.name_scope()函数,我在这里建立了一个名叫summaries的可视化节点的层级,之后在Tensorboard中将会找到它。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# 载入数据集
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

# 每个批次送100张图片
batch_size = 100
# 计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size

def variable_summaries(var):
    with tf.name_scope('summaries'):
        mean = tf.reduce_mean(var)
        tf.summary.scalar('mean', mean)
        with tf.name_scope('stddev'):
            stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
        tf.summary.scalar('stddev', stddev)
        tf.summary.scalar('max', tf.reduce_max(var))
        tf.summary.scalar('min', tf.reduce_min(var))
        tf.summary.histogram('histogram', var)  ##直方图
2、准备好placeholder

同样,我用tf.name_scope()函数,建立了一个名叫input的可视化节点的层级,这个节点层下包含 x_input、y_input、learning_rate 三个子节点。

with tf.name_scope('input'):
    x = tf.placeholder(tf.float32, [None, 784], name='x_input')
    y = tf.placeholder(tf.float32, [None, 10], name='y_input')
    lr = tf.Variable(0.001, dtype=tf.float32, name='learning_rate')
3、初始化参数/权重

同理,这里我对每个变量都做了同样的操作,只不过这里我命名了3个层级的节点,大家是否能准确找到呢~~,同时对权重值W1、W2、W3,偏置值b1、b2、b3进行variable_summaries()函数的调用,想具体了解这些参数在模型训练中是如何发生变化

with tf.name_scope('layer'):
    with tf.name_scope('Input_layer'):
        with tf.name_scope('W1'):
            W1 = tf.Variable(tf.truncated_normal([784, 500], stddev=0.1), name='W1')
            variable_summaries(W1)
        with tf.name_scope('b1'):
            b1 = tf.Variable(tf.zeros([500]) + 0.1, name='b1')
            variable_summaries(b1)
        with tf.name_scope('L1'):
            L1 = tf.nn.tanh(tf.matmul(x, W1) + b1, name='L1')
    with tf.name_scope('Hidden_layer'):
        with tf.name_scope('W2'):
            W2 = tf.Variable(tf.truncated_normal([500, 300], stddev=0.1), name='W2')
            variable_summaries(W2)
        with tf.name_scope('b2'):
            b2 = tf.Variable(tf.zeros([300]) + 0.1, name='b2')
            variable_summaries(b2)
        with tf.name_scope('L2'):
            L2 = tf.nn.tanh(tf.matmul(L1, W2) + b2, name='L2')
    with tf.name_scope('Output_layer'):
        with tf.name_scope('W3'):
            W3 = tf.Variable(tf.truncated_normal([300, 10], stddev=0.1), name='W3')
            variable_summaries(W3)
        with tf.name_scope('b3'):
            b3 = tf.Variable(tf.zeros([10]) + 0.1, name='b3')
            variable_summaries(b3)
        prediction = tf.nn.softmax(tf.matmul(L2, W3) + b3)
4、计算预测结果
prediction = tf.nn.softmax(tf.matmul(L2, W3) + b3)
5、计算损失值
with tf.name_scope('loss'):
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=prediction))
    tf.summary.scalar('loss', loss)
6、初始化optimizer
with tf.name_scope('optimizer'):
    optimizer = tf.train.AdamOptimizer(lr).minimize(loss)

with tf.name_scope('train'):
    with tf.name_scope('correct_prediction'):
        correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1))

    with tf.name_scope('accuracy'):
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
        tf.summary.scalar('accuracy', accuracy)
7、指定迭代次数,并在session执行graph
init = tf.global_variables_initializer()
merged = tf.summary.merge_all()
#将所有summary节点合并成一个节点,只要运行这个节点,就能产生所有我们之前设置的summary data

with tf.Session() as sess:
    sess.run(init)
    writer = tf.summary.FileWriter('./graphs/mnist', sess.graph)

    for epoch in range(21):
        sess.run(tf.assign(lr, 0.001 * (0.95 ** epoch)))

        for batch in range(n_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            #sess.run(optimizer, feed_dict={x: batch_xs, y: batch_ys})
            summary, _ = sess.run([merged, optimizer], feed_dict={x: batch_xs, y: batch_ys})
            #这里我们也发生了变化,run时候增加了merged,是不是对应了之前说的,你之前做的所有工作都只是在描绘整个graph,而并不会自己执行,需要你在这里run,将所得的结果输出给summary
        writer.add_summary(summary, epoch)
        #将每次迭代产生的summary写入graph的数据文件中,以便我们在Tensorboard显示出
        test_acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels})
        learning_rate = sess.run(lr)
        if epoch % 2 == 0:
            print("Iter" + str(epoch) + ", Testing accuracy:" + str(test_acc) + ", Learning rate:" + str(learning_rate))

    writer.close()
运行结果

今天我们的重点在于Tensorboard上,准确率就不展示了,因为程序在计算上没有变化,依旧会是0.98附近。
接下来我们要做的就是打开Tensorboard,在Macbook中打开终端输入tensorboard –logdir=(logdir是两个短横!!!,不是一长横
随后将数据文件拖进终端页面中,然后删除文件名,留下文件夹名即可,与上文一致。追问一个小问题,如果是windows呢??还记得第一篇博文开始的安装程序包是用到的Anaconda promote嘛~~~
这里写图片描述
将其中的http://appledeMacBook-Pro-3.local:6006(你的链接名可能会与我不同,无伤大雅),复制到你的谷歌浏览器中即可
这里写图片描述
打开后就会出现这样的界面,第一感觉是不是和前篇博文中的不太一样呢,前文的结构看着内容很多,杂乱无章;而这里却是结构十分清晰,就这5个节点相互连接(Optimizer、loss、train、layer、input),这不就是我们之前用tf.name_scope()函数定义的那几个节点名嘛~

没错,我们现在双击layer这个节点:
这里写图片描述
里面又出现了三个我们定义的子节点名(Output_layer、Hidden_layer、Input_layer),当然你还可以继续双击打开这几个节点,以及其他节点。同时当我们选中这个节点时,右边会出现它的基本信息,重点是输入输出信息,方便我们理解每个节点与其他节点的信息是如何连接的。

今天这个Tensorboard可视化界面,第二个不一样点在于,出现了GRAPHS、SCALARS、DISTRIBUTIONS、HISTOGRAMS这几个标签,这就是和我们定义的variable_summaries()函数所对应,大家可以随意点击这几个选项进行查看,这其中会有一些参数的均值(mean)、标准差(stddev)、最大最小值(max、min)信息及其直方图,此外还有loss值、accuracy值的趋势图。
这里写图片描述
这里写图片描述


完整代码

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

# 每个批次的大小
batch_size = 100
# 计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size


def variable_summaries(var):
    with tf.name_scope('summaries'):
        mean = tf.reduce_mean(var)
        tf.summary.scalar('mean', mean)
        with tf.name_scope('stddev'):
            stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
        tf.summary.scalar('stddev', stddev)
        tf.summary.scalar('max', tf.reduce_max(var))
        tf.summary.scalar('min', tf.reduce_min(var))
        tf.summary.histogram('histogram', var)  ##直方图


with tf.name_scope('input'):
    x = tf.placeholder(tf.float32, [None, 784], name='x_input')
    y = tf.placeholder(tf.float32, [None, 10], name='y_input')
    lr = tf.Variable(0.001, dtype=tf.float32, name='learning_rate')

with tf.name_scope('layer'):
    with tf.name_scope('Input_layer'):
        with tf.name_scope('W1'):
            W1 = tf.Variable(tf.truncated_normal([784, 500], stddev=0.1), name='W1')
            variable_summaries(W1)
        with tf.name_scope('b1'):
            b1 = tf.Variable(tf.zeros([500]) + 0.1, name='b1')
            variable_summaries(b1)
        with tf.name_scope('L1'):
            L1 = tf.nn.tanh(tf.matmul(x, W1) + b1, name='L1')
    with tf.name_scope('Hidden_layer'):
        with tf.name_scope('W2'):
            W2 = tf.Variable(tf.truncated_normal([500, 300], stddev=0.1), name='W2')
            variable_summaries(W2)
        with tf.name_scope('b2'):
            b2 = tf.Variable(tf.zeros([300]) + 0.1, name='b2')
            variable_summaries(b2)
        with tf.name_scope('L2'):
            L2 = tf.nn.tanh(tf.matmul(L1, W2) + b2, name='L2')
    with tf.name_scope('Output_layer'):
        with tf.name_scope('W3'):
            W3 = tf.Variable(tf.truncated_normal([300, 10], stddev=0.1), name='W3')
            variable_summaries(W3)
        with tf.name_scope('b3'):
            b3 = tf.Variable(tf.zeros([10]) + 0.1, name='b3')
            variable_summaries(b3)
        prediction = tf.nn.softmax(tf.matmul(L2, W3) + b3)

# 二次代价函数
# loss = tf.reduce_mean(tf.square(y - prediction))

# 交叉熵代价函数
with tf.name_scope('loss'):
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=prediction))
    tf.summary.scalar('loss', loss)

# 梯度下降
# optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
with tf.name_scope('optimizer'):
    optimizer = tf.train.AdamOptimizer(lr).minimize(loss)

with tf.name_scope('train'):
    with tf.name_scope('correct_prediction'):
        correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1))

    with tf.name_scope('accuracy'):
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
        tf.summary.scalar('accuracy', accuracy)

merged = tf.summary.merge_all()

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    writer = tf.summary.FileWriter('./graphs/mnist', sess.graph)

    for epoch in range(21):
        sess.run(tf.assign(lr, 0.001 * (0.95 ** epoch)))
        for batch in range(n_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            summary, _ = sess.run([merged, optimizer], feed_dict={x: batch_xs, y: batch_ys})

        writer.add_summary(summary, epoch)
        test_acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels})
        learning_rate = sess.run(lr)
        if epoch % 2 == 0:
            print("Iter" + str(epoch) + ", Testing accuracy:" + str(test_acc) + ", Learning rate:" + str(learning_rate))

    writer.close()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值