Python 3.x TensorFlow:清除累积梯度中的NaN

Python 3.x TensorFlow:清除累积梯度中的NaN,python-3.x,tensorflow,deep-learning,Python 3.x,Tensorflow,Deep Learning,对于函数近似问题,我试图累积梯度,但我发现有时这些梯度中的一些是nan(即未定义的),即使损失总是真实的。我认为这可能是由于数值不稳定性,我基本上是在寻找一种简单的方法,从计算的梯度中去除NAN 从开始,我尝试了以下操作: # Optimizer definition - nothing different from any classical example opt = tf.train.AdamOptimizer() ## Retrieve all trainable variables

对于函数近似问题,我试图累积梯度,但我发现有时这些梯度中的一些是nan(即未定义的),即使损失总是真实的。我认为这可能是由于数值不稳定性,我基本上是在寻找一种简单的方法,从计算的梯度中去除NAN

从开始,我尝试了以下操作:

# Optimizer definition - nothing different from any classical example
opt = tf.train.AdamOptimizer()

## Retrieve all trainable variables you defined in your graph
tvs = tf.trainable_variables()
## Creation of a list of variables with the same shape as the trainable ones
# initialized with 0s
accum_vars = [tf.Variable(tf.zeros_like(tv.initialized_value()), trainable=False) for tv in tvs]
zero_ops = [tv.assign(tf.zeros_like(tv)) for tv in accum_vars]

## Calls the compute_gradients function of the optimizer to obtain... the list of gradients
gvs_ = opt.compute_gradients(rmse, tvs)

gvs =tf.where(tf.is_nan(gvs_), tf.zeros_like(gvs_), gvs_)

## Adds to each element from the list you initialized earlier with zeros its gradient (works because accum_vars and gvs are in the same order)
accum_ops = [accum_vars[i].assign_add(gv[0]) for i, gv in enumerate(gvs)]

## Define the training step (part with variable value update)
train_step = opt.apply_gradients([(accum_vars[i], gv[1]) for i, gv in enumerate(gvs)])
因此,基本上,关键思想是这一行:

gvs =tf.where(tf.is_nan(gvs_), tf.zeros_like(gvs_), gvs_)
但当我应用这个想法时,我得到了以下错误:

ValueError:尝试将“x”转换为张量,但失败。错误: 两种形状中的尺寸1必须相等,但分别为30和9。形状是 [2,30]和[2,9]。将形状2与其他形状合并。对于 带有输入形状[2,9,30]、[2,30,9]的“IsNan/packed”(op:“Pack”), [2,30],[2,9]


compute_gradients
返回案例中的张量列表。您可能需要执行以下操作:

gvs_ = [(tf.where(tf.is_nan(grad), tf.zeros_like(grad), grad), val) for grad,val in gvs_]

谢谢你的回答,看来这也解决了我的问题。你能解释一下这个问题吗?另外,您能否告知这是否对最终优化有任何影响?Thanks基本上所有nan都映射为零。你应该避免南斯,首先需要检查它为什么会发生。是的,我知道你在这里做什么,但理论上这样做正确吗?在
compute_gradients
函数中生成NAN。为了找到确切的原因,我必须深入研究这个函数,对吗?