我有一个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)没有提供梯度。在
任何帮助都将不胜感激。在
有几个原因可以解释为什么你会犯这个错误。如果不实际看到原始代码,可能很难调试,但至少有两个原因没有提供渐变:
有一些张量流操作,通过这些操作梯度不能流动或反向传播不能发生。例如}等等。在你链接的帖子中,有一条评论提到了this。因此,在您提供的示例中,
tf.cast
或{tf.cast
肯定会导致问题。在可能发生这种情况的第二个原因是,当您试图通过使用未在这些变量上计算的损失来优化变量时。例如,如果您计算了第一个流程中conv1变量的损失,然后在第二个流程中计算了损失,则尝试更新/优化conv2变量。这将不起作用,因为将为conv1变量而不是conv2计算梯度。
在你的情况下,这很可能是第一个问题,而不是第二个问题。在
相关问题 更多 >
编程相关推荐