没有为增加内部损失值的任何变量提供梯度tf.while_循环

2024-03-28 19:36:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个CNN架构,由一些层组成——卷积层、完全连接层和反褶积层(称之为第一个过程)。最后一个反褶积层将点作为输出,我需要用这个输出进行一些处理(用第二个过程)来获得Loss值。在

第二个过程中,我执行tf.while_loop来计算Loss值,因为{}值是通过将tf.while_loop中每次迭代的所有Loss值相加来实现的。在循环之前,我给了tf.constant(0)初始化Loss。在

当我试图训练并最小化Loss时,它向我展示了第一个过程的输出和损失张量之间的没有梯度的误差。在

第二个过程如下所示:

loss = tf.constant(0)
i = tf.constant(0)

def cond(i, loss):
    return tf.less(i, tf.size(xy))

def body(i, loss):
    # xy is the output from the first process
    xy = tf.cast(xy, tf.float32)
    x = tf.reduce_mean(xy) 
    loss = tf.add(loss, x)
    return [tf.add(i,1), loss]
r = tf.while_loop(cond, body, [i, loss])

optimizer.minimize(r[1])

我还在第二个进程中做了一些处理(我读过很多文章,特别是here)没有提供梯度。在

任何帮助都将不胜感激。在


Tags: theloopreturn过程tfdefbody梯度
1条回答
网友
1楼 · 发布于 2024-03-28 19:36:43

有几个原因可以解释为什么你会犯这个错误。如果不实际看到原始代码,可能很难调试,但至少有两个原因没有提供渐变:

  1. 有一些张量流操作,通过这些操作梯度不能流动或反向传播不能发生。例如tf.cast或{}等等。在你链接的帖子中,有一条评论提到了this。因此,在您提供的示例中,tf.cast肯定会导致问题。在

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

在你的情况下,这很可能是第一个问题,而不是第二个问题。在

相关问题 更多 >