我有一个CNN架构,由一些层组成 - 卷积,完全连接和解卷积 - (用第一个过程称为)。最后一个反卷积层给出了作为输出的点,我需要使用此输出进行一些处理(使用第二个进程调用它)以获得Loss
值。
在第二个流程中,我正在使用tf.while_loop
来计算Loss
值,因为Loss
值是通过添加所有{{}来实现的。 1}}来自Loss
中每次迭代的值。在循环之前,我为tf.while_loop
初始化提供了tf.constant(0)
。
当我尝试训练并最小化Loss
时,它会向我显示第一个过程和的输出之间没有提供渐变的错误损失张量。
第二个流程如下所示:
Loss
我还在第二个流程中进行了一些处理(我从许多帖子中读到,尤其是here)不提供渐变。
任何帮助都会非常感激。
答案 0 :(得分:0)
有几个原因可以解决您的错误。如果没有真正看到原始代码,可能很难调试,但至少有两个原因可以解释为什么没有提供渐变:
存在一些张量流操作,梯度不能流动或不能发生反向传播。例如tf.cast
或tf.assign
等。在您关联的帖子中,有一条提及this的评论。因此,在您提供tf.cast
的示例中肯定会导致问题。
可能出现这种情况的第二个原因是当您尝试使用未在这些变量上计算的损失来优化变量时。例如,如果您在 conv1 变量上计算了第一个流程中的损失,然后在第二个流程中计算了损失,则尝试更新/优化 conv2 变量。这不起作用,因为渐变将计算 conv1 变量而不是 conv2 。
看起来在你的情况下,它很可能是第一个问题,而不是第二个问题。