作为TensorFlow
的一项极其亮眼的功能,TensorBoard
给我们提供了极其方便而强大的可视化环境。它可以帮助我们理解整个神经网络的学习过程、数据的分布、性能瓶颈等等。
当我们要对模型的正确率、loss
值、学习速度等标量进行可视化时,经常会用到折线图。
上面是在训练MNIST
文字识别模型时,对各阶段的日志记录进行可视化后所得到的折线图(左侧是测试集,右侧是训练集),可以看到loss
值在逐步减少,模型的学习正在往好的方向发展。
下面是以及其友好的方式展示MNIST
的训练集数据的示例截图。
在我们要进行Data Augmentation
之前,十分有必要进行数据验证和数据清洗,此时TensorBoard
就能给我们带来不少的便利。
与展示图像类似,这项功能在数据验证和清洗时十分有用,甚至可以进行音量的调节和音频的下载。
当我们想知道神经网络各层的权重和偏移量的初始值,以及它们在各阶段是如何发生变化的,从而确认到底有没有发生梯度消失的“悲剧”,可以利用这项功能。
如果我们想直观地观察神经网络的结构,从而帮助我们定位模型的性能瓶颈所在,可以像下面这样做。
下面是利用t-SNE
算法对MNIST
的图像数据进行降维处理后得到的大致分布图。
首先介绍TensorBoard
中各个记号到底代表什么意思
记号 | 含义 |
---|---|
某个name scope内部的所有节点,双击可以看到内部详情 | |
不连续的节点序列 | |
单个节点(变量) | |
单个节点(常量) | |
统计信息summary节点 | |
各操作间的数据流 | |
各操作间的控制流 | |
输入张量转换节点的引用 |
随着神经网络越发复杂,节点数量会发生爆炸式增长,这时候使用多层name scope
把它们进行管理相当有必要,尤其是在调参和debug
阶段。
下面这幅图可以清晰地展示name scope
在TensorBoard
发挥的巨大作用:
编程写法也相当简单:
with tf.name_scope('loss'):
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labels))
tf.summary.scalar('loss', loss)
那么,最终计算并输出的loss
的完整名称就为loss/loss
。
Device View
表示的是各个阶段GPU
和CPU
的占用情况,如下图所示,绿色的是GPU
,蓝色的是CPU
。
如下图所示,左边的是内存使用率情况,右边的是计算资源使用率情况,他们的值越高,图的颜色就越深。
于是,我们就可以得知cross_entropy
节点对于内存的消耗并不高,但是却十分考验硬件的计算能力。
编程写法十分简单明了,对tf.FileWriter
添加tf.RunMetadata
即可:
run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
run_metadata = tf.RunMetadata()
summary, _ = sess.run([merged, train_step],
feed_dict={x: ..., y: ...},
options=run_options,
run_metadata=run_metadata)
train_writer.add_run_metadata(run_metadata, 'step%03d' % i)
train_writer.add_summary(summary, i)
仔细观察计算图中连接各节点的边,就可以发现上面写着有对应Tensor
的维度。
如下图,我们可以确认卷积神经网络的Convolution
层和Pooling
层的参数数量到底是否正确。
tf.summary.scalar('loss', loss)
这里,第一参数时标量名,第二参数是标量值
tf.summary.histogram('bias', bias)
tf.summary.image('preprocess', tf.reshape(images, [-1, 28, 28, 1]), 10)
这里解释一下第二参数的含义,reshape
里面的四个参数分别代表[图像数, 每幅图的高度, 每幅图的宽度, 每幅图的通道数],-1
表示根据实际数据(在这里是images
)进行动态计算,上面的10
表示最多展示十幅图。
tf.summary.audio('audio', audio, sampling_frequency)
audio
是一个三维或者二维tensor
,含义是[音频数, 每个音频的帧数, 每个音频的通道数]或者[音频数, 每个音频的帧数]。
sampling_frequency
从名字就可以看出来了,就是音频的采样率