首页 > 解决方案 > TensorFlow从1升级到2,突然出现“没有为任何变量提供梯度”

问题描述

我的主要问题是,当损失函数没有改变时,升级如何导致“没有为任何变量提供梯度”错误?

我正在将代码库从 TensorFlow 1 升级到 TensorFlow 2。我已经升级了包,并tensorflow.compat.v1在过渡期间使用,并且不时切换。(另外值得一提的是,我没有写原始代码,对TensorFlow也不是很熟悉,所以答案可能很简单。)

该代码使用一个优化器;

tf.compat.v1.train.AdamOptimizer(learning_rate=learning_rate, use_locking=True)

我认为我可以通过用新的类名替换它来简单地升级这部分;

tf.keras.optimizers.Adam(learning_rate=learning_rate)

但很可惜,这行不通!当代码去使用优化器时;

optimizer.minimize(loss)

我遇到了一些问题。一是,由于不再有惰性求值,损失函数必须是 lambda。这很容易解决;

optimizer.minimize(lambda: loss)

但是,我明白了minimize() missing 1 required positional argument: 'var_list'。但是我原来的 tf 1 调用没有传入变量,那么我现在怎么需要传入它们呢?我尝试var_list=None,这会引发另一个错误。然后我尝试var_list=[],它实际上运行,但结果完全不同,所以我确定它是错误的。然后我发现如果你不在 tf 1 中传递 vars,它默认使用tf.compat.v1.trainable_variables(). 所以我在调用之前使用 pdb 调用该函数minimize,发现它确实返回了一个变量,称为A_control. 那我试试;

optimizer.minimize(lambda: loss, var_list=[A_control])

但这给了我同样的“没有提供渐变”错误。

经过一段时间的调试失败后,我决定尝试将代码库的其余部分从 tf 1 升级。我更改了代码流以考虑急切的评估,我删除了所有会话的使用,我替换了所有其他的使用,tf.compat.v1并且没有-更需要的方法。

在多次调试迭代中运行代码后,我终于开始执行optimizer.minimize并且仍然得到错误;

ValueError: No gradients provided for any variable: ['A_control:0'].

那么有什么关系呢?相同的损失函数怎么可能在之前但之后没有梯度?而且,如果我必须手动更改它,我该如何确定我必须更改的部分?

标签: pythontensorflowtensorflow2.0upgrade

解决方案


推荐阅读