Python 将TensorFlow从1升级到2,突然得到;没有为任何变量提供梯度“;

Python 将TensorFlow从1升级到2,突然得到;没有为任何变量提供梯度“;,python,tensorflow,tensorflow2.0,upgrade,Python,Tensorflow,Tensorflow2.0,Upgrade,我的主要问题是,当损失函数没有改变时,升级怎么会导致“没有为任何变量提供梯度”错误? 我正在将代码库从TensorFlow 1升级到TensorFlow 2。我已经升级了这个包,并且在转换期间使用了tensorflow.compat.v1,并且每次切换一点。(还值得一提的是,我没有编写原始代码,而且我对TensorFlow不太熟悉,因此答案可能很简单。) 代码使用一个优化器 tf.compat.v1.train.AdamOptimizer(learning_rate=learning_rate,

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

我正在将代码库从TensorFlow 1升级到TensorFlow 2。我已经升级了这个包,并且在转换期间使用了
tensorflow.compat.v1
,并且每次切换一点。(还值得一提的是,我没有编写原始代码,而且我对TensorFlow不太熟悉,因此答案可能很简单。)

代码使用一个优化器

tf.compat.v1.train.AdamOptimizer(learning_rate=learning_rate, use_locking=True)
optimizer.minimize(loss)
我想我可以通过用新的类名替换它来升级这个部分

tf.keras.optimizers.Adam(learning_rate=learning_rate)
但是,唉,这是行不通的!当代码使用优化器时

tf.compat.v1.train.AdamOptimizer(learning_rate=learning_rate, use_locking=True)
optimizer.minimize(loss)
我遇到了一些问题。一个是,由于没有更多的惰性计算,损失函数必须是lambda。这很容易解决

optimizer.minimize(lambda: loss)
但是,我得到
minimize()缺少1个必需的位置参数:“var\u list”
。但是我最初的TF1调用没有传入变量,所以我现在怎么需要传入它们呢?我尝试
var\u list=None
,这会引发另一个错误。然后我尝试
var\u list=[]
,它实际运行,但结果完全不同,因此我确信它是错误的。然后我发现,如果不在tf1中传递vars,它默认使用
tf.compat.v1.trainable\u variables()
返回的任何内容。因此,我使用pdb在调用
minimize
之前调用该函数,发现它确实返回了一个变量,名为
a\u control
。于是我尝试

optimizer.minimize(lambda: loss, var_list=[A_control])
但这给了我同样的“不提供梯度”错误

在一段时间的调试失败后,我决定尝试将代码库的其余部分从TF1升级。我更改代码流以考虑急切的求值,删除会话的所有使用,替换
tf.compat.v1
的所有其他使用,不再需要方法

在多次调试迭代中运行代码后,我终于开始执行
优化器。最小化
仍然获取错误

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

那怎么办?同一损失函数怎么可能在之前而不是之后有梯度?而且,如果我必须手动更改它,我如何确定我必须更改的部分?

最有可能的情况是,原始代码构建了图形,然后在会话中运行它。TF2在默认情况下使用了即时执行,在某些情况下,这两种方法的语法可能会非常不同。