Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow梯度带;变量不存在梯度”;断断续续地_Python_Tensorflow_Keras - Fatal编程技术网

Python Tensorflow梯度带;变量不存在梯度”;断断续续地

Python Tensorflow梯度带;变量不存在梯度”;断断续续地,python,tensorflow,keras,Python,Tensorflow,Keras,在培训人际网络时,我偶尔会遇到以下警告: W0722 11:47:35.101842 140641577297728优化器_v2.py:928]在最小化损失时,变量['model/conv1d_x/Variable:0']不存在梯度。 这种情况偶尔发生(可能每20个成功步骤中发生一次)。我的模型基本上有两条路径,它们在网络中的不同位置连接在一起。为了说明这一点,这里有一个简单的例子来说明我的意思 class myModel(tf.keras.Model): def __init__(se

在培训人际网络时,我偶尔会遇到以下警告:

W0722 11:47:35.101842 140641577297728优化器_v2.py:928]在最小化损失时,变量['model/conv1d_x/Variable:0']不存在梯度。

这种情况偶尔发生(可能每20个成功步骤中发生一次)。我的模型基本上有两条路径,它们在网络中的不同位置连接在一起。为了说明这一点,这里有一个简单的例子来说明我的意思

class myModel(tf.keras.Model):

  def __init__(self):

    self.conv1 = Conv2D(32)
    self.conv2 = Conv2D(32)
    self.conv3 = Conv2D(16)

  def call(self, inputs):

    net1 = self.conv1(inputs)
    net2 = self.conv2(inputs)
    net = tf.concat([net1, net2], axis=2)
    net = self.conv3(net)
    end_points = tf.nn.softmax(net)

model = myModel()

with tf.GradientTape() as tape:

  predicition = model(image)
  loss = myloss(labels, prediction)

gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
实际上,我的网络要大得多,但通常没有梯度的变量往往是网络顶部的变量。在每个
Conv2D
层之前,我还有一个自定义渐变。有时当我看到错误出现时,我会注意到该层的梯度函数没有被调用

我的问题是,当梯度磁带在我的网络中反向传播时,它有时怎么会采取看起来不同的路径呢。我的第二个问题是,这是由于通过我的网络有两条不同的路由(即conv1和conv2)造成的。这种网络架构是否存在根本缺陷


理想情况下,我可以为
GradientTape()
定义它必须找到每个顶层的渐变吗

我遇到了一个类似的问题-可能有帮助,也可能不确定,这取决于你的网络的实际外观,但基本上,我有一个多输出网络,我意识到,当我分别应用与输出相对应的梯度时,每一个单独的损失都有一个梯度为零的网络分支,但这是完全有效的,并且每次都对应于非目标输出之前的终端层。出于这个原因,我最终用tf.zeros_类替换了任何无梯度,这样就可以继续训练了。如果网络中的多个输入头始终位于图表顶部,您是否也会遇到同样的问题

(非政府组织解决方案)ễ下面的n Thu是我在上面描述的代码版本-与我处理它的方式完全相同)


我见过其他答案,其中梯度没有计算,因为默认情况下张量不受关注-您必须添加它们,但这似乎不是您的问题,因为您应该只处理model.trainable_变量,或者,您的myLoss函数偶尔会根据批次组成获得NaN结果或强制转换到numpy数组,这可以解释零星的性质(例如,如果您的数据非常不平衡,可能是在没有少数类实例的批次上?

我也有同样的问题。找到了具有自定义渐变的解决方案

  def _compute_gradients(tensor, var_list):
      grads = tf.gradients(tensor, var_list)
  return [grad if grad is not None else tf.zeros_like(var)
      for var, grad in zip(var_list, grads)]

我也遇到了同样的错误。这是因为我在
tape.gradient()
函数中给出了错误的可训练变量。如果它能帮助某人

在我的示例中,
self.encoder\u model.get\u trainable\u variables()
没有返回正确的变量:

@tf.function
def train_step(x_batch):
    with tf.GradientTape() as tape:
        loss = self.encoder_model.loss.compute_loss(x_batch)
    gradients = tape.gradient(loss, self.encoder_model.get_trainable_variables())
    self.optimizer.apply_gradients(zip(gradients, self.encoder_model.get_trainable_variables()))

如果预期缺少渐变,可通过以下方式抑制此警告:


您好D.Griffiths,根据您指定的代码和您给出的解释,我们无法重现您的错误。您能分享完整的代码吗(虚拟代码,它代表您的架构和自定义渐变应该足够了),这样我们就可以尝试重现错误并努力解决它。谢谢。嗨,重现这个问题的代码将是我的整个网络,它相当大,包含自定义操作和特定数据等。我不相信这是TF代码的错误。我更关心的是,对于某些间歇性导致抛出错误的变量,哪些情况下梯度不存在。例如,可能出现零除是正常的,或者这是我应该担心的(甚至是我这边的一个bug)。它还在发生吗?我只是遇到了一个类似的问题,我总是收到警告。我的代码不同。基本上,在自定义类的build函数中,我添加了一个权重并覆盖了对它的引用。通过避免警告消失。但你的情况似乎并不相似;损失函数的问题确实是我的情况。谢谢
optimizer.apply_gradients(
    (grad, var) 
    for (grad, var) in zip(gradients, model.trainable_variables) 
    if grad is not None
)