没有为任何变量提供渐变来增加tf.while_loop

时间:2018-05-24 14:22:48

标签: python tensorflow optimization while-loop

我有一个CNN架构,由一些层组成 - 卷积,完全连接和解卷积 - (用第一个过程称为)。最后一个反卷积层给出了作为输出的点,我需要使用此输出进行一些处理(使用第二个进程调用它)以获得Loss值。

第二个流程中,我正在使用tf.while_loop来计算Loss值,因为Loss值是通过添加所有{{}来实现的。 1}}来自Loss中每次迭代的值。在循环之前,我为tf.while_loop初始化提供了tf.constant(0)

当我尝试训练并最小化Loss时,它会向我显示第一个过程的输出之间没有提供渐变的错误损失张量

第二个流程如下所示:

Loss

我还在第二个流程中进行了一些处理(我从许多帖子中读到,尤其是here)不提供渐变。

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

有几个原因可以解决您的错误。如果没有真正看到原始代码,可能很难调试,但至少有两个原因可以解释为什么没有提供渐变:

  1. 存在一些张量流操作,梯度不能流动或不能发生反向传播。例如tf.casttf.assign等。在您关联的帖子中,有一条提及this的评论。因此,在您提供tf.cast的示例中肯定会导致问题。

    • 解决此问题的方法是重构代码,使您不使用不允许渐变通过它们的张量流操作。
  2. 可能出现这种情况的第二个原因是当您尝试使用未在这些变量上计算的损失来优化变量时。例如,如果您在 conv1 变量上计算了第一个流程中的损失,然后在第二个流程中计算了损失,则尝试更新/优化 conv2 变量。这不起作用,因为渐变将计算 conv1 变量而不是 conv2

  3. 看起来在你的情况下,它很可能是第一个问题,而不是第二个问题。