1.6 TensorBoard可视化
当训练一个复杂的神经网络时,经常要根据实际情况来调整网络结构。例如,我们会在训练过程中,根据训练集的准确率和验证集的准确率,判断训练是否出现过拟合的现象,或者查看训练过程中损失函数的损失值变化情况。一般情况下,我们可以将这些数据打印到日志文件里,来观察训练过程中的中间状态和信息,但是当信息比较多的时候,这并不直观。
当网络图的结构比较复杂时,是否可以不去阅读代码就能知道网络结构?是否可以将图的结构以可视化方式展示出来?
TensorFlow提供了一套叫TensorBoard的工具来可视化这些数据,帮助我们更好地理解、调试、优化神经网络训练。
1.6.1 在TensorBoard中查看图结构
当计算越来越复杂时,通过阅读代码的方式来理解图的结构并不方便,TensorFlow提供了TensorBoard工具来可视化我们构造的计算图。
下面我们构造一个简单的计算图,然后通过TensorBoard来查看结构图。将图结构记录到文件中的演示如例1-4所示。
【例1-4】将图结构记录到文件中的演示。
运行代码后,进到放置calc_graph的文件夹下,输入:
运行程序,得到的结果如图1-7所示。
图1-7 浏览器地址
打开图1-7中的浏览器地址http://DESKTOP-3SOJDIK:6006,便可以查看保存的图结构,如图1-8所示。
图1-8 通过TensorBoard查看图结构示意图
在图1-8的结构中可以看到,一个名为input的常量和一个名为weight的变量相乘后,还会再与一个名为bias的变量相加(定义一个操作时,给操作的name参数赋值,会在这里显示出来)。当鼠标光标放到weight和bias上时,会出现可以点开的“+”按钮,单击该按钮后,里面有4个操作,这是因为一个变量包含4个操作,单击其中任意一个操作,在右边可以看到这个操作的详细信息,如图1-9所示。
图1-9 通过TensorBoard查看变量的内部结构
1.6.2 数据变化趋势
有时候我们想知道训练过程中一些数据的变化趋势,如损失值是否越来越小,准确率是不是越来越高?此时就需要将训练过程中产生的一些中间数据用图形化的方式展示出来,并且能够很方便地查看某项数值的变化趋势。要实现这个功能,需要先将数据记录到event文件中,然后使用TensorBoard工具打开保存的event文件,再进行图形化展示。
那么,如何收集这些记录数据呢?首先,收集记录数据也是一种操作。我们在定义图的结构时,将数据收集的操作放到计算图中;然后,在会话中执行收集数据操作时,就会将数据写入event文件中。
这里通过例1-5来演示如何收集训练过程中的数据,并且利用TensorBoard工具图展示出来。
【例1-5】一个简单的梯度下降例子。
训练数据通过①、②代码产生。这段代码产生1之内的随机数train_x,以及大致符合2*train_x+np.random.randn(1)*0.01+10分布的train_y。
实现收集训练过程中的Tensor数据功能的代码如下:
其中,第一个参数name是一个字符串,在通过TensorBoard展示的时候作为图表的名称,第二个参数Tensor是我们要记录数据的张量。
因为可能同时要收集很多项的数据,TensorFlow提供了一个将所有收集数据的操作整合起来的操作tf.summary.merge_all(),这样我们在执行操作的时候,只需要执行这一个操作就可以了。
在会话中执行操作的时候,我们同时执行了train_op和merged_summary,相当于训练了一次网络,并且收集了一次当前状态下的weight、loss的值并放入summary中。随着训练不断执行,收集到的数据的值也在不断变化。每次在得到要收集的数据之后,我们通过add_summary操作将event数据存放到FileWriter对象的缓存中,而何时将缓存数据写入硬盘的event文件中,由FileWriter对象控制。
add_summary的第二个参数是step,表示当前的数据是第几步生成的,在通过TensorBoard展示数据的时候,代表的是横坐标的值。虽然第二个参数step是可选的,但是建议这里传入一个表示当前步数的参数。
执行代码后,会将数据保存在log_graph文件夹下。再次通过TensorBoard工具展示数据:
然后在浏览器中输入命令行中提示的地址:http://DESKTOP-3SOJDIK:6006,TensorBoard展示数据的变化过程图如图1-10所示。
图1-10 TensorBoard展示数据的变化过程图
图1-10中的横坐标表示的是时间步骤,也就是summary_writer.add_summary (summary,step)中step的值,纵坐标分别是循环执行过程中每次bias、loss和weight的值。可以看到,随着训练过程进行,weight的值越来越接近2,bias的值越来越接近10,loss的值越来越接近0,说明这个“模型”满足数据分布。