python - 如何使用 Tensorboard 检测消失和爆炸梯度?

标签 python tensorflow machine-learning deep-learning tensorboard

我有两个“子问题”

1) 鉴于当前 write_grads=True 的事实,我如何使用 Tensorboard 检测消失或爆炸梯度在 Tensorboard callback 中已弃用根据 "un-deprecate write_grads for fit #31173" ?

2) 我想我大概可以根据 Tensorboard 的 Distributions and Histograms 选项卡中的权重分布和直方图判断我的模型是否遭受梯度消失的影响。我的问题是我没有可以比较的引用框架。目前,我的偏差似乎在“移动”,但我不知道我的内核权重(Conv2D 层)是否“移动”/“改变”“足够”。有人可以通过经验法则在 Tensorboard 中直观地评估这一点来帮助我吗? IE。如果只有底部 25% 的谷粒权重在移动,这是否足够好/不够好?或者也许有人可以从 tensorBoard 的消失梯度与非消失梯度中发布两个引用图像。

这是我的直方图和分布,是否可以判断我的模型是否存在梯度消失? (为简洁起见省略了一些层)提前致谢。

enter image description here

enter image description here

enter image description here

enter image description here
enter image description here

最佳答案

我目前面临同样的问题,并使用 Tensorboard 类似地解决了这个问题。
即使是write_grads已弃用,您仍然可以通过对 tf.keras.Model 进行子类化来管理网络每一层的梯度使用 gradient.Tape 手动分类和计算梯度在 train_step方法。
类似的东西对我有用

from tensorflow.keras import Model

class TrainWithCustomLogsModel(Model):

    def __init__(self, **kwargs):
        super(TrainWithCustomLogsModel, self).__init__(**kwargs)
        self.step = tf.Variable(0, dtype=tf.int64,trainable=False)

    def train_step(self, data):

        # Get batch images and labels
        x, y = data
        
        # Compute the batch loss
        with tf.GradientTape() as tape:
            p = self(x , training = True)
            loss = self.compiled_loss(y, p, regularization_losses=self.losses)
        
        # Compute gradients for each weight of the network. Note trainable_vars and gradients are list of tensors
        trainable_vars = self.trainable_variables
        gradients = tape.gradient(loss, trainable_vars)

        # Log gradients in Tensorboard
        self.step.assign_add(tf.constant(1, dtype=tf.int64))
        #tf.print(self.step)
        with train_summary_writer.as_default():
          for var, grad in zip(trainable_vars, gradients):
            name = var.name
            var, grad = tf.squeeze(var), tf.squeeze(grad)
            tf.summary.histogram(name, var, step = self.step)
            tf.summary.histogram('Gradients_'+name, grad, step = self.step)
    
        # Update model's weights
        self.optimizer.apply_gradients(zip(gradients, trainable_vars))
        del tape
        # Update metrics (includes the metric that tracks the loss)
        self.compiled_metrics.update_state(y, p)
        # Return a dict mapping metric names to current value
        return {m.name: m.result() for m in self.metrics}
然后,您应该能够将训练的任何训练步骤的梯度分布以及内核值的分布可视化。
此外,可能值得尝试绘制规范随时间的分布而不是单个值。

关于python - 如何使用 Tensorboard 检测消失和爆炸梯度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60291619/

相关文章:

tensorflow - 是否有 dnnlib : additional lib in projects of NVlabs? 的任何文档

java - 用于在稀疏机器学习中生成 uint64 或 uint32 特征 id 的良好哈希函数

algorithm - 梯度下降算法在matlab中给出错误答案

python - 使用 lambda 访问列表中字典的值

python - 预测模型的 swagger.json 示例 json 似乎没有返回预测

python - Keras的evaluate_generator准确率高,但各个类别的准确率较低

python - 预期密集输入具有形状 (7,),但得到形状为 (1,) 的数组

machine-learning - 概率分布中的 argmax 比 softmax 中的随机采样更好的策略?

python - 如何编写一个每次运行都给出相同输出的 Python 程序?

python - 为什么 Pandas 整数 `dtypes` 在 Unix 和 Windows 上的行为不同?