如何使用 Tensorboard 检测梯度消失和爆炸?
How to detect vanishing and exploding gradients with Tensorboard?
我有两个"sub-questions"
1) 考虑到目前 write_grads=True
根据 "un-deprecate write_grads
for fit
#31173" 在 Tensorboard callback
中弃用的事实,我如何使用 Tensorboard 检测梯度消失或爆炸?
2) 我想我可以根据 Tensorboard 的“分布”和“直方图”选项卡中的权重分布和直方图判断我的模型是否存在梯度消失问题。我的问题是我没有可以比较的参照系。目前,我的偏见似乎是 "moving",但我无法判断我的内核权重(Conv2D 层)是否是 "moving"/"changing" "enough"。有人可以通过提供经验法则来帮助我在 Tensorboard 中进行视觉评估吗? IE。如果只有底部 25% 的内核权重在移动,那就足够好了/不够好?或者也许有人可以 post 来自 tensorBoard 的两个参考图像,分别是消失梯度和非消失梯度。
这是我的直方图和分布,是否可以判断我的模型是否存在梯度消失? (为简洁起见省略了一些图层)提前致谢。
我目前面临同样的问题,并使用 Tensorboard 类似地解决了这个问题。
即使 write_grads
已被弃用,您仍然可以通过子classing tf.keras.Model
class 并计算梯度来设法记录网络每一层的梯度在 train_step
方法中手动使用 gradient.Tape
。
与此类似的东西对我有用
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}
然后您应该能够可视化训练的任何训练步骤的梯度分布,以及内核值的分布。
此外,可能值得尝试绘制范数随时间的分布而不是单个值。
我有两个"sub-questions"
1) 考虑到目前 write_grads=True
根据 "un-deprecate write_grads
for fit
#31173" 在 Tensorboard callback
中弃用的事实,我如何使用 Tensorboard 检测梯度消失或爆炸?
2) 我想我可以根据 Tensorboard 的“分布”和“直方图”选项卡中的权重分布和直方图判断我的模型是否存在梯度消失问题。我的问题是我没有可以比较的参照系。目前,我的偏见似乎是 "moving",但我无法判断我的内核权重(Conv2D 层)是否是 "moving"/"changing" "enough"。有人可以通过提供经验法则来帮助我在 Tensorboard 中进行视觉评估吗? IE。如果只有底部 25% 的内核权重在移动,那就足够好了/不够好?或者也许有人可以 post 来自 tensorBoard 的两个参考图像,分别是消失梯度和非消失梯度。
这是我的直方图和分布,是否可以判断我的模型是否存在梯度消失? (为简洁起见省略了一些图层)提前致谢。
我目前面临同样的问题,并使用 Tensorboard 类似地解决了这个问题。
即使 write_grads
已被弃用,您仍然可以通过子classing tf.keras.Model
class 并计算梯度来设法记录网络每一层的梯度在 train_step
方法中手动使用 gradient.Tape
。
与此类似的东西对我有用
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}
然后您应该能够可视化训练的任何训练步骤的梯度分布,以及内核值的分布。
此外,可能值得尝试绘制范数随时间的分布而不是单个值。