7.3 TensorBoard进阶与TensorFlow游乐场

> TensorBoard应用进阶

在前面的一些案例中,已经陆续用到了TensorBoard的一些基本功能。比如怎样显示计算图、怎样把计算出来的loss损失值(标量)在TensorBoard中以图形的方式显现出来,在这一讲中,我们会对TensorBoard做进一步的讲解。

> 图像的显示

在构建模型的输入层时,定义了占位符x,placeholder就是接收训练样本的图像数据。为了把这些图像在TensorBoard中显示出来,需要把它加入summary中去。

通过tf.summary.image()函数,把带进来的图像信息加到summary中去。它的第一个参数是标识ID;第二个参数是图像的数据;第三个参数为10,表示最多显示10张图片。

image_shaped_input要求的形是一个四维的模式,后面三个参数分别表示图像的长、宽以及颜色的通道数(灰度图为1),第一个参数表示一次有多少行数据,-1表示暂时不确定,会根据带进来所有数据的总数来计算。

> 张量的显示

怎样在TensorBoard中以直方图的形式显示在计算中一些tensor的情况呢?

可以通过tf.summary.histogram()函数。它的第一个参数也是标识ID,第二个参数是要显示的tensor值。

> 标量的显示

当我们定义好loss_function以后,就可以通过tf.summary.scalar()函数,把loss值以标量的形式显示出来。

我们还可以把准确率也以标量的形式显示出来。

> 训练模型的显示

在训练模型的过程中,需要把前面所有定义的summary操作合并。

这里定义了一个merged_summary_op,直接调用tf.summary.merge_all()函数就可以了。

接下来把计算图写进去,调用了tf.summary.FileWriter()函数。

在训练的迭代过程中,需要生成真正写入到日志文件中的信息,通过sess.run()函数来实现,返回的结果赋给summary_str,并加入到摘要信息中。

总结一下:

TensorBoard提供了很多种数据类型的显示:标量通过tf.summary.scalar()函数显示;图像通过tf.summary.image()函数显示;声音通过tf.summary.audio()函数显示;张量通过tf.summary.histogram()函数显示。

这些摘要的操作定义完毕后,可以通过tf.summary.merge_all()函数把它们合并起来,合并后的摘要操作就可以通过session来运行,得到摘要信息(summary_str),通过FileWrite写入事件日志文件中。

黄框中函数的作用是把当前session的计算图也通过FileWrite写到事件日志文件中。

这就是TensorBoard如何把信息产生出来写到日志文件中的过程。

当日志文件写好以后,可以启动TensorBoard,通过游览器对感兴趣的数据进行查看:

这里进入日志所在目录采用了相对目录的模式。

SCALARS中是两个标量,准确率和损失值:

IMAGES是图像输出的效果,它有一个input,是代入的标签:

点开后可以看到里面有10幅图片,因为设置最多显示10幅图片。每幅图片上方会显示图片的名称、step以及当时的时间。

图片左下角有两个小图标,点击右边这个图标可以看到原始的图片大小(28×28)。

GRAPHS中是计算图的效果,看起来会比较复杂:

HISTOGRAMS是直方图,显示的是forward:

每个图表显示数据的时间“切片”,其中每个切片是给定步骤处张量的直方图。从0-39,共40轮。按时间轴的顺序排列,越新的轮次越靠前,通过直方图可以直观的看出张量的变化趋势。通过将直方图模式从“偏移”更改为“叠加”,如果是透视图就将其旋转,以便每个直方图切片都呈现为一条相互重叠的线。

虽然只加入了直方图,但同时会产生一个分布图(DISTRIBUTIONS),这个分布图的图像也比较特别:

这里总共有九根线,图表上的每条线表示数据分布的百分位数。例如,最底下的线显示最小值随时间的变化趋势,中间的线显示中值变化的方式,最上面的线显示最大值随时间的变化趋势。从上至下看时,各行具有以下含义:[最大值,93%,84%,69%,50%,31%,16%,7%,最小值]。这些百分位数也可以看作标准偏差的正态分布:[最大值,μ+1.5σ,μ+σ,μ+0.5σ,μ,μ-0.5σ,μ-σ,μ-1.5σ,最小值],使得从内侧读到外侧的着色区域分别具有宽度[σ,2σ,3σ]。

> TensorFlow游乐场

TensorFlow游乐场是一个通过网页浏览器就可以训练简单神经网络的web应用。它不但可以让用户自定义神经网络的结构,还可以可视化训练过程。有利于初学者提高对神经网络的认识。

网址:http://playground.tensorflow.org

打开网页后的最上方有一句话,它告诉我们,TensorFlow游乐场的门槛非常低,不用担心搞不定它。

网页右边的图片中有许多数据点:有蓝色的数据点以及橙色的数据点。每一个点代表一个样本,点的颜色代表样本标签。

TensorFlow游乐场的神经网络相对来说比较简单,要解决的问题也比较简单,这里实际上是一个二分类的问题。

> 数据集类型

网页左边有一个DATA,提供了不同类型的数据集以供用户选择。

缺省的数据集就是下图的样子,蓝色的点聚集在中间,橙色的点在外面形成一个圈。

