我有一个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
格式。可以通过加载此保存的模型来绘制体重直方图吗?
答案 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)仅应包含最终权重和偏差,因此仅获得最终分布,而无法获得整个训练期间的直方图。
希望这会有所帮助。