我正在研究 Google Tensorboard,我对直方图的含义感到困惑。我阅读了教程,但对我来说似乎不清楚。如果有人能帮我弄清楚 Tensorboard Histogram Plot 的每个轴的含义,我真的很感激。
5 回答
我之前遇到过这个问题,同时也在寻找有关如何解释 TensorBoard 中的直方图的信息。对我来说,答案来自绘制已知分布的实验。因此,可以使用以下代码在 TensorFlow 中生成均值 = 0 和 sigma = 1 的传统正态分布:
import tensorflow as tf
cwd = "test_logs"
W1 = tf.Variable(tf.random_normal([200, 10], stddev=1.0))
W2 = tf.Variable(tf.random_normal([200, 10], stddev=0.13))
w1_hist = tf.summary.histogram("weights-stdev_1.0", W1)
w2_hist = tf.summary.histogram("weights-stdev_0.13", W2)
summary_op = tf.summary.merge_all()
init = tf.initialize_all_variables()
sess = tf.Session()
writer = tf.summary.FileWriter(cwd, session.graph)
sess.run(init)
for i in range(2):
writer.add_summary(sess.run(summary_op),i)
writer.flush()
writer.close()
sess.close()
结果如下所示: 。横轴代表时间步长。该图是等高线图,在纵轴值为 -1.5、-1.0、-0.5、0.0、0.5、1.0 和 1.5 处具有等高线。
由于该图表示均值 = 0 且 sigma = 1 的正态分布(记住 sigma 表示标准偏差),0 处的等高线表示样本的平均值。
-0.5 和 +0.5 处的等高线之间的面积代表正态分布曲线下的面积,与平均值相差 +/- 0.5 个标准差,这表明它是采样的 38.3%。
-1.0 和 +1.0 处等高线之间的面积代表正态分布曲线下的面积,该面积在平均值的 +/- 1.0 标准偏差内,表明它是采样的 68.3%。
-1.5 和 +1-.5 处等高线之间的面积代表正态分布曲线下的面积,该面积在平均值的 +/- 1.5 个标准偏差内,表明它是抽样的 86.6%。
最苍白的区域稍微超出平均值的 +/- 4.0 个标准偏差,每 1,000,000 个样本中只有大约 60 个超出此范围。
虽然 Wikipedia 有非常详尽的解释,但您可以在此处获得最相关的信息。
实际的直方图将显示几件事。随着监测值的变化增加或减少,绘图区域的垂直宽度将增加或缩小。随着监测值的平均值增加或减少,这些图也可能向上或向下移动。
(您可能已经注意到,代码实际上生成了标准偏差为 0.13 的第二个直方图。我这样做是为了消除绘图轮廓线和垂直轴刻度线之间的任何混淆。)
@marc_alain,您是为结核病制作如此简单的脚本的明星,很难找到。
添加到他所说的直方图显示权重分布的 1,2,3 sigma。这相当于第 68、95 和 98 个百分位数。所以想想如果你的模型有 784 个权重,直方图会显示这些权重的值如何随着训练而变化。
这些直方图对于浅层模型可能没有那么有趣,您可以想象,对于深层网络,由于逻辑函数饱和,高层的权重可能需要一段时间才能增长。当然,我只是在盲目地模仿 Glorot 和 Bengio 的这篇论文,他们在其中通过训练研究了权重分布,并展示了逻辑函数在很长一段时间内是如何在较高层中饱和的。
在绘制直方图时,我们将bin 限制放在 x 轴上,将计数放在 y 轴上。然而,直方图的全部意义在于显示张量如何随时间变化。因此,正如您可能已经猜到的那样,包含数字 100 和 300 的深度轴(z 轴)显示了历元数。
默认直方图模式为偏移模式。这里每个时期的直方图在 z 轴上偏移一个特定值(以适合图中的所有时期)。这就像从房间天花板的一个角落(准确地说是从天花板前边缘的中点)一个接一个地查看所有直方图。
在叠加模式下,z 轴折叠,直方图变为透明,因此您可以移动并悬停在上方以突出显示与特定时期相对应的那个。这更像是偏移模式的前视图,只有直方图的轮廓。
如此处文档中所述:
tf.summary.histogram 采用任意大小和形状的张量,并将其压缩成一个直方图数据结构,该结构由许多具有宽度和计数的 bin 组成。例如,假设我们要将数字组织
[0.5, 1.1, 1.3, 2.2, 2.9, 2.99]
到 bin 中。我们可以制作三个箱子:
- 一个包含从 0 到 1 的所有内容的 bin(它将包含一个元素,
0.5
),- 一个包含 1-2 中所有内容的 bin(它将包含两个元素
1.1
和1.3
),- 一个包含 2-3 中所有内容的 bin(它将包含三个元素:
2.2
和2.9
)2.99
。
TensorFlow 使用类似的方法来创建 bin,但与我们的示例不同,它不创建整数 bin。对于大型、稀疏的数据集,这可能会导致数千个 bin。相反,这些 bin 呈指数分布,许多 bin 接近于 0,而对于非常大的数字,则相对较少的 bin。然而,可视化指数分布的 bin 是很棘手的。如果使用高度来编码计数,那么较宽的 bin 会占用更多空间,即使它们具有相同数量的元素。相反,区域中的编码计数使高度比较变得不可能。相反,直方图将数据重新采样到统一的 bin 中。在某些情况下,这可能会导致不幸的伪影。
请进一步阅读文档以全面了解直方图选项卡中显示的图。
Roufan,
The histogram plot allows you to plot variables from your graph.
w1 = tf.Variable(tf.zeros([1]),name="a",trainable=True)
tf.histogram_summary("firstLayerWeight",w1)
For the example above the vertical axis would have the units of my w1 variable. The horizontal axis would have units of the step which I think is captured here:
summary_str = sess.run(summary_op, feed_dict=feed_dict)
summary_writer.add_summary(summary_str, **step**)
It may be useful to see this on how to make summaries for the tensorboard.
Don
图表上的每条线代表数据分布中的一个百分位数:例如,底线显示最小值随时间的变化情况,中间的线显示中位数的变化情况。从上到下阅读,这些行具有以下含义:[maximum, 93%, 84%, 69%, 50%, 31%, 16%, 7%, minimum]
这些百分位数也可以看作是正态分布的标准偏差边界:[maximum, μ+1.5σ, μ+σ, μ+0.5σ, μ, μ-0.5σ, μ-σ, μ-1.5σ, minimum]
因此从内到外读取的彩色区域[σ, 2σ, 3σ]
分别具有宽度。