Chapter 2.0 TensorBoard 基本教程(GRA

作者: vincehxb | 来源:发表于2017-06-28 15:48 被阅读0次

    /*************************************************************

    2017年7月3日 增加tensorboard的histogram的说明

    **************************************************************/

    因为网上找的tensorboard教程都是在比较复杂的网络下应用,而且把几个部分都糅合在一起,对于初学者比较难看懂基本套路。所以本文分成4个部分:

    例子 1:只生成 GRAPHS

    例子 2:在 1 的基础上生成 scale

    例子 3:在 2 的基础上生成 histogram

    例子 4:生成 image输入到tensorboard


    本小节的例子是建立在一个最简单的线性回归问题上的: y=k*x

    在预测值上加上高斯噪声,预测k的真实值

    这里高斯噪声的方差很小,应该很容易得到 k=2

    建立TensorBoard中的graph:

      graph的优点是很直观的显示每个计算节点之间的关系,这对理解一个网络是很重要的。而要得到这个graph也很简单。


    1.将每一个节点包括在name_scope下

    tf中输入输出可以看做node(节点),每一次运算看做一个节点,所以将每一个节点命名可以很方便的建立一个计算图。tf.name_scope为限定命名空间,所有这个with下的节点会被自动命名为输入的名称,同时注意到name_scope是可以嵌套的,这样可以将很复杂的网络分解成好几个部分。

    2.融合所有summery

    实际上如果只是可视化Graph,不需要融合summary。但是一般都还需要记录一些标量,直方图的信息,这时候就需要融合summary.

    同时就好像init一样,merge是类的方法,需要sess来运行。运行merge将得到所有你定义的输出信息,然后将这些信息写到文件里面去(第三步),就完成啦

    3.定义一个FileWriter,用来存放各种数据(第一个参数是数据存放的地址),在writer的数据写入完毕后关闭writer

    #(1)定义一个writer,一般在开始训练前定义

    writer=tf.summary.FileWriter('./mylog',sess.graph)

    #这句指令定义了文件的输出地址,同时也将计算图 sess.graph加入了记录器,这样在TensorBoard的GRAPHS窗口就可以展示整个计算图的可视化效果了

    #(2)利用writer来写入各种信息(但是这个例子用不到,所以只需要定义就好啦)

    #下面m_是summary信息,i是epoch

    writer.add_summary(m_,i)

    .......

    #(3)所有写入完成后可以关闭文件

    writer.close()

    结果:

    网络的整体视图如下,

    每一个大graph里面有小的subgraph可以详细查看.(因为嵌套了3次运算,所以loss里面有3个node)

    参数(标量)的监视(scale)

    上面的例子中,有两个标量,分别是猜测的k值和loss值。

    在一般的dl程序中,至少会有两个标量(loss 和accuracy)

    加入标量到tensorboard很简单

    1.将标量加入summery

    tf.summery.scale('name',your_scale)

    2.得到summery里面的值,写入文件里面,实际上

    merge=tf.summary.merge_all()

    执行这个指令可以将所有的summerary都计算出来,然后得到这些数后写进文件里面

    3.将summary的信息(上面的m_)写入文件里面.

    writer.add_summary()

    效果

    直方图的监视(histogram)

    显然上面的scale只能输入的是标量,那么假如你想要输入的是高维的信息呢(比如某一隐藏层的输出 N*D维度)

    1.将目标加入histogram中

    2.运行summary.merge_all()方法得到信息

    3.写入文件

    效果

    总结

    实际上从上面的3个例子可以看出tensorboard的使用是很简单的

    1.定义各种命名空间,也就是将各个运算节点用 name_scope包括,就可以统一命名,方便GRAPHS的展示

    2.定义文件writer来写入各种summary信息。注意writer并不是只能有一个,可以定义两个,一个用来写train的数据,一个用来写test的数据

    3.将感兴趣的量(标量,多维向量)加入到summary中

    4.在自己定义的时间点计算这些summary信息: sess.run(tf.summary.merge_all())有可能需要feed_dict传递一些输入。

    5.将得到的信息利用前面定义的writer写入到文件里面

    6.程序运行完毕后,打开tensorboard就可以啦

    输出自己定制的image

    下面展示在tb里面输出image,也就是绘制的线性回归图。

    因为想要显示的图片是有matplotlib生成的,所以先定义一个函数,其功能有:

    生成图片 -> 将图片保存到内存中 -> 将这段内存传递出去

    那么调用这个函数就能够生成想要的png格式的图片。

    真正的将image嵌入到tensorboard里面的工作就可以开始了。

    和scale,histogram一样,image的步骤仍然是定义、运算、写入

    效果展示:

    histogram/distribution 的图像怎么看

    在tensorboard中经常看到会把weight和biases放到histogram中观察,但是每次看到这些图都是一脸懵逼,完全不知道怎么解读这些图片,下面是我从stackoverflow 上找到的一种解答

    上面的wight定义是均值为0,方差为1的服从正态分布的一组参数。从数学知识可以知道,正态分布绝大部分的值应该都分布在离均值很近的地方,只有很少一部分才会离均值很远。所以上面的histogram应该是反映下面这样的正态分布的图

    由正态分布图可知有(19.1+19.1=38.2%)的数会落在(-0.5,0.5)的区间,那么再看tb的图,这个区间(-0.5,0.5)有比较淡的蓝色,符合数学知识。

    再从正态图得到:大约有86.6%的值会落在(-1.5,1.5)区间内,从tb的图(-1.5,1.5)这个区间的蓝色最强,说明有很大部分的值是在这个区间内

    所以从上面我们就能够知道,tb的distribution 图的颜色主要和值得分布有关,假如有很大比例的数分布在某个区间,这个区间的色彩就会强,假如很少比例的数在这个区间,这区间的色彩就越淡

    下面是我的网络中全连接层的权值distribution

    histogram

    可以看到这一权值很大比例是分布在0的附近,整体来说这部分值都很接近0。这样就可以很容易的观察到权值分布的信息,比如知道那一部分的权值已经dead(很接近0)


    相关文章

      网友评论

        本文标题:Chapter 2.0 TensorBoard 基本教程(GRA

        本文链接:https://www.haomeiwen.com/subject/mwaecxtx.html