如何在张量板上绘制权重直方图?

时间:2018-10-15 08:59:04

标签: python tensorflow histogram tensorboard summary

我有一个train.py和一个model.py用于3D分类深度学习模型。我在model.py中定义模型。在train.py中,我从model.py导入模型并开始训练。

我通过使用train.py中的tf.summary.scalar函数来可视化训练损失或准确性。

但是,当我尝试绘制体重的直方图时遇到了麻烦。 我找到了tf.summary.histogram函数,但是我不知道该函数的位置(在train.py或model.py中?)。

在model.py中,我使用tf.contrib.layers函数定义了图层。 (对不起,我的英语水平很差)

PS
我将模型保存为.ckpt格式。可以通过加载此保存的模型来绘制体重直方图吗?

1 个答案:

答案 0 :(得分:1)

我将尝试分别回答您的每个问题。

  

尝试绘制体重的直方图时遇到麻烦。

理想情况下,您可以使用tf.get_variable定义权重偏差并将它们添加到汇总直方图中。

例如:

with tf.name_scope("layer1"):
    W1 = tf.get_variable("W1", shape=[input_size, hidden_layer_neurons],
                         initializer=tf.contrib.layers.xavier_initializer())
    layer1 = tf.matmul(X, W1)
    layer1_act = tf.nn.tanh(layer1)
    tf.summary.histogram("weights", W1)

如果需要,我们还可以添加图层输出和激活输出的直方图:

    tf.summary.histogram("layer-outputs", layer1)
    tf.summary.histogram("activation-outputs", layer1_act)

但是由于您使用的是tf.contrib.layers,所以您没有这样的规定,因为contrib.layers会为您创建权重和偏见。在这种情况下,您可以查看tf.trainable_variables();它应该包含图中的所有可训练变量,其中包含网络的所有权重和偏差。

您可以定义一个简单的函数,如下所示:

def add_hist(train_vars):
    for i in train_vars:
        name = i.name.split(":")[0]
        value = i.value()
        tf.summary.histogram(name, value)
  

我不知道将此函数放在哪里(在train.py中?   model.py?)

在训练过程中会获得诸如损失和准确性之类的标量摘要,因此这些摘要包含在train.py中;权重和偏差是您核心模型的一部分,因此将包含在model.py

因此,在您使用model.py之前,请在您的tf.summary.merge_all()

train_vars = tf.trainable_variables()
add_hist(train_vars)
  

我可以通过加载此保存的模型绘制体重直方图吗?

这些直方图通常显示训练期间实体的分布(权重或激活等)。这些图通常主要用于洞悉这些分布随时间的变化情况,参数或它们的梯度是否饱和,需要采取的任何明确步骤来改善等。

由于您保存的检查点(.ckpt)仅应包含最终权重和偏差,因此仅获得最终分布,而无法获得整个训练期间的直方图。

希望这会有所帮助。