如何使用张量板检测消失和爆炸梯度?

我有两个“子问题”

1)我如何用Tensorboard检测消失或爆炸梯度,因为目前根据拟合#31173的未弃用write_grads”中已弃用write_grads=TrueTensorboard callback

2)我想我可以根据张量板中分布和直方图选项卡中的权重分布和直方图来判断我的模型是否因梯度消失而受到影响。我的问题是,我没有可以比较的参照系。目前,我的偏见似乎是“移动的”,但我无法判断我的内核权重(Conv2D层)是否“移动”/“变化”“足够”。有人可以通过给出一个经验法则来帮助我在Tensorboard中直观地评估这一点吗?也就是说,如果只有内核权重的底部25%百分位在移动,那就足够好了/不够好了吗?或者,也许有人可以从张量板中发布两个消失渐变与非消失渐变的参考图像。

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

http://img3.mukewang.com/62e8e5c50001475206570777.jpg

LEATH
浏览 164回答 1
1回答

慕侠2389804

我目前正面临同样的问题,并使用Tensorboard以类似的方式处理了这个问题。即使不推荐使用,您仍然可以通过子类化并在方法中手动计算梯度来管理网络每一层的梯度。write_gradstf.keras.Modelgradient.Tapetrain_step与此类似的东西对我有用from tensorflow.keras import Modelclass 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}然后,您应该能够可视化训练中任何训练步骤的梯度分布,以及核值的分布。此外,可能值得尝试绘制规范随时间分布图,而不是单个值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python