第二种数据集是异或模式的数据集,蓝色的点分布在右上和左下,橙色的点分布在右下和左上,它们的分布呈现XOR的模式。

第三种数据集的模式更简单一些,蓝色的点和橙色的点分别在两个端点,我们可以用一条对角线把它们区分开来。

第四种数据集相对来说比较复杂,是一种螺旋结构的数据集。蓝色的点跟橙色的点交织在一起,呈现一种螺旋状态。如果要把蓝色的点和橙色的点区分开来,神经网络的功能就要更强大一些。

除了这四种基本结构,DATA的下方还可以设置训练数据比例、噪音、批处理大小。

> 特征与神经网络模型可视化构建

> 特征提取

网页中间的一大块,就是一个可视化的神经网络。

FEATURES就是特征列,缺省有两个特征:X1和X2。

游乐场里的神经网络只提供两个特征,如果有十几个特征,是无法通过游乐场建模的。但它除了这两个特征以外,还提供了特征组合,比如X12、X22、X1X2、sin(X1)、sin(X2)。通过特征组合能达到不同的效果。比如加入了X1X2的特征,就可以通过简单的神经网络(无激活函数),解决异或问题的数据集。如果不进行组合,直接使用了X1和X2,若不借用激活函数是没法解决这个问题的。

在解决实际问题时,应该进行把实际问题对应到平面上不同颜色点的划分,把实际问题中的实体变成平面上的样本点。点的颜色只有两种,说明这个神经网络只能实现二分类的问题。

举一个“零件是否合格”的例子,零件的长度和质量就是它的特征。通过神经网络模型,去判断零件的样本是否合格。

在机器学习中,所有用于描述实体的数字的组合就是一个实体的特征向量(feature vector)。

> 神经网络

神经网络是分层的机构。这里缺省的是两个隐藏层。第一个隐藏层有四个神经元,接收数据输入层的所有节点;第二个隐藏层有两个神经元,接收的就是第一个隐藏层处理完的结果。

网页右边就是OUTPUT(输出层),它以可视化的方式把所有样本点展现出来,比较直观。

当神经网络建好之后,需要设置超参数。包括:学习率、激活函数、正则化(防止神经网络过拟合)、正则化率、问题类型。

正则化可以有两种形式:L1正则化,L2正则化,对应的有一个正则化率。问题类型也有两种可选择:分类问题,回归问题。

当用户把神经网络建好,数据集选好,设置完训练数据比例、噪音、批处理大小之后,就可以开始神经网络的训练了。

> 神经网络训练过程解读

一个小格子代表神经网络中的一个节点,边代表节点之间的连接,节点和边都有或深或浅的颜色,边代表了神经网络的一个参数,可以是任意实数,神经网络就是通过对参数的合理设置来解决分类或者回归问题的。

边的颜色体现了这个参数的取值,颜色越深,绝对值越大。

如果把这个平面当作一个笛卡尔坐标系,这个平面上的每个点就代表了(x1,x2)的一种取值。而这个点的颜色就体现了x1,x2在这种取值下这个节点的输出值。和边类似,当节点的输出值的绝对值越大时,颜色越深(蓝色)。

x1节点的区分平面就是y轴。因为这个节点的输出就是x1本身的值。当x1<0时,这个节点的输出就是负数,而x1>0时输出就是正数。所以y轴左侧都是黄色,右侧都是蓝色。

输出节点除了显示区分平面外,还显示了训练数据。

开始训练需要点击左上角红框中的播放按钮。

点击之后,右边图像很快有了反应。下图就是训练100轮后的结果:

它通过不同的颜色,进行样本点的区分。橙色的区域表示只要样本点落在这个区域就属于橙色的类别,蓝色的区域表示只要样本点落在这个区域就属于蓝色的类别。颜色跟它的值有关,颜色越深,值越大;颜色越浅,值就介于两者之间。若有一个样本点落在右上角,说明它是橙色样本若落在中心部分,说明它是蓝色样本;若落在两者交界处,就不容易判断,有很多噪音点。

上面有一个OUTPUT,显示了损失,通过旁边的曲线可以看到损失率很快就降下来了。

点击播放按钮右边的按钮,可以重置,即恢复初始状态,重新开始训练。如果切换成第四种最复杂的数据集,就会变成下面的结果:

训练了很多轮之后,loss值没有太大的变化,而且也不能很好的区分橙色的点和蓝色的点,说明当前这个神经网络能力不足,哪怕再继续训练,也未必可以得到很好的结果。这时,需要修改神经网络的结构。

在两层隐藏层的中间又加入两层隐藏层,给第一层隐藏层增加到六个神经元,第二层隐藏层增加到四个神经元,第三层隐藏层增加到三个神经元,其他参数不变。

重新训练之后,得到了如下的结果:

Test loss和Training loss分成了两条曲线。

神经网络结构中,边的粗细代表了权值。蓝色的权值是正的,橙色的权值是负的。

这次训练后,样本点不同的颜色基本落在了相应的区域里,说明这个神经网络对训练数据有了比较好的适应性。虽然测试集的损失值比训练集的损失值要高一些,但是loss是无法避免的。

Last updated