全部,
当您训练具有大量样本的大型模型时,某些样本在参数更新时可能会导致 NaN 梯度。
我想找到这些样本。同时我不希望这批样本的梯度更新模型的参数,因为这可能会导致模型的参数为NaN。
那么有人有解决这个问题的好主意吗?
我的代码如下:
# Create an optimizer.
params = tf.trainable_variables()
opt = tf.train.AdamOptimizer(1e-3)
gradients = tf.gradients(self.loss, params)
max_gradient_norm = 10
clipped_gradients, self.gradient_norms = tf.clip_by_global_norm(gradients,
max_gradient_norm)
self.optimizer = opt.apply_gradients(zip(clipped_gradients, params))
最佳答案
您可以通过tf.check_numerics
检查渐变是否为NaN:
grad_check = tf.check_numerics(clipped_gradients)
with tf.control_dependencies([grad_check]):
self.optimizer = opt.apply_gradients(zip(clipped_gradients, params))
如果 Clipped_gradients 为 NaN 或无穷大,grad_check
将抛出 InvalidArgument
。
tf.control_dependency
确保在应用渐变之前评估 grad_check
。
另请参阅tf.add_check_numerics_ops()
。
关于machine-learning - 更新时如何检查 Tensorflow 中梯度的 NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40701712/