为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

LEATH 2022-08-02 16:51:52
我有两个“子问题”1)我如何用Tensorboard检测消失或爆炸梯度,因为目前根据“拟合#31173的未弃用write_grads”中已弃用?write_grads=TrueTensorboard callback2)我想我可以根据张量板中分布和直方图选项卡中的权重分布和直方图来判断我的模型是否因梯度消失而受到影响。我的问题是,我没有可以比较的参照系。目前,我的偏见似乎是“移动的”,但我无法判断我的内核权重(Conv2D层)是否“移动”/“变化”“足够”。有人可以通过给出一个经验法则来帮助我在Tensorboard中直观地评估这一点吗?也就是说,如果只有内核权重的底部25%百分位在移动,那就足够好了/不够好了吗?或者,也许有人可以从张量板中发布两个消失渐变与非消失渐变的参考图像。以下是我的直方图和分布,是否可以判断我的模型是否遭受梯度消失的影响?(为简洁起见,省略了一些图层)提前致谢。
查看完整描述

1 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

我目前正面临同样的问题,并使用Tensorboard以类似的方式处理了这个问题。


即使不推荐使用,您仍然可以通过子类化并在方法中手动计算梯度来管理网络每一层的梯度。write_gradstf.keras.Modelgradient.Tapetrain_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}

然后,您应该能够可视化训练中任何训练步骤的梯度分布,以及核值的分布。


此外,可能值得尝试绘制规范随时间分布图,而不是单个值。


查看完整回答
反对 回复 2022-08-02
  • 1 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信